通过gitlab和walle完成的静态文件自动发布
起因:
公司有一个static项目(大约1.4GB),里面存储的都是些静态文件并且小文件居多,这个static存放在公司内部gitlab上面管理,由设计和开发提交设计文件。
gitlab上面的static与线上服务器的static目录结构不一致,线上有很多手动创建的目录而gitlab上面没有,另外这个目录会其他的5,6个php项目所使用创建了不少软连接。现在
每次发布这些静态文件都是一个一个文件的从本地拖到线上覆盖,如果一两个文件还好,但很不幸的是一般情况下ui会将设计完的文件积攒到本地,等所有的都完成再一并提交,
所以这就导致每次发布static文件时要一个一个的找这些文件。
有一次,一位刚来的仁兄,每修改完一个文件就提交一次但不上线,他们的项目做了将近2个月,他总共提交了40多次,涉及100多个文件,分散到几十个目录,当时就这
一个变更我就做了1个多小时才完成。做完之后感觉眼睛都快瞎了,唉。 所以为了避免再次出现这种情况,我开始大力在公司内部推gitlab,将权限管理和分支管理更好的利用起来,之后开始推walle(自动发布平台)。 但walle有个软肋,它是用来发布代码的,一般的代码也就几十兆左右,没人用它来发布大文件,因为由于walle的备份机制问题,会导致发布无比的慢。
要求:
上线时,研发提交申请并附上gitlab上的commit id,我们拿到这个id后做自动发布。
想法:
- 1)完全通过shell脚本来发布,脱离walle;(这样每次都要登陆到服务器并且手动执行脚本,这种方式太老土了,仅仅比手动拖文件高级一点点。)
- 2) 通过walle发布。(实在是太慢了,无法接受。)
- 3) 通过gitlab的cicd发布。(这有一个致命的bug,现在研发有时提交合并分支太随意,提交了并不一定要发布,所以这块gitlab的cicd无法控制。)
4) gitlab shellscript walle 三者结合运用,实现只发布改动的部分,另外由于static项目的特殊性很少会有删除的变更所以不用考虑回滚机制,一旦有问题就先从gitlab上回滚提交再通过walle发布;
综上所述我选择 4)来实现,虽然麻烦点但能解决目前的需求现状。
实现:
研发 –commit–> GitLab –triger–> ShellScript1 –rsync–> ProdServer (Done);
研发 –申请上线–> 禅道 –指派任务–> 运维 –获取commitid–> walle –triger–> ShellScript2 (Done) ;说明:
通过gitlab的cicd功能调用shell实现同步static项目文件到线上服务器的,同时生成一个static-commit的git仓库,这仓库里只包含一个文件,并且这个文件是以static项目的commitid而命名的, 这个文件里的内容是static项目commit时的改动文件路径,通过walle发布static-commit时会调用线上服务器上的一个本地脚本执行cp动作。
细节:
GitLab –triger–> ShellScript1
这里是使用了gitlab的cicd功能实现的triger控制,具体配置可以到gitlab官网查看,虽然是英文的但认真点能看懂。
ShellScript1主要实现了两个功能,
- 其一是:通过rsync同步gitlab上面的最新代码到ProdServer;
- 其二是:在拉取static的最新代码后获取static的commitid,拿到commitid后通过git diff-tree命令列出此次commit的有修改的文件列表并写入到static-commit仓库下以static的commitid命名的文本文件中,然后提交并推送static-commit到gitlab。
下面是shellscript1的内容:
[root@gitlab home]# cat static-develop-cicd.sh
#!/bin/bash
sourcedir=/home/static
commitdir=/home/static-commit
/bin/rm $commitdir/*
cd $sourcedir
git checkout develop
git pull
a=`git branch -v |grep "\*"|cut -d " " -f3`
git diff-tree -r --no-commit-id --name-only $a > $commitdir/$a
cd $commitdir
git checkout develop
git add -A .
git commit -m "static develop-commitid is $a"
git push
rsync -vzrtopg --progress -e ssh --delete --exclude='.git/' $sourcedir root@xxx.xxx.xxx.xxx:/home/ >> /dev/null 2>&1
ssh -t root@xxx.xxx.xxx.xxx 'chown www-data.www-data /home/static -R'
附1 Gitlab-CICD
附2 Gitlab CICD to Done
walle –triger–> ShellScript2 (Done)
walle上面的项目配置,实际上是配置static-commit这个git仓库的发布,这个仓库里只有两个分支develop和master分别对应线上的develp和master,每个分支下都只有一个文件,那就是由上面的shellscript1产生的文本文件,所以它发布起来速度非常快;
当static-commit这个git仓库发布完成后,会触发shellscript2,这个脚本的主要作用就是:根据static-commit仓库里的文本文件内容做copy,也就是真实的上代码。下面是shellscript2的内容:
root@web2:/mnt/www# cat static-deploy.sh
#!/bin/bash
sourcedir=/home/static
targetdir=/mnt/www/static
commitfile=`ls /mnt/www/static-commit`
cd /mnt/www/static-commit
for i in `cat $commitfile`
do
/bin/cp -rf $sourcedir/$i $targetdir/
附3 walle 发布
done