持续集成(continuous integration)作为敏捷编程的基石现在已经被绝大多数的开发团队所广泛采用。而持续集成的工具现如今也是百花齐放,各有千秋,本文主要对比了在Java领域中比较常见的几种CI server(因为公司要求统一整个公司的CI server)。
如果想了解更多的工具,可以看这里:http://confluence.public.thoughtworks.org/display/CC/CI+Feature+Matrix,这个网页集中了决大多数比较流行的CI server,但是我发现很多的内容已经落后于实际产品的功能了,所以如果要对比的话,可能要实际到产品的站点去看一下,最好还是下载下来运行起来看。
在本文中,我主要针对以下几种CI Server作对比,这也是公司里各个项目组目前自行选用的(版本有点多,国内的多选用了一些open source的,而老外那边用得比较多的是商用版本,CruiseControl和TeamCity是我加的,因为名气非常大。):
CruiseControl (http://cruisecontrol.sourceforge.net/)
Hudson (https://hudson.dev.java.net/)
LuntBuild (http://luntbuild.javaforge.com/)
TeamCity (http://www.jetbrains.com/teamcity/)
AntHill Pro (http://www.anthillpro.com/)
Bamboo (http://www.atlassian.com/software/bamboo/)
QuickBuild (http://www.pmease.com/)
在持续集成领域,OpenSource的CruiseControl和LuntBuild可谓老牌了,尤其是CruiseControl,出自thoughtworks,这可是Martin Fowler的老巢啊。Hudson作为OpenSource里持续集成的后起之秀,现在已经赶超了这两个前辈,目前恐怕是使用最多的一个CI Server了。而后面4个是商用的CI Server,其中TeamCity是来自jetbrains的,jetbrains是开发著名的IDE IntelliJ的公司。Bamboo则是开发著名的Bug Tracking工具Jira和Wiki Confluence的公司atlassian公司出品的。AntHill也属于Continuous Integration界的元老,QuickBuild则是LuntBuild的商业版本。
我在下面重点考量的是QuickBuild,因为LuntBuild好像现在更新较慢了,而且QuickBuild现在好像也有了免费的所谓的Community Edition,功能齐全,只是配置数有所限制。在这些商业版本中,TeamCity应该是目前市场占有率最高的。由于公司里比较倾向使用商业版本的服务器,所以我重点比较的是后4种,捎带比较了一下CruiseControl和Hudson。TeamCity和QuickBuild都有各自的免费版本,有兴趣的也可以去看看。
功能对比
CI Server在本质上就是一个定时调度器。我们配置一系列的项目,然后设定一个定时器,让它干一些活,然后通知大家。所以很多公司都使用所谓Home-made的工具,用cron+Ant/Maven来做持续集成,这个就已经可以达到CI的最简单的功能了。而使用工具,就是我们除了基本的编译和通知功能以外,我们还有很多其它的需求,在我们公司里,选择CI Server主要考虑以下几点:
便于公司的统一管理(大约有200+ Projects需要统一管理)
对于项目本身进行流程管理: Daily Build -> QA Build -> Release Build
和公司AD(Active Directory)的连接以对用户进行权限管理
Continuous Testing的支持,即对于项目的Test要能产生出详尽的报告以及收集Test的统计数据以作为项目的分析和考量
Continuous Code Quality Analysis的支持,即能处理项目产生的Coverage报告,Code的static analysis报告,并且能收集这些报告的统计数据以作项目的分析和考量
与SCM工具的集成,我们公司主要有三种VCS,ClearCase, Subversion和StarTeam
与其它工具的集成,如bug tracking工具,IDE集成等等。
安装CI
安装是我们开始的第一步,同时也对各个CI server都有了初步的印象。按照各自的手册,很快就装好了,我基本上选择的是Standalone的版本,就是不配置数据库,使用自带的,也不deploy到Tomcat或者其它容器,这点,基本上每个CI Server都非常简单。所以也没看出什么好坏来。这里不得不提一下AntHill,有点小家子气,要download还得提交一个request,然后才能下载,安装,有点烦。
配置项目
在大多数的CI Server中,绝大部分都是以Project或者Project Group来进行管理,只有LuntBuild和QuickBuild比较另类,它们使用了Configuration这个术语,意即一个配置。在配置一个典型的项目的时候,即只处理基本的一个流程:CheckOut, Build, Publish Artifacts,这些工具都完成的非常好,也非常简单,我使用下来,觉得TeamCity的导航最方便,一目了然。而LuntBuild和QuickBuild在这方面稍显人性化不足,这两个工具都没有使用wizard的模式。
下面,我接着实验配置50个测试项目,这也就开始考验一个CI Server的管理能力了(因为我们项目较多)。使用下来,我发现QuickBuild对于我而言,最实用。因为它使用Configuration而不是Project,并且QuickBuild是这些CI Server中唯一支持树状结构配置的。我可以把Configuration配置成Team A, Team B ...,然后根据实际情况,对每个Team配置任意多个子节点,孙节点(注意,Configuration的数目在QuickBuild的Community Edition里是要限制的,好像是最多16个),另外,QuickBuild的继承关系使用起来也非常方便,如果要管理一个大型的CI Server,没有这种继承对我而言简直是一种折磨。比如说用hudson来配置50个项目,我折腾了大半天,而用QuickBuild来,我大约只用了一个小时,我实际配置的Configuration(含有实际step定义的)只有3个,其它的都是继承下来,然后修改了一下参数而已,而如果我们需要批量修改一系列的configurations的时候,则由于有继承关系,通常我们只要去修改一下父节点的设置就可以了。TeamCity支持Project Group的概念,类似于一种树形,但是还不完备,它只能分成两级关系,即Project Group和Project。另外QuickBuild所拥有的继承的功能,在别的CI里没有看到过,有的只是象TeamCity类似的copy project的功能。而QuickBuild在复制的能力上远远胜过其它的CI Server,它可以整个子树拷贝,这也就意味着,我可以配置一个公司用的template configuration树,然后复制出A部门,B部门,C部门,等等等等。对于不同项目之间的区别则通过变量来控制,赞一个!TeamCity在配置的方便上真得是没话说,非常直观,最酷的是象JUnit,NUnit这样的Tests,连Ant脚本都不需要写了,它直接就可以找出项目里的unit tests,这个在其它的工具里也没有看到过。至于CruiseControl,Hudson,Bamboo等则是中规中矩,无甚亮点。这个环节,QuickBuild和TeamCity胜出。