[ 2009-12-23 9:25:00 | By: 王海鹏 ]
 

引言

Thomas Carlyle说:“人类是使用工具的动物。没有工具,人什么都不是;有了工具,人无所不能。”金融家们创造了复杂的金融工具,并利用这些工具制造了财富神话,制造了著名的跨国公司,也制造了世界范围的危机。软件精英们为了让自己的工作效率更高,有更多时间去做想做的事,也创造了各式各样的工具。持续集成已经不是一个新概念,在这个概念发展的十多年间,出现了支持这一概念的众多工具。这些工具的组合使用,为软件开发提供了强大的支持。

持续集成工具的分类和功能

一般来说,持续集成工具可以分成两大类:自动化构建工具和构建计划安排工具。

自动化构建工具有这样一些基本功能:代码编译、组件打包、程序执行和文件操作。编译源代码是构建的主要工作之一,为了提高效率,编译应该根据相应的源代码是否发生改变而有条件地执行。组件打包是将编译的结果和其他需要包含的文件组织在一起,形成可以部署的组件。构建工具应该知道何时需要重新打包。程序执行是指构建工具能够在它支持的平台上,调用所有提供命令行接口的程序。构建工具应该支持创建、拷贝、删除文件和目录等操作。

某些自动化构建工具还有一些扩展功能:执行开发者测试、版本控制工具集成、文档集成、部署功能、代码品质分析、支持扩展、多平台构建、加速构建。虽然构建工具可以通过命令行执行的方式来集成构建工具和测试工具,但如果它提供更直接的集成方式,开发者就更省力。同样,如果构建工具能够直接与版本控制工具集成,开发者也会觉得更方便。文档集成是指构建工具能够自动从源代码中抽取并生成API文档。构建工具还可以将打包好的组件自动部署到目标测试环境中去。构建工具一般通过一些第三方插件,支持对代码品质进行分析。而提供插件接口,是构建工具实现可扩展性的通用方式。如果您开发的软件需要在多个平台上构建并测试,那么构建工具对多平台的支持就会带来极大的方便。对于较大的代码集,一次构建可能需要好几个小时,这为持续集成带来了一些挑战。有的构建工具支持加速构建,即在多个构建服务器的多个处理器上进行分布式构建。

常见的自动化构建工具包括Ant、NAnt、MSBuild、make、Maven、Rake等。

构建计划安排工具有这样一些基本功能:构建执行、版本控制集成、构建工具集成、提供反馈、为构建打上标签。构建计划安排工具的核心功能就是在特定时间执行自动化的构建,这可以通过轮询版本控制库、计划驱动或事件通知等方式来实现。大部分构建计划安排工具都支持大多数流行的版本控制系统,也支持大多数流行的构建工具。构建计划安排工具至少支持通过电子邮件提供反馈信息,有一些工具可以通过即时消息、手机短信或其他设备来提供反馈。大多数构建计划安排工具会提供某种类型的升序计数,作为构建版本的标签。

某些构建计划安排工具还有一些扩展功能:支持项目间依赖关系、提供用户界面、制品发布、安全。如果项目间存在依赖关系,您可能希望在被依赖的项目重新构建时,重新构建依赖于它的项目。设计良好的用户界面会在工作时为您节约时间。制品发布是指除了得到可部署的组件之外,一些成熟的某些构建计划安排工具可以将文档、测试结果、品质分析结构和其他测量指标数据格式化,便于查看。有一些工具提供了身份认证和授权等安全方面的功能,允许您指定谁能查看结果和修改配置。

常见的构建计划安排工具包括AnthillPro、Continuum、CruiseControl、CruiseControl.NET、Draco.NET、Luntbuild、Hudson等。

下面介绍两个颇具代表性的工具:Ant和Hudson。

Ant

Ant是Java构建工具的事实标准,一般建议,不论项目团队成员使用哪种集成开发环境,项目都要有一个可以脱离IDE执行的Ant脚本。Ant采用插件式的设计结构,通过不同的插件来实现各种任务,其任务分类如表1所示。

Archive Tasks
 打包解包任务,支持的格式包括:BZip2、Cab、Ear、GZip、Jar、Rpm、Tar、War、Zip。
 
Audit/Coverage Tasks
 JDepend任务,调用JDepend实现代码静态分析,针对每个Java包生成设计品质指标数据。
 
Compile Tasks
 编译任务,实现对Java、JSP、NetRexx等源文件的编译。
 
Deployment Tasks
 部署任务,实现在JavaEE服务器上热部署。
 
Documentation Tasks
 文档生成任务,生成javadoc文档、Apache Stylebook文档。
 
EJB Tasks
 EJB任务,提供对1.x和2.x的EJB的支持,并支持不同供应商的应用服务器。
 
Execution Tasks
 执行任务,包括对子项目调用Ant、调用同一脚本中的另一个target、执行系统提供的命令行程序、执行Java程序、暂停和并行同步执行等功能。
 
File Tasks
 文件任务,实现对文件和目录的操作。
 
Java2 Extensions Tasks
 Java2 扩展信息任务,对jar包中的版本、供应商等扩展信息进行检查和操作。
 
Logging Tasks
 日志任务,将构建过程事件记录到文件中。
 
Mail Tasks
 邮件任务,发送SMTP邮件。
 
Miscellaneous Tasks
 其他任务,各种或许会用到的小任务,例如播放wav文件。
 
.NET Tasks
 .NET任务,支持执行.NET程序、执行NUnit测试、调用NAnt、调用MSBuild、调用WiX工具。
 
Pre-process Tasks
 预处理任务,实现编译之前的一些预处理。例如调用ANTLR、JavaCC、Native2Ascii等程序。
 
Property Tasks
 属性任务,对脚本中的属性变量进行判断和操作。
 
Remote Tasks
 远程任务,支持FTP、Rexec、Scp、SSH和Telnet。
 
SCM Tasks
 SCM任务,支持各种配置管理(版本控制)软件,包括CVS、ClearCase、Continuus、Visual SourceSafe、Perforce、PVCS、SourceOffSite和StarTeam。
 
Testing Tasks
 测试任务,支持执行JUnit测试。
 
表1. Ant任务分类

以上介绍的只是Ant发行版所带的一些任务。由于Ant采用的是插件结构,所以开发者可以开发自己需要的Ant任务,支持各种工具,如FindBugs、TestNG等其他代码检查工具和测试工具。早期的Ant没有很好的依赖关系支持,后来则通过Ivy弥补了这一缺点。

关键是Ant为我们提供了一个跨平台的Java构建工具,为持续集成提供了根本的支持。对于Java开发者来说,如果不想采用Ant,也可以考虑采用Maven。

Hudson

Hudson是一个开放源代码的CI服务器,受到世界各地各种规模和类型的开发团队的欢迎。关键是因为它非常易于安装和使用,提供了灵活的配置方式和复杂的功能,同时支持Java项目和非Java项目,由强大的Hudson社区提供技术支持。

简而言之,Hudson不仅仅是一个CI服务器,它的可扩展架构使它不仅是一个构建管理系统,也成为一个通用的开发生命周期管理系统,让开发者能够完成提升基线、打标签、执行工作流、根据依赖关系追踪变更、监视并图示测试结果、查看代码覆盖率和违反编码标准的情况等任务。

Hudson是最活跃,成长最快的开源社区之一,目前每周下载达4000次,有超过2万个在工作的安装实例。它的开发者超过160人,贡献的工作量超过137人年,目前已发布了超过300个发行版本。Hudson实际上是现在世界上最受欢迎的开源CI服务器。

图1是Apache软件基金会运行Hudson的屏幕截图,您可以在http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson 看到更多Hudson的使用案例。

图1. Apache运行的Hudson

Huddon的主要优点包括:

易于安装。只要执行“java –jar hudson.war”,或者将hudson.war部署到应用服务器上就可以了,不需要其他的安装工作,也不需要建立数据库。
易于配置。所有东西都通过Web GUI界面来配置,不需要手工修改XML文件。
支持分布式构建。Hudson支持将构建和测试负载分布到多台机器上,图2是Apache采用Hudson的分布式构建功能。
支持环境配置矩阵。Hudson支持在不同的环境配置下执行相同的任务,例如不同的JDK版本、不同的操作系统、不同的数据库。执行的结果可以汇总在一起。
支持JUnit/TestNG测试报告。测试的结果可以分标签列出、汇总,并与历史信息一同显示。历史趋势可以显示在图中。
追踪依赖关系。Hudson追踪记录哪次构建生成了哪些jar,某次构建使用了哪些版本的jar,即使这些jar包来自于外部也可以。

图2. Hudson支持的分布式构建

Hudson通过大量的插件来实现其丰富的功能,这些插件大致可以分为以下几类:

SCM。Hudson缺省支持CVS和Subversion,通过安装插件支持Accurev、Bitkeeper、ClearCase、Git、Mercurial、Perforce、StarTeam、Synergy等
构建触发器。可以通过IRC、Ivy、Jabber、Join、Locks and Latches、Navigator来触发执行构建。
构建工具。缺省支持Ant、Maven、shell s和Windows 批处理命令,通过安装插件支持batch tasks、Gant、Gradle、Grails、Groovy、Jython、Kundo、MSBuild、Phing、Powershell、Python、Rake、Ruby、SCons、SCTMExecutor,Selenium等。
构建包装。对构建的方式进行一些控制,如并发同步、启停虚拟机等。包括Hudson Centralized Job Action、Hudson Distributed Workspace Clean、Locks and Latches、M2 Extra Steps、M2 Release、Release、VMware、Xvnc、Zen Timestamp等。
构建通知。缺省支持电子邮件通知,通过插件支持Campfire、Google Calendar、HudsonTracker (RSS feeds)、IRC、Jabber、Nabaztag、SameTime、Status Monitor、The new Emailer、TuxDroid、Twitter等。
Slave启动和控制。缺省支持JNLP和命令行,通过插件支持SSH。
构建报告。缺省支持JUnit、javadoc和FindBugs,通过插件支持CCCC、Checkstyle、Clover、DRY、Emma、Gallio、Gnat、Grinder、Japaex、JavaNCS、JavaTest Report、MSTest、N Cover、NUint、Plot、PMD、PureCoverage、Ruby metrics、Selenium AES、Selenium hq、Serenitec、SLOCCount、Task Scanner、Testability Explorer、Violations、Warnings、WebTest Presenter等。图3是Sonar生成的项目报告的样例。
集群管理/分布式构建。支持DistFork、Hadoop、PXE、Selenium、Swarm等。
制品上传。支持FTP-Publisher、java.net uploader、SCP,SFEE、SVN等。
身份认证和用户管理。支持操作审计追踪、LDAP、MySQL认证等。

图3. Sonar Dashboard

结束语

工欲善其事,必先利其器。人是工具的主宰。A fool with a tool is still a fool(傻子拿着工具还是傻子)。人们总是在学习工具、使用工具、创造更好的工具,以期提高工作的效率和品质。人要有智慧,工具要先进。