然后,创建叫作 env 的目录。要用这个目录的内容设置 CruiseControl 的环境变量以及它要启动的其他进程。在这里要确保 JAVA_HOME 有合适的值。在这里还要设置将要使用的构建工具需要的环境变量,例如 MAVEN_HOME。

[root@fcvm .cruisecontrol]# mkdir env
[root@fcvm .cruisecontrol]# cd env
[root@fcvm env]# echo /usr/lib/jvm/java >JAVA_HOME
[root@fcvm env]# echo /home/cruise/pkg/maven-1.0.2 >MAVEN_HOME
[root@fcvm env]# ls
JAVA_HOME  MAVEN_HOME
[root@fcvm env]# cd ..
[root@fcvm .cruisecontrol]#


清单 2 显示了 /service/cruisecontrol/run 脚本:

清单 2. /service/cruisecontrol/run 的内容

    #!/bin/sh
svc=`pwd`
cd /home/cruise
exec 2>&1
exec setuidgid cruise
        envdir ${svc}/env
        java -jar pkg/cruisecontrol-2.2.1/main/dist/cruisecontrol.jar


这个脚本相当简单。它执行以下这些步骤:

    保存服务目录的名称(在这个示例中是 /service/cruisecontrol)留待后用。
    把当前目录变为 /home/cruise。
    让标准错误流写入到 multilog 进程的管道,这个管道已经连接到了标准输出流。
    启动 JVM,运行 CruiseControl,以 cruise 这个用户身份运行进程,并根据 /service/cruisecontrol/env 目录中创建的文件设置环境。

清单 3 演示了 /service/cruisecontrol/log/run 脚本,它更简单。它以 cruise 用户的身份运行 multilog:

清单 3. /service/cruisecontrol/log/run 的内容

    #!/bin/sh
exec setuidgid cruise multilog /home/cruise/log/cruisecontrol


请注意,必须使用 chmod 把两个脚本变成可执行的。而且,这两个脚本都要小心地使用 exec 外壳命令,这个命令用一个程序替代另一个程序,但是没有创建新进程。这一点很重要,因为 supervise 只能管理自己的直接子进程。如果没有使用 exec,那么 JVM 会作为执行 run 脚本的外壳的一个子进程启动。如果向 supervise 发送了杀死其子进程的信息,那么外壳会接收到信号并退出,但是 JVM 会继续运行,从而变成孤儿。supervise 并不会知道这一点,所以可能会接着启动守护程序的第二个拷贝 —— 这并不是想要的结果。

在设置好服务目录之后,可以把它改名,删除前导点号。然后 svscan 会自动启动 CruiseControl,它的输出也会出现在日志文件中:

[root@fcvm .cruisecontrol]# cd ..
[root@fcvm service]# mv .cruisecontrol cruisecontrol
[root@fcvm service]# cat /home/cruise/log/cruisecontrol/current
[cc]Aug-24 21:45:45 Main          - CruiseControl Version 2.2.1
[cc]Aug-24 21:45:46 trolController- projectName = [xstream]
[cc]Aug-24 21:45:46 Project       - Project xstream:  reading settings
 from config file [/home/cruise/config.xml]
[cc]Aug-24 21:45:47 BuildQueue    - BuildQueue started
[cc]Aug-24 21:45:47 Project       - Project xstream starting
[cc]Aug-24 21:45:47 Project       - Project xstream:  idle
[cc]Aug-24 21:45:47 Project       - Project xstream started
[cc]Aug-24 21:45:47 Project       - Project xstream:  next build in 1
hours
[cc]Aug-24 21:45:47 Project       - Project xstream:  waiting for next
 time to build
[root@fcvm service]#

简化 CruiseControl 的配置

现在已经让 CruiseControl 自动运行在一个很好的受控环境中。下面要做的是向配置中添加自己的项目。正如所料,config.xml 文件中的项目看起来非常相似,不同之处只是要用哪个工具来构建项目的细节。可以在文本编辑器中用拷贝粘贴的方式手工维护 config.xml 文件,但是一种更少出错的技术是使用 XSLT 样式表从更简单的 XML 文档生成 config.xml 文件。实现这个方案的文件集合已经合成了一个可以下载的压缩 tar 文件(请参阅 下载)。请解压缩这些文件到 /home/cruise 目录:

[cruise@fcvm ~]$ ls
config.xml         force-build  pkg  xstream.ser
cruisecontrol.log  log          src
[cruise@fcvm ~]$ tar xvzf [...]/simple-cc.tar.gz
meta-config-params.xsl
meta-config.xsl
meta-config.xml
mkconfig
[cruise@fcvm ~]$ ls
config.xml         meta-config-params.xsl  pkg
cruisecontrol.log  meta-config.xml         src
force-build        meta-config.xsl         xstream.ser
log                mkconfig
[cruise@fcvm ~]$


简化的配置文件名为 meta-config.xml。这个文件要用 meta-config.xsl 样式表进行变换,生成 CruiseControl 的 config.xml 文件。叫作 mkconfig 的简单脚本用早先安装的 XMLStarlet 工具执行转换操作。请运行 mkconfig 重新生成 CruiseControl 的 config.xml 文件。

构建监视

前面开始的简单 CruiseControl 配置对于让第一个构建工作来说足够了,但是对于监视构建过程来说还不够。常见的需求是把集成构建的结果通过电子邮件发送给相关开发人员。meta-config.xsl 样式表生成发送电子邮件消息的配置,但是要做到这一点,它需要一些本地环境变量的信息。它必须知道的许多变量要从 meta-config-params.xsl 文件读取;在开始之前应该根据实际情况修改这个文件。这个文件中的设置如下所示:

    home :构建进程的主目录。如果采用的是这篇文章中描述的目录布局,那么默认设置可以了。
    cruisecontrol-home :CruiseControl 发行包解压后所在的目录。同样,默认设置应当可以了。
    ant-home :Ant 的安装目录。要使用 Fedora Core 4 自带的 Ant,应当把这个值设为 /usr。
    maven-home :Maven 的安装目录(如果需要用它的话)。默认值假设把 Maven 解压缩到 /home/cruise/pkg 目录。
    return-address :CruiseControl 构建电子邮件的返回电子邮件地址。
    return-name :构建电子邮件返回地址的名称。
    developers-address :除了上次成功构建之后进行过提交的开发人员之外,应当总是得到构建电子邮件拷贝的一个电子邮件地址。