Ant 在项目构建的方式方面有很高的灵活性,所以不可能确定地指出项目重新构建时会更新文件系统的哪个区域。在这里可以采用的唯一方法就是检查每个文件的 build.xml 文件,找出它把构建的制品放在哪儿。然后才能把合适的<filesystem>元素添加到依赖这些制品的项目中。简化的 meta-config.xml 文件支持一个<modificationset>元素,里面可以包含任何 CruiseControl 元素。它们会被拷贝到 config.xml 文件中。例如,依赖 XStream 的项目可能包含以下内容:
<project name="my-project">[...]<modificationset> <filesystem folder="/home/cruise/src/xstream/xstream-SNAPSHOT.jar"/> </modificationset> </project>
Maven 在每个项目上放了一个公共构建过程,所以在 Maven 项目间指定依赖性时,可以提供一些公共规则。项目可以对 Maven 仓库中由指定群组创建的制品指定依赖。更准确地说,包含<repo-dependency>classworlds</repo-dependency>可以让项目在 /home/cruise/.maven/repository/classworlds 下的文件发生变化时,重新进行构建。假设classworlds构建是在本地 Maven 仓库中安装了制作好的 JAR 文件,那么任何包含这个元素的项目都会自动重新构建。
项目也可以指定对其他项目的构建输出的依赖。包含<srcdir-dependency>classworlds</srcdir-dependency>可以让项目在 ${srcdir}/target 下的文件发生变化时重新进行构建,其中 ${srcdir} 是命名项目的源目录。
向构建添加项目
下面是向持续集成构建添加新项目的步骤:
作为cruise用户,把源代码签出到 /home/cruise/src 目录。 检查是否可以手工构建源树。 向 meta-config.xml 添加适当的条目。 运行./mkconfig。 重启 CruiseControl,以便它能从 config.xml 读取新的项目条目。可以用ps命令找到运行 CruiseControl 的 JVM 的进程 ID,然后用kill命令杀死进程。也可以用root用户身份运行svc -t /service/cruisecontrol,让daemontools杀死进程。不管采用哪种方法,supervise都可以保证 CruiseControl 会被重启。 可选地,更新 /home/cruise/force-build/${project-name} 的时间戳也可以让 CruiseControl 触发自动重新构建。CruiseControl Web 应用程序
目前为止运行的 CruiseControl 安装把每个构建的结果用电子邮件消息发送给开发人员。但是开发过程可能包含不是这些消息收件人的人员 —— 例如,项目管理人员或测试人员。CruiseControl 包含一个简单的 Web 应用程序,可以让这些人员监视持续集成构建。
CruiseControl Web 应用程序在 Apache Tomcat 应用程序服务器中运行,使用的是包含在 Fedora Core 4 发行版中的拷贝。需要安装tomcat5和tomcat5-admin-webapps包:
[root@fcvm ~]#yum install tomcat5 tomcat5-admin-webapps[...]Installed: tomcat5.i386 0:5.0.30-5jpp_6fc tomcat5-admin-webapps.i386 0:5.0.30-5jpp_6fc Dependency Installed: tomcat5-jasper.i386 0:5.0.30-5jpp_6fc Complete! [root@fcvm ~]#
还需要安装 Java 事务 API(JTA)的一个实现。可以用 JPackage 中(请参阅参考资料)的 RPM 规范文件构建自己的 JTA RPM,但是最简单的选择就是安装来自 Fedora 仓库的geronimo-specs和geronimo-specs-compat:
[root@fcvm ~]#rpm -Uvh http://download.fedora.redhat.com/\ pub/fedora/linux/core/development/i386/Fedora/RPMS/\ geronimo-specs-1.0-0.M2.2jpp_4fc.i386.rpmPreparing... ################################### [100%] 1:geronimo-specs ################################### [100%] [root@fcvm ~]#rpm -Uvh http://download.fedora.redhat.com/\ pub/fedora/linux/core/development/i386/Fedora/RPMS/\ geronimo-specs-compat-1.0-0.M2.2jpp_4fc.i386.rpmPreparing... ################################### [100%] 1:geronimo-specs-compat ################################### [100%] [root@fcvm ~]#
使用默认的 Tomcat 安装,CruiseControl Web 应用程序会找不到合适的 JAXPTransformerFactory实现,所以需要向选定的类目录添加默认 JAXP XML 转换器:
[root@fcvm ~]#cd /usr/share/tomcat5/common/endorsed[root@fcvm endorsed]#ln -s /usr/share/java/jaxp_transform_impl.jar \ \[jaxp_transform_impl\].jar[root@fcvm endorsed]#ls -ltotal 12 lrwxrwxrwx 1 root root 36 Sep 19 01:33 [jaxp_parser_impl].jar -> /usr /share/java/jaxp_parser_impl.jar lrwxrwxrwx 1 root root 39 Sep 19 01:47 [jaxp_transform_impl].jar -> / usr/share/java/jaxp_transform_impl.jar lrwxrwxrwx 1 root root 36 Sep 19 01:33 [xml-commons-apis].jar -> /usr /share/java/xml-commons-apis.jar [root@fcvm endorsed]#
CruiseControl Web 应用程序可以绘制重要的构建统计图,例如成功构建与失败构建的比例。画图的库要使用 Java AWT,所以需要确保 JVM 运行在headless模式。要做到这一点,请编辑 /etc/tomcat5/tomcat5.conf 文件,并插入下面这一行:JAVA_OPTS="-Djava.awt.headless=true",位置大约在第 10 行。
现在,在 /etc/tomcat5/Catalina/localhost 下创建一个叫作 cruisecontrol.xml 的文件,把 CruiseControl Web 应用程序添加到 Tomcat 的配置。清单 5 显示了这个文件的内容:
清单 5. /etc/tomcat5/Catalina/localhost/cruisecontrol.xml 的内容
<Context path="/cruisecontrol" docBase="/home/cruise/pkg/cruisecontrol-2.2.1/reporting/jsp/d ist/cruisecontrol.war"> <Parameter name="logDir" value="/home/cruise/log/build" override="false"/> <Parameter name="cacheRoot" value="/var/cache/tomcat5/cruisecontrol" override="false"/> </Context>
请注意,清单 5 中的第二行出于显示的原因进行了回绕。docBase属性在创建的文件中应该单独占一行。
还需要为 CruiseControl Web 应用程序创建一个保存页面缓存的目录:
[root@fcvm ~]#cd /var/cache/tomcat5[root@fcvm tomcat5]#mkdir cruisecontrol[root@fcvm tomcat5]#chgrp tomcat cruisecontrol[root@fcvm tomcat5]#chmod g+w cruisecontrol[root@fcvm tomcat5]#ls -ltotal 24 drwxrwxr-x 2 root tomcat 4096 Sep 16 09:32 cruisecontrol drwxrwxr-x 2 root tomcat 4096 May 10 11:57 temp drwxrwxr-x 3 root tomcat 4096 Sep 15 22:53 work [root@fcvm tomcat5]#
现在可以启动 Tomcat,并把它设置成在系统启动时重启。启动脚本目前会生成一些警告信息,但是可以忽略它们:
[root@fcvm ~]# service tomcat5 start Starting tomcat5: find: warning: you have specified the -mindepth opti on after a non-option argument -type, but options are not positional ( -mindepth affects tests specified before it as well as those specified after it). Please specify options before other arguments. find: warning: you have specified the -maxdepth option after a non-opt ion argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Pleas e specify options before other arguments. Using CATALINA_BASE: /usr/share/tomcat5 Using CATALINA_HOME: /usr/share/tomcat5 Using CATALINA_TMPDIR: /usr/share/tomcat5/temp Using JAVA_HOME: /usr/lib/jvm/java [ OK ] [root@fcvm ~]# chkconfig tomcat5 on [root@fcvm ~]# chkconfig --list tomcat5 tomcat5 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@fcvm ~]#
现在应当能够用浏览器在 http://localhost:8080/cruisecontrol/ 上访问 CruiseControl Web 应用程序了。图 1 显示了将会看到的输出的示例:
图 1. CruiseControl Web 应用程序
安全问题
在我总结之前,我要指出两个配置和运行自己的持续集成服务器所涉及的安全性问题。首先,我没有解决构建服务器的访问安全问题。您应当参考其他信息来源以确保您的系统安全,或者在提供适当保护的内部网络上运行它。
其次,对于要在持续集成服务器上构建的外部项目的开发人员,您要考虑对他们要信任到什么程度。项目的构建过程和单元测试可以访问服务器的资源,包括服务器连接的网络。自动构建过程意味着提交给远程版本控制仓库的变更会在没有人为干预的情况下,自动下载到构建服务器并在上面执行。这就把构建服务器置于提交给源树的 bug 和恶意代码的风险之下。您可能想限制在构建服务器上构建的外部项目,或者做些工作来保护系统和网络不受正在构建的项目的影响。
结束语
这篇文章介绍了运行 CruiseControl 的持续集成服务器的设置步骤。您安装了 CruiseControl 并学习了保持服务器一直运行需要做的工作,还了解了持续集成服务器的日常管理工作。而且还把配置的重要元素提取到更简单的 XML 文档中,包括版本控制和构建工具的选择以及用来构建每个项目的目标。
现在您学会了如何指定项目之间的依赖性。对于 Maven 项目来说指定比较容易,因为它们拥有一致的构建过程,生成的制品也有共享的仓库。Ant 则把这些机制留给每个项目,但是如果许多 Ant 项目都有公共的构建过程,那么可以用生成的<filesystem>元素对配置进行扩展,模拟这些项目之间的依赖性。CruiseControl 还有其他许多控制,可以用来增强持续集成过程。可以通过我介绍的 XSLT 样式表轻松地利用它们。
我快速介绍了运行 CruiseControl Web 应用程序需要的步骤,但是您可以提高自己安装的安全性和可靠性。更安全的配置可以使用 Apache 的httpd处理请求并把它们交给 Tomcat。让daemontools管理 Tomcat JVM(就像配置它来管理 CruiseControl 本身那样)可能更可靠。除此之外,还应当考虑构建服务器和构建服务器所在网络的安全需求,并尝试 Linux 提供的一些安全工具。
这篇文章的目的是通过采取持续集成方式,让开发过程更敏捷并提高软件的质量。创建构建服务器是具体而实用的一步,采用敏捷开发方法的更多实践还会得到进一步提高。我鼓励您阅读关于这些方法的更多内容(请参阅参考资料)并用它们的想法来提高和调整开发过程。
下载
描述名字大小 下载方法 Sample tools j-simple-cc.tar.gz 2 KB FTP 关于下载方法的信息 获取 Adobe® Reader®
参考资料
学习
Open Source Development with CVS, 3rd Edition和Version Control with Subversion:这些版本控制方面的书可以在线得到。
Extreme Programming: A gentle introduction:阅读软件开发方面的极限编程方式。
Integrate Often和Unit Tests:极限编程主张持续集成和单元测试。
Demystifying Extreme Programming:Roy Miller 以前在 developerWorks 上的专栏有助于理解 XP 和它的重要性。
“让编译和测试过程自动化”(Erik Hatcher,developerWorks,2001 年 8 月):了解如何用 Ant 和 JUnit 框架对构建和测试过程的自动化进行定制。
“Matching project and process”(Gary Pollice,developerWorks,2004 年 5 月):阅读经常被忽视的关于调整软件开发过程以便对人员、工具以及项目类型进行匹配的必要性的讨论。
Working with the SeaMonkey Tree和tinderbox:Mozilla 项目记录了自己的开发实践。其中一个最重要的工具就是 tinderbox 系统,它在许多不同的平台上持续地构建和测试源树。
The Pragmatic Programmers:敏捷软件开发实践方面的经典著作。
Apache Tomcat:Fedora Core 4 捆绑了 Apache Tomcat 应用程序服务器。在这里可以找到完整文档。
XStream:这篇文章用 XStream 项目的源树作为示例项目。
Java 技术专区:数百篇关于 Java 编程各方面的文章。
获得产品和技术
CVS和Subversion:把源代码置于版本控制之下。
JUnit:JUnit 是 Java 编程流行的单元测试框架。
Maven:Apache Maven 项目提供的构建系统集成了许多最佳实践,包括 JUnit。
Fedora Core 4:这个 Linux 发行版是这篇文章描述的构建服务器的基础。
JPackage:JPackage 项目源自对 Java 项目进行 RPM 打包,Fedora 项目采用了这一技术。项目不能把 Sun JDK 作为 RPM 重新进行发布,但是您可能找到自行构建 RPM 的指南和 RPM 规范文件。
Fedora Core development repository:在这里可以获得更新的 Xerces 包。只需对 xerces-j2-2.6.2-4jpp_8fc 包做最小的更新;xerces-j2-2.6.2-5jpp_2fc 是从仓库中可以得到的最新版本。
XMLStarlet:这个命令行程序支持在 XML 文档上执行有用的操作。
daemontools:D. J. Bernstein 的 daemontools 可以让 CruiseControl 一直运行。
文章来源于领测软件测试网 https://www.ltesting.net/