AutoBuild系统的改进
Title: Upgrade Autobuild System
Author: 胡钰璋 ( Yuzhang Hu )
Email: hyzwowtools at gmail dot com
Personal blog address: Here
之前写了一篇文章算是AutoBuild Server的开篇, 上一篇已经叙述了如何利用git server搭建自动构建系统, 如何编写post-receive hook脚本, 今天我会对这套方案进行一次进化, 主要是改进了一些在提交版本时冲突的问题.
OK, 我们简单的回顾一下之前的流程是什么样的:
OK, 流程上很简单清晰, 但是这里有一个问题, 如果我们写好的code与server上的code已经存在了冲突, 那第二步将会失败, 导致无法继续, 作为用户, 自然不希望看到这一点, 所以我们来着手改进它.
目的明确就好办了, 下面谈谈我是如何改进的. 首先我们需要解决一旦发生了push后新代码与当前build环境的code有冲突的情况, 我们该做些什么事情, 删除分支? 可以. 换新分支继续push, 也可以, 不过这样会导致用户体验不好. 所以可以集中精力在删除分支上. 想要做到让用户没有感觉, 那么这个过程需要放在server端处理. 简单的做法, 如果我们删除了分支, 自然build环境中的code也就没有存在的价值, 因为这和用户需要build的代码可能差异很大, 我们可以先删除整个build目录, 然后重新checkout一份新的出来. OK, 简单的列一下:
这里面我需要解释一下:
第3步, 为什么是在每次接收到commit才去删除之前的build环境? -- 这主要是方便debug, 比如发现了coredump, 或者程序逻辑不正确需要上去debug, 这至少为我们留下了现场可供参考, 不至于什么都没有了.第5步, 为什么删除的index, 而不是通过一条git指令比如 git push repository :branch_name 去删除? -- 这会导致我们的post-receive脚本被重新触发并执行, 容易出现错误. 好了, 来张图可能就更清楚了:
接下来再来看看我们调整过后的脚本:
mailfile='autobuild.txt'email='xxx@xx.com'unset GIT_DIR # 1. get branch namewhile read oldrev newrev refdo echo "found pushed branch name:$ref" echo "oldrev=$oldrev newrev=$newrev" old_rev=$oldrev new_rev=$newrev refs=$refdonebranch_name=`echo $refs | awk -F "/" {'print $3'}`# 2. cleanup build environmenttop_dir='xxx'test_dir='xxx' cd $top_dirrm -rf $test_dir# 3. checkout repositorygit clone git://127.0.0.1/your_repository# 4. switch to branchgit checkout -b $branch_name -t origin/$branch_name# 5. buildmake --no-print-directory 2>> $mailfile# 6. run test unitmake run_test --no-print-directory >> $mailfile# 7. output to stdout for echo backcat $mailfile# 8. remove branch head indexrm -f /gitrepo_directory/refs/heads/$branch_name# 9. send a email to yourselfmail -s "Autobuild `date`" $email < $mailfile Ok, Have a fun :D