通过git和rsync搭建代码同步程序

作者: daos | 来源:发表于2017-11-19 14:59 被阅读35次

    一.系统需求&现状

    1.代码通过git管理,通过分支管理测试和正式的代码,测试完成后合并到master同步到线上
    2.前端有2台机器做负载均衡,测试机做测试使用,配置一致
    3.要求代码部署简单如有异常可以直接回滚到指定版本的代码上(不考虑数据库的修改) 
    

    二.实现架构

     1.需要管理的服务器相对较小,本着够用即可的原则使用git管理代码,rsync做代码同步和备份用
    

    代码管理示例如下:


    image.png

    三.实例代码

    1.安装&配置rsync
       详细配置和安装可参考:https://segmentfault.com/a/1190000000444614
    2.对应的/home/code目录结构
       
      ├── ProductCode   //待发布的目录
      ├── backup     //备份的目录
      ├── exclude.list  //排除的不需要上传的文件
      ├── nodelete.list  //不需要覆盖的线上文件
      ├── rsync.sh   //同步到正式的程序
      ├── rsync_backup.sh //备份的程序
      ├── rsync_ready.sh   //同步到待发布目录的程序
      ├── rsync_recovery.sh //恢复到指定版本的代码到待发布目录  
      └── rsyncd.secrets 存放的rsycn的密码
    
    2.代码通过git pull 拉取到测试环境中
       git pull origin master
    3.代码通过rsync同步到待发布的文件目录下
       --------------------------------rsync_ready.sh 代码开始--------------------------------
       #!/bin/bash
       #author by  xx
       echo -e "代码同步到准备预备发布目录"
       echo -n "Please type[Yes/N]:"
       read input
       ret=$input
       func_rsync(){
         echo -e  "begin rsync file to /home/code/ProductCode/basic/ ....."
         sudo rsync -avz --exclude-from=/home/code/exclude.list  --delete --exclude-from=/home/code/nodelete.list  /var/www/html/ugc/basic/  /home/code/ProductCode/basic/
         echo -e  "rsync to /home/code/ProductCode/basic/  complete!"
         echo -e " "
       }
    
      if [ $ret = "Yes" ];then
        func_rsync
      else
        echo "type error quit !"
      exit
     fi
    --------------------------------rsync_ready.sh 代码结束--------------------------------
    4.代码同步到正式的环境中去
       --------------------------------rsync.sh 代码开始--------------------------------
       #!/bin/bash
       #author by xxx
       echo -e "你要同步代码到正式机上"
       echo -n "Please type[Y/N]:"
       read input
       ret=$input
       func_rsync(){
           IP=$1
           echo -e  "begin rsync file to $IP....."
           sudo rsync -avz --password-file=/home/code/rsyncd.secrets --exclude-from=/home/code/exclude.list  --delete --exclude-from=/home/code/nodelete.list  /home/code/ProductCode/basic/  rsyncuser@$IP::var/www/
           echo -e  "rsync $IP complete!"
           echo -e " "
       }
    
       if [ $ret = "Y" ];then
            func_rsync ip1地址
            func_rsync ip2地址
       else
           echo "type error quit !"
           exit
       fi
     --------------------------------rsync.sh 代码结束--------------------------------
    5.代码同步到备份目录中
       --------------------------------rsync_backup.sh 代码开始--------------------------------
       #!/bin/bash
       #author by xxx 备份数据
       DIR=$1
       #判断目录是否存在 如果存在提示不能继续
       if [ -z "$DIR" ]
         then
         echo -e "请填写要备份的目标文件 例如: $0 v0.3"
       exit
       fi
      cd $BACKUP
      if [ -d $DIR ]
      then
      echo -e '目录 $DIR 已经存在请现在其他目录'
      exit
      fi
       echo -e "代码同步到备份目录"
       echo -e  "begin rsync file to $BACKUP$DIR ....."
    sudo rsync -avz --exclude-from=/home/code/exclude.list  --delete --exclude-from=/home/code/nodelete.list  /home/code/ProductCode/ $BACKUP$DIR
    echo -e  "rsync to $BACKUP$DIR  complete!"
    echo -e " "
       --------------------------------rsync_backup.sh 代码结束--------------------------------
    6.在备份的目录中回复代码到待发布的目录
        --------------------------------rsync_recovery.sh 代码开始--------------------------------
        #!/bin/bash
        #author by wangschang
        #从备份的目录恢复代码到待发布目录
        #备份规则:每次执行生成一个目录说明中增加一条日志
        SOURCE=/home/code/ProductCode
        DIST=/home/code/backup/
        DIR=$1
        #判断目录是否存在
        if [ -z "$DIR" ]
        then
            echo '请填写要恢复的目录'
            exit
        fi
        cd $DIST
        if [ ! -d "$DIR" ]
        then
            echo "目录不存在请 $DIR"
            cd -
            exit
        fi
        echo -e "--------------------不同文件开始------------"
        diff -rNq  /home/code/backup/$DIR/basic/ /home/code/ProductCode/basic/
        echo -e "--------------------不同文件结束------------" 
        echo -e "开始拷贝目录 $DIR 到 $SOURCE"
        #cp -rf  $DIR/* $SOURCE
        sudo rsync -avz --exclude-from=/home/code/exclude.list  --delete --exclude-from=/home/code/nodelete.list  $DIR/basic/  /home/code/ProductCode/basic/ 
        echo -e "拷贝完成"
        echo -e "--------------------不同文件开始------------"
        diff -rNq  /home/code/backup/$DIR/basic/ /home/code/ProductCode/basic/
        echo -e "--------------------不同文件结束------------"
        cd -
        --------------------------------rsync_recovery.sh 代码结束--------------------------------
    
    exclude.list 文件内容
      .git
      runtime
      assets
     nodelete.list文件内容
     runtime  
    

    四.需要注意的事项

    1.过滤不需要的目录
    2.不需要覆盖临时目录下的文件
    3.如果rsync设置密码需要指定对应的密码文件 
    

    相关文章

      网友评论

        本文标题:通过git和rsync搭建代码同步程序

        本文链接:https://www.haomeiwen.com/subject/kqjurxtx.html