什么是个人预提交(Personal build)?
Personal build简单来说,就是开发人员在代码提交之前,先要自己在本地运行一次构建和测试代码,保证本地没有测试失败后,再将其提交到中央代码仓库。
Personal build的痛处在哪里?
“提交代码之前,必须在本地运行并通过单元测试”是敏捷团队的原则之一。而随着新功能的增加,我们的单元测试越来越多,运行时间当然也就越来越长,那么开发人员等待的时间就长。
因此,正如在
InfoQ 上的一篇
关于持续集成实践的文章 所 述,我们在每台PairStation上都安装了一个虚拟机来运行自己提交前的单元测试。然而,每台虚拟机都运行自己的单元测试,也就是说,在运行时间上 没有什么大的改进,还是需要三十分钟左右(因为还是在一台机器上运行),其好处是执行本地单元测试的同时,开发人员可以继续他们自己的工作,但本地单元测 试的时间并未缩短,反馈时间长的问题还是存在。
如何解决这个问题?
另外,在
目前尚未发布的Cruise R1.3 中,有个新功能就是:多个Agent可以运行于同一个机器上。因此,在那台安装有CruiseServer的PersonalBuild服务器上同时又启动了四个Agent。
个人构建持续集成服务器就有至少八台Agent可以同时工作啦。如图1所示。
图1
由于团队使用的是
Mercurial (分布式版本控制服务器),所以开发人员所要做的准备工作就是:
(1)在自己的机器上再Clone一个本地的Repository,运行hg serve 启动该Repository的http服务。
(2) 在Personalbuild Server上建立自己的一个Pipeline,该Pipeline的materials指向这个新建的Repository。且Pipeline上只有 一个Stage,同时利用Test-load-balancer将单元测试分成多个Job加入到该Stage中。
这样,利用Cruise的Job并行化和Agent的分布化,以及Mercurial的特点,使得每个人都相当于拥有八台Agent为其工作。
而建立PersonialBuild后的开发流程大致为如下步骤(见图2):
(1)开发人员对本地代码进行修改;
(2)开发人员将代码放到本地预提交仓库中;
(3)个人构建服务器发现本地预提交仓库的代码变化,触发个人的Pipeline进行构建;
(4)开发人员重复(1)和(2),并关注自己的个人构建Pipeline的运行结果;
(5)个人构建服务器重复(3);
(6)开发人员使自己的最后一次提交在个人构建服务器上通过所有测试;
(7)开发人员将所有修改提交到中央代码仓库中;
(8)团队集成构建服务器发现这些变化的代码,触发团队Pipeline的构建。
图2
其好处在于:
(1) 不需要太多的准备工作(原本就使用Mecurial);
(2) Cruise的分布式加快了个人构建与测试的反馈速度;
(3) 更大的灵活性(开发人员可以有选择性的向中央代码库提交任意指定的本地版本);
(4) 促进开发人员频繁提交,运行测试;
(5) 在团队持续集成环境中,失败的次数会大大减少;
具体准备工作:
(1) 建立本地代码库的复本
hg clone cruise cruise-personal
cd cruise-personal
hg serve
(2) 启动一个agent,指向PersonalBuild 服务器
mkdir cruise-personal-agent
cp cruise/target/cruise-agent-1.3/* cruise-personal-agent
cd cruise-personal-agent
java -jar agent-bootstrapper.jar ${your personal build IP address}
(3) 在建立一个pipeline,使其Materials指向第1步中建立的本地代码库复本
hg clone cruise cruise-personal
cd cruise-personal
hg serve
(2) 启动一个agent,指向PersonalBuild 服务器
mkdir cruise-personal-agent
cp cruise/target/cruise-agent-1.3/* cruise-personal-agent
cd cruise-personal-agent
java -jar agent-bootstrapper.jar ${your personal build IP address}
(3) 在建立一个pipeline,使其Materials指向第1步中建立的本地代码库复本
具体工作过程:
(1) 频繁向本地checkin代码;
(2) 需要个人构建时,使用命令'hg push ../cruise-personal'
(3)个人构建服务器会发现代码的改变而构建。
(4) 当需要向中心代码库提交时,使用命令'hg pull --rebase'
注意:
当我们想要运行个人构建时,如果使用命令 'hg push ../cruise-personal',你会得到信息说‘creating multiple heads’。假如你使用命令 'hg push -f ../cruise-personal' (注意那个 -f),就会强制Push并创建multiple heads。
在中心代码库上建立多个head是非常不好的。但是,对于个人的本地复本来说,无所谓。实际上,Cruise会发现并更新到最新的head上,而忽略旧的head。