这篇文章介绍的是 CruiseControl,这是一个开放源码软件,可以用它对有多个开发人员参与的软件项目自动进行构建和单元测试。我将解释为什么自动化构建对于成功的开发团队是至关重要的,并一步步介绍运行 CruiseControl 的持续集成系统的配置、安装和维护。

为什么要自动进行构建?

目前的一般实践是使用版本控制系统,例如 CVS 或 Subversion(请参阅 参考资料)。当有多个开发人员在同一个系统上工作时,这类协调至关重要了。另一个正在流行起来的实践是编写单元测试,并把它们作为构建过程的一部分来运行。例如,Maven 这个构建工具把运行 JUnit 单元测试作为正常构建过程的一部分(请参阅 参考资料)。但是采用这些实践仅仅是个开始。它们构成了近几年发展起来的许多轻量和实用软件开发方法的基础。
mozilla.org 上的持续集成
从 Mozilla 项目使用的开发方法中,可以学到许多东西,这是以公开方式进行的大的开发项目之一。Mozilla 团队过程的关键部分,是保持树的构建,而且他们还记录下了他们采用的实践。他们的一个重要工具是 tinderbox 系统,它持续地在许多不同的平台上构建和测试源树(请参阅 参考资料)。

当有许多开发人员在同一个项目上工作时,重要的是要确保构版本控制系统中代码的新版本一直被构建。。这对于拥有封闭开发团队的项目来说是个好的实践;当开发人员周期性地把自己的工作区与主干同步时,一个不进行构建的源树会继续进行开发,直到能修正它为止。对于开放源码项目,保持主干可以工作是至关重要的。潜在的新开发人员可以在任何时候检出代码,但是如果代码不能构建,新开发人员可能被挡在了做贡献的队伍之外。

极限编程(XP)方法论主张 持续集成。开发人员应当尽可能频繁地把他们的代码集成进主干 —— 典型的是几小时一次,同时还要确保所有单元测试都能通过。其他敏捷方法论也同意这个建议。

要采用持续集成和单元测试,需要团队接受这些方法和实践,但是这通常还不够。目前的实践依赖手工步骤 —— 集成代码、运行测试、在合适的时间检入代码,这样的实践有可能造成错误。让自动系统来构建代码、运行单元测试,可能是更可靠的解决方案。

配置构建服务器

这篇文章剩下的部分将介绍使用 CruiseControl 为 Java 项目配置构建服务器所涉及的步骤,CruiseControl 是一个管理自动构建过程的软件(请参阅 参考资料)。CruiseControl 需要一台可靠的机器,拥有充足的剩余磁盘空间,但并不需要特别快。(需要的是定期构建,但是构建过程本身需要花 2 分钟还是 20 分钟并不是问题。)将要构建的服务器基于 Fedora Core 4,这是一个由 Red Hat 资助的社区开发版的 Linux 发行版(请参阅 参考资料),所以需要有一些 Unix 经验。这篇文章涉及的主要任务有:

    系统的初始配置,以及设置一个运行 CruiseControl 的用户帐户
    安装 CruiseControl 并配置第一个构建
    让 CruiseControl 一直运行
    简化 CruiseControl 配置
    设置可选的基于浏览器的界面,用来监视 CruiseControl 构建

初始配置

第一件事是确保在系统上安装了 Java 的基本开发所需要的全部软件。Fedora Core 4 包含基于 gcj(来自 GNU 编译器集合(gcc)项目的 Java 编译器)的 Java 工具链,但是出于兼容性的原因,好是安装来自 IBM 或 Sun 的 JDK。干净的方法是按照 jpackage.org 上的说明(请参阅 参考资料),构建和安装自己的 Java RPM。Fedora Core 4 自带的 xerces-j2 包构建得不正确,造成 Xalan XSLT 实现不能工作。所以还需要从 Fedora 开发仓库安装更新的 xerces-j2 包(请参阅 参考资料)。

还需要使用其他一些软件:

    XMLStarlet,一个有用的命令行程序,用来管理 XML 文档(请参阅 参考资料)。稍后 将用它来简化 CruiseControl 配置文件的维护。
    CVS 和 Subversion:需要安装这些工具,以便从构建的源树中下载更新。幸运的是,Fedora Core 4 中包含这两个工具。

要执行这些步骤,必须以 root 登录。首先,下面是系统上应当有的 RPM:

[root@fcvm ~]# ls
java-1.4.2-sun-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-alsa-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-demo-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-devel-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-fonts-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-jdbc-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-plugin-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-src-1.4.2.08-1jpp.i586.rpm
xerces-j2-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-demo-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-apis-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-dom3-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-impl-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-other-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-xni-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-scripts-2.6.2-5jpp_2fc.i386.rpm
xmlstarlet-1.0.1-1.i586.rpm
[root@fcvm ~]#


安装 Java、Xerces、XMLStarlet 和 Subversion 包:

[root@fcvm ~]# rpm -ivh java-1.4.2-sun-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-alsa-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-devel-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-fonts-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-plugin-1.4.2.08-1jpp.i586.rpm
java-1.4.2-sun-src-1.4.2.08-1jpp.i586.rpm
Preparing...                ################################# []
   1:java-1.4.2-sun         ################################# [ 17%]
   2:java-1.4.2-sun-alsa    ################################# [ 33%]
   3:java-1.4.2-sun-devel   ################################# [ 50%]
   4:java-1.4.2-sun-fonts   ################################# [ 67%]
   5:java-1.4.2-sun-plugin  ################################# [ 83%]
   6:java-1.4.2-sun-src     ################################# []
[root@fcvm ~]# java -version
java version "1.4.2_08"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)
Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)
[root@fcvm ~]# rpm -Uvh xerces-j2-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-demo-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-apis-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-dom3-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-impl-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-other-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-javadoc-xni-2.6.2-5jpp_2fc.i386.rpm
xerces-j2-scripts-2.6.2-5jpp_2fc.i386.rpm
Preparing...                ################################# []
   1:xerces-j2              ################################# [ 13%]
   2:xerces-j2-demo         ################################# [ 25%]
   3:xerces-j2-javadoc-apis ################################# [ 38%]
   4:xerces-j2-javadoc-dom3 ################################# [ 50%]
   5:xerces-j2-javadoc-impl ################################# [ 63%]
   6:xerces-j2-javadoc-other################################# [ 75%]
   7:xerces-j2-javadoc-xni  ################################# [ 88%]
   8:xerces-j2-scripts      ################################# []
[root@fcvm ~]# rpm -ivh xmlstarlet-1.0.1-1.i586.rpm
Preparing...                ################################# []
   1:xmlstarlet             ################################# []
[root@fcvm ~]# yum install subversion
    [...]
Installed: subversion.i386 0:1.2.3-2.1
Complete!
[root@fcvm ~]#