基于php+shell的发布系统

一.发布系统要解决的问题

  一个比较完善的发布系统首先肯定是要能发布文件,其次当发布出现问题时要能支持撤销,避免长时间无法解决问题影响产品的正常运营。
对于发布脚本语言如PHP,shell加入语法检查,有语法错误阻止本次发布。

二.原理

  我们正在使用的发布系统基于PHP+shell开发,发布的时候填好文件列表,从当前机器A发布到目标机器B,发布之前A机器通过ssh协议认证登陆到B机器执行shell命令备份待发布的文件列表
然后使用rsync从A机器同步文件列表到B机器,发布完成后写入当前发布记录到数据库,当需要回滚的时候将对应的备份文件覆盖到B机器即可。

三.要解决的问题

1.使用rsync以及备份目标机器文件需要免密登陆

  A机器到B机器实现免密登陆,需要使用ssh-keygen生成当前用户的登陆秘钥,把当前用户的公钥追加到目标机器用户的 .ssh/authorized_keys文件中
以下shell是把当前机器的公钥追加到目标机器的authorized_keys文件

USER=www
IP=192.168.1.100 #B机器ip
PORT=22 #B机器SSH协议端口
cat /home/${USER}/.ssh/id_rsa.pub | ssh ${USER}@{IP} ‘cat>>/home/{$USER}/.ssh/authorized_keys‘

后续无需输入密码即可在A机器免密登陆B机器

2.发布到多台机器
  如果目标机器有多台,可以循环发布到目标机器。如果每次更新的文件过大,可以发布到一台中心节点服务器,然后使用sersync同步到其它机器。https://code.google.com/archive/p/sersync/downloads
修改config.xml rsync节点<ssh start="true"/>,并使用免密登陆的用户启动sersync服务

#!/bin/bash
#-------------------------------------------------------------------------------------------------------
#从当前机器发布文件到远程机器,如果是分布式机器,以一台机器为主节点通过sersync同步到其它节点
#
#
#参数说明
#    发布
#$1:执行动作send
#$2:远程目标机器ip
#$3:远程目标机器端口
#$4:当前机器发布根目录
#$5:远程目标机器发布根目录
#$6:远程目标机器备份根目录
#$7:发布版本号
#$8:文件列表 多个文件或者目录使用","隔开

#
#
#    回滚
#$1:执行动作roll
#$2:远程目标机器ip
#$3:远程目标机器端口
#$4:当前机器发布根目录
#$5:远程目标机器发布根目录
#$6:远程目标机器备份根目录
#$7:回滚版本号
#----------------------------------------------------------------------------------------------------

source /etc/profile
umask 022

readonly TARGET_IP=$2                        #远程目标机器ip
readonly TARGET_PORT=$3                        #远程目标机器ip
readonly USER=www                            #执行远程shell命令用户
readonly SOURCE_ROOT=$4                        #当前机器发布根目录
readonly TARGET_ROOT=$5                        #远程目标机器发布目录
readonly BACKUP_ROOT=$6                        #远程目标机器备份路径

readonly execssh="/usr/bin/ssh -p ${TARGET_PORT} -o StrictHostKeyChecking=no ${USER}@${TARGET_IP}" #在远程目标机器执行shell命令

#发布
function send(){
    IFS=","
    error=0
    aFile=($1)
    for file in ${aFile[@]}
    do
        if [ ! -e "${SOURCE_ROOT}/${file}" ];then
            fileList+={$file}
            error=1
        fi
    done

    if [ "${error}" != 0 ];then
        echo "file list is not exists in ${SOURCE_ROOT}"
        echo $fileList
        exit 1
    fi

    eval "${execssh} ${TARGET_ROOT}/cron/sendfile.sh backup ${1} ${2} ${TARGET_ROOT} ${BACKUP_ROOT}"

    if [ "$?" == 0 ];then
        cd ${SOURCE_ROOT}
        fileList=$(echo "${1}" | tr "," " ")
        #/usr/bin/rsync -avzR -e ssh ${fileList} ${USER}@${TARGET_IP}:${TARGET_ROOT}
        eval "/usr/bin/rsync -avzR ‘-e ssh -p ${TARGET_PORT}‘ ${fileList} ${USER}@${TARGET_IP}:${TARGET_ROOT}"
    else
        echo "back up faild!!!"
        exit 2
    fi
    exit 0
}

#回滚
function roll(){
    $execssh "tar zxf ${BACKUP_ROOT}/${1}.bak.tar.gz -C ${TARGET_ROOT}"
    echo ‘ok‘
}

#备份
function backup(){
    target_root=$3
    back_root=$4
    cd ${target_root}
    IFS=","
    aFile=($1)
    fileList=""
    for file in ${aFile[@]}
    do
        if [ -e "${target_root}/${file}" ];then
            fileList+="$file "
        fi
    done
    if [ -n "${fileList}" ];then
        if [ ! -d ${back_root} ];then
            mkdir -p ${back_root}
            if [ "$?" != 0 ];then
                echo "mkdir backup dir ${back_root} fail"
                exit 1
            fi
        fi
        tar czf ${back_root}/${2}.bak.tar.gz $1
        if [ "$?" == 0 ];then
            echo "backup file ${back_root}/${2}.bak.tar.gz!"
        fi
    fi
}

function argsCheck(){
    if [ -z $2 ] || [ -z $3 ] || [ -z $4 ] || [ -z $5 ] || [ -z $6 ] || [ -z $7 ];then
        echo "useage ${0} send|roll TARGET_IP TARGET_PORT SOURCE_ROOT TARGET_ROOT BACKUP_ROOT VER"
        exit 1
    fi
    if [ ! -d $4 ];then
        echo "SOURCE_ROOT ${SOURCE_ROOT} is not exsists!"
        exit 2
    fi
}

case $1 in
    "send")
        argsCheck "[email protected]"
        send $8 $7 #文件列表版本号
    ;;

    "backup")
        backup $2 $3 $4 $5
    ;;

    "roll")
        argsCheck "[email protected]"
        roll $7 #版本号
    ;;

    *)
    echo "useage ${0} send|roll TARGET_IP TARGET_PORT SOURCE_ROOT TARGET_ROOT BACKUP_ROOT VER"
    ;;
esac

shell脚本

  

原文地址:https://www.cnblogs.com/gaoqin31/p/9383083.html

时间: 2024-08-02 13:59:39

基于php+shell的发布系统的相关文章

基于jsp的新闻发布系统

新闻发布系统 下面就让我们来说一说基于jsp的新闻发布系统,其中使用的技术有JavaBean.fillter.数据库等,能够实现新闻的发布功能,在发布之后能够进行对每一条新闻的删除.修改.或者继续增加新的文章,最后还能够进行查询功能,其中引用了百度编辑器,能够进行图文并茂的编辑,极大地方便用户的使用. 注:完整项目下载地址:新闻发布系统 一.效果演示 首先让我们来看一看实现的效果: 下面是登陆的首界面: 图1 首界面 管理员登录页面: 图2 管理员登录界面 下面是管理员登陆之后的界面,可以进行添

基于J2EE新闻发布系统的设计与实现——论文随笔(十四)

一.基本信息 标题:基于J2EE新闻发布系统的设计与实现 时间:2010-10 出版源:南昌大学 领域分类:系统架构和设计 二.研究背景 问题定义:很多企业都没重视前期的市场调查 , 导致许多低质量或者说是不符合要求的新闻发布系统出现 , 因此在建新闻发布系统前进行市场分析就显得更重要了 , 只有了解好企业所在的市场才能结合自身现状建设出高水准的新闻发布系统来 . 相关工作:本文提出开发一个新闻发布系统的想法 ,基于J2EE设计方法设计. 三.创新方法 1.all in one 的J2EE的设计

基于saltstack svn写的一个发布系统

之前写了一个代码发布系统,功能,体验还有待完善,先放截图,想获得源码的,私聊我 1.登录页 2.分组管理页 3.添加项目页 4.项目列表和项目编辑页 5.项目发布回滚页

基于Jenkins的自动构建系统开发_android总结

持续集成相关理论 1.1 极限编程的概述 1.1.1 极限编程的产生 2001年,为了解决许多公司的软件团队陷入不断增长的过程泥潭,一批业界专家一起概括出了一些可以让软件开发团队具有快速工作.响应变化能力的价值观和原则,他们称自己为敏捷联盟.敏捷开发过程的方法很多,主要有:SCRUM,Crystal,特征驱动软件开发(Feature Driven Development,简称FDD),自适应软件开发(Adaptive Software Development,简称ASD),以及最重要的极限编程(

安卓项目-利用Sqlite数据库,开发新闻发布系统

本教程致力于程序员可以快速的学习安卓移动端手机开发. 适合于已经习得一种编程语言的同仁. 更多志同道合,想要学习更多编程技术的大神们. 小弟不才,麻烦关注一下我的今日头条号-做全栈攻城狮. 本文章是基于上篇文章基础之上进行深入学习的.程序员带你学习安卓开发-XML文档的创建与解析 Sqlite数据库: Sqlite数据库是在安卓中使用较广泛的数据库.其为简单.轻巧的Sql类文件型数据库.因以简单的文本形式保存,所以安全性不是很高.只要拿到sqlite数据库文件就可以得到数据.所以这就决定了sql

上线发布系统

准备开发两个版本的上线发布系统,基于yii2和django的版本. php mark一下: 1 class CallbackController extends Controller 2 { 3 /** 4 * @Desc: 微信服务器响应入口文件 5 * @User: justfantasy 6 */ 7 public function index() 8 { 9 //记录请求日志 10 //WRITE_ERROR_LOG && d('last request time:' . date

RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录

RDIFramework.NET - 基于.NET的快速信息化系统开发框架 - 系列目录 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.  框架简单介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开发系统提供了强大的支持,开发人员不需要开发系统的基础功能和公共模块,框架自身提供了强大的函数库和开发包,开发人员只须集中精力专注于业务部分的开发,因此大大提高开

自动化代码发布系统实现

日常运维问题 在我日常运维工作中,代码发布可能是最普遍的一项工作之一,尤其是网页代码的更新,碎片化发布需求非常频繁.在前期开发人员比较少时,还可以由自己来上服务器通过脚本来发布代码.但随着公司项目的增多,更多的开发人员加入到公司,发布代码需求开始增多,这就占用了我大部分时间,经常的被打断其它工作来发布代码,非常地不爽,然后开始想解决方法. 尝试解决问题 当然,发布代码肯定是运维的职责之一了,但频繁的发布导致运维大部分时间浪费在重复的操作上,非常的不值得.基于此,开始限制代码发布频率,要求把不是很

一步一步用jenkins,ansible,supervisor打造一个web构建发布系统

新blog地址:http://hengyunabc.github.io/deploy-system-build-with-jenkins-ansible-supervisor/ 一步一步用jenkins,ansible,supervisor打造一个web构建发布系统. 本来应该还有gitlab这一环节的,但是感觉加上,内容会增加很多.所以直接用github上的spring-mvc-showcase项目来做演示. https://github.com/spring-projects/spring-