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

一.系统需求&现状

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

二.实现架构

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

代码管理示例如下:


通过git和rsync搭建代码同步程序_第1张图片
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搭建代码同步程序)