一.系统需求&现状
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设置密码需要指定对应的密码文件
网友评论