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, 我们简单的回顾一下之前的流程是什么样的:
- 编写好code并commit到local branchpush到autobuild server一个对应的branch上, server会将新code pull到指定的目录下compile & run unit test ... 观看实时结果, 并收到一封email
OK, 流程上很简单清晰, 但是这里有一个问题, 如果我们写好的code与server上的code已经存在了冲突, 那第二步将会失败, 导致无法继续, 作为用户, 自然不希望看到这一点, 所以我们来着手改进它.
目的明确就好办了, 下面谈谈我是如何改进的. 首先我们需要解决一旦发生了push后新代码与当前build环境的code有冲突的情况, 我们该做些什么事情, 删除分支? 可以. 换新分支继续push, 也可以, 不过这样会导致用户体验不好. 所以可以集中精力在删除分支上. 想要做到让用户没有感觉, 那么这个过程需要放在server端处理. 简单的做法, 如果我们删除了分支, 自然build环境中的code也就没有存在的价值, 因为这和用户需要build的代码可能差异很大, 我们可以先删除整个build目录, 然后重新checkout一份新的出来. OK, 简单的列一下:
- user编写code并commit到local branchpush到autobuild server一个branch上autobuild server删除之前的build环境, 并重新checkout一份新的仓库代码切换到对应branch上, compile & run unit test ...autobuild server删除对应branch的indexuser 观查实时反馈, 并最终收到一份邮件
这里面我需要解释一下:
第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