分享到
CruiseControl持续集成
 

作者: yhmhappy2006,发布于2012-8-23,来源:博客

 

1. 认识CruiseControl

CruiseControl是CI服务器的老者,诞生已是多年,在许多方面,CruiseControl服务器已经成为持续集成实践的同义词。而现在,CruiseControl已发展成为一个家族式系统,包括CruiseControl.java、CruiseControl.net、CruiseControl.ruby等适应不同语言环境的实现,其强大的插件和扩展能力也是诸多同类系统无法比你的。而在这里,我只介绍该家族的本家CruiseControl.java,即CruiseControl。

下图是CruiseControl系统的架构图:

CruiseControl系统架构图

图中我们可以看到,CruiseControl系统的主体是Build Loop机制,它采用了Source Code轮询机制,对持续集成环境的状态进行定时检测,并根据config.xml配置信息做出相应处理。CruiseControl服务器则使用HTTP和RMI机制将持续集成服务公开到Reporting模块,同时使用XML数据格式对每次集成的数据进行归档。同时CruiseControl还可以集成了RSS、IM、E-MAIL等信息发布机制,最大程度将信息广播到团队的每个成员。

CruiseControl系统集成循环的流程图见下图,图中显示了CruiseControl使用轮询机制对版本库进行检测,并对发生变更的代码进行预定操作的流程:

CruiseControl系统运行流程图

2. CruiseControl的安装

CruiseControl的安装有许多方式。例如,如果使用Windows,会发现最简单的方式是下载二进制可执行文件,然后运行它。不用担心,还可以下载源代码。

安装之后,CruiseControl预先配置了一个配置文件,轮询CVS(或其它版本控制系统)存储库并执行ANT构建脚本。服务环境不需要安装Web服务器,CruiseControl已经内嵌了Jetty web服务程序。

3. CruiseControl的配置

当CruiseControl服务器启动时,会自动检测配置信息中的任务信息,并对其进行校验和初始化,之后所有的工作,都是依据该配置信息进行的。

CruiseControl的配置使用了其安装目录下的config.xml文件,我们可以通过任一文本编辑器打开该配置文件,编辑各种配置信息。配置信息的定义遵循了标准XML文件格式,同时遵循了ANT自动构建配置信息的规则,因此建立一个普通工程的配置信息并非难事。

一个典型的配置文件如下所示:

<cruisecontrol>
    <project name="BMSAssess">
        <listeners>
            <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        </listeners>
        <bootstrappers>
            <svnbootstrapper localWorkingCopy="projects/BMS/${project.name}" />
        </bootstrappers>
        <modificationset quietperiod="30">
            <svn localWorkingCopy="projects/BMS/${project.name}/src/${project.name}"/>
        </modificationset>
        <schedule interval="300">
            <ant anthome="apache-ant-1.6.5" buildfile="projects/BMS/${project.name}/src/${project.name}/build.xml"/>
        </schedule>
        <log>
            <merge dir="projects/BMS/log/${project.name}/target/test-results"/>
        </log>
    </project>
</cruisecontrol> 

配置文件有一个cruisecontrol根结点,其下则是代表一个项目的project子节点,再下层是项目的具体配置,在此示例中,存在了listeners、bootstrappers、modificationset、schedule、log几个节点,分别代表了监听器、本地目录、变更目录、构建任务、日志工作。

3.1. 创建一个项目

<project name="BMSAssess">
    <listeners>
        <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
</listeners>
...............
</project> 

一个持续集成项目是从project节点开始的,可以对该项目进行的操作都会作为子节点存在与该节点之下。对于每一个project节点,CruiseControl系统都会将其当作一个处理单元,并在最初建立该项目的时候进行初始化操作。

name是project节点常用的属性,也是必设且值唯一的属性,该属性的值会在整个CruiseControl系统使用,包括配置文件的${project.name}变量值。

在一个项目节点中,我们可以定义监听器、本地目录位置、变更轮询目录位置、轮询间隔、任务执行、单元测试、日志记录等多种项目操作,同时CruiseControl系统支持插件扩展功能,这些扩展插件可以直接在一个项目中使用。

3.2. 轮询版本控制系统

版本库轮询机制是使用modificationset进行配置的。CruiseControl系统内置的轮询模块会根据设定的时间段对版本库进行检测,一旦发现版本库发生变更,就会调用Check OutàBuildàTestàPublish等一系列的操作,对最新的代码进行集成,并运行一系列预先设定的任务。

CruiseControl支持十多种版本控制系统,比如CVS、SVN、Starteam、VSS等,对这些版本控制系统的调用,只需要配置相应的节点名称即可。本文以SVN版本管理系统为例。

在modificationset节中,我们看到唯一的一个子节点:

<svn localWorkingCopy="projects/BMS/${project.name}/src/${project.name}"/>

该节点使用了svn关键字,表示当前工程使用的版本控制系统是SVN,localWorkingCopy属性的值是告诉CruiseControl本地的拷贝目录(拷贝目录概念详见SVN官方文档),其余的工作则由CruiseControl内置的操作模块进行。

3.3. 执行构建脚本

实质上,执行构建脚本也是CruiseControl的一个可定制任务,但由于自动构建是持续集成的一个重要组成部分,因此在此单独提出。

CruiseControl的自动构建是使用ANT工具来进行的,当然我们也可以使用其它的自动构建工具来替代(比如Maven),这些的工具仅仅是体现在一个任务配置语句上,在此,以ANT工具为例。

在schedule节,我们同样使用了一个子节点来描述自动构建工作:

<ant anthome="ant6" buildfile="projects/BMS/${project.name}/src/${project.name}/build.xml"/>

该节点使用了ant关键字,表示该任务使用了ant来进行自动构建任务,anthome属性则指定了ANT工具的具体位置,buildfile属性则指定了ANT进行自动构建所使用的配置文件Build.xml文件的路径。

这样,在CruiseControl决定进行自动构建任务时,会根据设定找到执行所使用到的信息。

3.4. 执行单元测试

CruiseControl可以自动侦测自动构建配置文件中单元测试的任务,并在代码集成完毕将执行结果反馈到相应的模块。

ANT支持xUnit系列的单元测试框架,只需要在配置文件中加入一个target节,即可在自动构建完成之后,进行单元测试工作,有关的详细配置,请参阅ANT官方文档。

4. CruiseControl的使用

4.1. 启动CruiseControl服务器

通过上一节的配置,CruiseControl系统已经可以正常运行并管理项目了。我们可以通过执行其安装目录下的cruisecontrol.bat文件来启动CruiseControl。控制台显示“BuildQueue - BuildQueue started”,则说明CruiseControl服务器已成功启动,如下图:

CruiseControl服务器已成功启动

在启动服务器之前,我们可以打开cruisecontrol.bat文件并修改倒数第三行相应功能的端口数值来指定服务器占用的系统端口,在本例中我们将-webport指定到了8082端口。

4.2. 管理工程

服务器启动之后,我们便可以使用http://IP:8082/来访问CruiseControl的Web服务器(注:将IP替换成CruiseControl服务器所在主机的IP地址)。如下图所示:

CruiseControl服务器主界面

上图中我们可以看到,当前CruiseControl系统存在5个工程,列表中显示了各个工程的相关信息,包括当前状态、上次失败时间、上次成功时间、构建次数等信息,同时Build按钮可以让CruiseControl立即检测工程状态。

点击相应工程名称,则可以进入该工程的详细页面首页,我们在这里以BMSViewer工程为例,点击进入,如下图所示:

BMSViewer工程详细信息首页

BMSViewer工程详细信息首页清晰明了,主要包括了构建历史信息、最近构建结果、最近构建版本库信息等,该页面可以让我们对当前工程的集成信息一目了然,便于我们对不同的集成结果做出相应的处理。

页面上部的导航按钮可以让我们进入不同信息的查看界面,包括测试结果、XML详细日志文件、状态统计等信息。这些导航按钮根据工程设置的不同扩展任务而有所不同。

4.3. 工程状态统计图

通过工程首页可以清晰的看到当前工程代码级别的集成信息,但对于更加上层的统计图示信息,我们就需要进入Metrics页面,查看其构建衰减图、代码违背图,如图所示:

BMSViewer的工程状态统计图

图中主要显示了构建衰减图的比例图示和时间动态分布图,便于我们对工程的集成工作进行统一的控制和调配。

4.4. 使用publish扩展

在CruiseControl的主界面和工程的详细界面,我们都可以看到一个RSS的图标,该图标表示了当前CruiseControl系统提供了RSS新闻聚合功能,对于工程的构建结果,我们便可以使用RSS阅读器来获得,而不必登录Web服务器,如图所示:

工程详细页面的RSS按钮

下图则为使用Foxmail读取RSS聚合信息的截图:

Foxmail读取RSS聚合信息

5. 总结

持续集成为我们带来诸多好处,大量降低集成时间的同时,更重要的是它可以迅速对我们的工作做出反馈,增加了我们的勇气和信心,保证了项目的质量。持续集成已经不像以前只存在于理论的名词,只要你愿意你都可以实施持续集成。

当然这些好处是建立在制度的遵循和详尽的单元测试的基础上的,持续集成系统仅仅是我们项目过程中的一个工具而已,正如scm工具、单元测试一样。工具就是工具,而真正默默起作用的则是团队制度的完善,这也正体现了XP开发模式的原则――以人为本,快速反馈。


相关文章

每日构建解决方案
如何制定有效的配置管理流程
配置管理主要活动及实现方法
构建管理入门
相关文档

配置管理流程
配置管理白皮书
CM09_C配置管理标准
使用SVN进行版本控制
相关课程

配置管理实践
配置管理方法、工具与应用
多层次集成配置管理
产品发布管理

 
分享到
 
 
     


集成与构建指南
项目管理:Maven让事情变得简单
持续集成工具hudson
持续集成
Maven权威指南
程序集(UML中的包)之间循环
更多...   


产品发布管理
配置管理方法、实践、工具
多层次集成配置管理
使用CC与CQ进行项目实践
CVS与配置管理
Subversion管理员


海航股份 重构及持续集成
电研华源 设计原理、建模与重构
软件配置管理日构建及持续集成
单元测试、重构及持续集成
中国软件研发中心 单元测试与重构
单元测试、重构和持续集成实践
罗克韦尔 C++单元测试+重构+Gtest
更多...