CruiseControl
简介及使用举例
本文使用CVSNT作为源代码管理的服务器,使用wincvs作为客户端。在继续进行之前,要确保在系统上已经安装CVSNT和winCvs 。
一、下载
CruiseControl目前最新发布的版本是 V 2.6.2 ,可以从 http://cruisecontrol.sourceforge.net 下载.
二、安装
1、目录结构
在windows下的使用的是可执行文件:CruiseControl-2.6.2.rc1.exe,安装完毕后目录下包括: 2、文件及目录的说明:
cruisecontrol.bat 启动文件 ;
config.xml 配置文件 (默认的配置文件名称 );
apache-ant-1.6.5 是CruiseControl自带的ant环境,CruiseControl要借助ant完成一些指定的任务 ;
docs 包括CruiseControl的使用文档和一个helloworld的使用范例 ;
lib 是运行需要的jar包 ;
logs 日志目录,构建时产生的log存储于此 ;
project 需要构建的项目所在目录,也是checkout默认的目录,所有的构建项目在project均以项目名为目录;在project目录下,有一个自带的项目connectfour,包含了src、lib、test和build.xml。
webapps web 应用目录。CruiseControl内置了jetty作为web容器,可以通过web方式查看构建结果和手动创建项目 ;
artifacts 输出目录,集成后生成的jar就保存在这里。上图是刚刚安装,所以这个目录还没有。 三、第一次接触 安装完毕后,在cmd提示符下,进入cruisecontrol.bat所在目录。
执行: > cruisecontrol 1、控制端输出信息
控制端会输出一大堆的信息,还有一些错误。不要紧,这是由于CruiseControl默认的配置是使用svn导致的。后面会对此做修改。执行完毕后,程序不会退出,处于等待状态。 2、查看文件内容变化 查看cruisecontrol 目录,会发现多出来三个文件。artifaces就是上面提过的保存构建结果的目录。
查看artifaces目录可以看到新生成的connectfour项目的内容,包括connectfour.jar 。 3、以web方式查看 打开浏览器,访问 http://127.0.0.1:8080/ 会看到CruiseControl的界面。
关闭cmd 控制台或退出CruiseControl,进行下一步。 三、配置 为了能让CruiseControl 正常工作,需要进行合理的配置。 CruiseControl(以下简称 CC) 主要有两个配置文件:
一个是config.xml,是CC初始化、调度等任务参数的配置;
一个是build.xml,ant执行的配置文件,CC借助ant完成指定的任务,如checkout、compile、jar、test等。 四、举例 下面根据一个例子来说明使用的步骤。 1、复制docs/main下的helloworld目录到project目录下。
2 、在project/helloworld目录保留src目录和cvs-build.xml文件,其他的全部删除。
注意:这些文件的原始文件还在docsmain下,以后可能你会用得着。
3 、修改文件名 cvs-build.xml 为 build.xml。
4 、修改build.xml文件:只需要修改property部分的内容,其他内容不变:
A 、注释掉build.compiler和build.compiler.emacs <!--property name="build.compiler" value="jikes"/-->
<!--property name="build.compiler.emacs" value="true"/--> B、修改 cvs.repository 为你的CVSNT的访问参数: < property name ="cvs.repository" value =":pserver:cvsUserName:cvsPassworld@127.0.0.1:/ cvsroot "/> * 注意此处的 ”cvsroot ” 为你在 CVS 服务器中所建立的服务名 C、修改cvs.package为模块名称也就是需要构建的项目名称,这里是helloworld < property name ="cvs.package" value ="helloworld"/> D、将dist.dir的值改为 target,这是发布目录,要求和config.xml文件中指定值保持一致。 < property name ="dist.dir" value ="target"/>
完整的property修改如下: <!--property name="build.compiler" value="jikes"/-->
<!--property name="build.compiler.emacs" value="true"/-->
< property name ="build.dir" value ="classes"/>
< property name ="dist.dir" value ="target"/>
< property name ="logdir" value ="logs"/>
< property name ="source.dir" value ="src"/>
< property name ="junit.results" value ="test-results"/>
< property name ="cvs.repository" value =":pserver:cvsUserName:cvsPassworld@127.0.0.1:/cvsroot "/> <!-- * 注意此处的 ”cvsroot ” 为你在 CVS 服务器中所建立的服务名 -->
< property name ="cvs.package" value ="helloworld"/> 5、修改 config.xml A、修改project的name属性值为构建项目的名称 helloworld < project name ="helloworld">
B 、将 svnbootstrapper 改为 cvsbootstrapper < svnbootstrapper localWorkingCopy ="projects/$" />
C 、将 svn 改为 cvs < svn localWorkingCopy ="projects/$"/>
D 、将 merge 属性dir的值改为 projects/$/target/test-results < merge dir ="projects/$/target/test-results"/>
修改后完整的 config.xml 如下: <cruisecontrol> <project name="helloworld"> <listeners> <currentbuildstatuslistener file="logs/${project.name}/status.txt"/> </listeners> <bootstrappers> <cvsbootstrapper localWorkingCopy="projects/${project.name}" /> </bootstrappers> <modificationset quietperiod="5"> <cvs localWorkingCopy="projects/${project.name}"/> </modificationset> <schedule interval="300"> <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/> </schedule> <log> <merge dir="projects/${project.name}/test-results"/> </log> <publishers> <onsuccess> <artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/> </onsuccess> </publishers> </project> </cruisecontrol> 6、用wincvs 将project/helloworld 导入CVS(即你在CVS服务器中所建的仓库)中 7、将 project/helloworld 删除 8、将helloworld 从CVS(即你在CVS服务器中所建的仓库)中checkout 到project目录 9、将CVSROOT从CVS(即你在CVS服务器中所建的仓库)中checkout到project目录 10、在CVSROOT目录中创建一个文件 users 没有扩展名,文件的内容为: # CruiseControl login mapping email configuration
# $Id$
cvsUserName:cvsUserName@127.0.0.1 说明一下:(这一步很重要否则无法访问 cvs)
cvsUserName是在project/helloworld目录下的 build.xm文件中设置的 cvs.repository属性中值一部分,就是访问CVS的用户名。使用冒号(:)做映射,映射的值为该CVS用户名加上@符号,再加上CVS服务的ip。 然后将users文件 checkin 到 CVS服务器中。这时候,project中的CVSROOT目录已经没用了,可以删除。 11、运行 CruiseControl
没有任何错误。
在artifacts目录可以看到helloworld项目和以生成时间命名的目录,目录内是项目的输出jar 。
相应的project/helloworld和logs/helloworld也生成对应的文件和测试目录等,不再细述。 12、通过 web方式查看
通过浏览器访问 http://127.0.0.1:8080 会看到CC的首页面,如下图: 图上说明了项目构建的时间、是否成功和构建的标号。还可以通过手动点击Build按钮除法CC立即执行构建任务。否则CC会等待下一次构建时间(在config.xml中,schedule的属性interval的值以秒为单位设定构建执行的间隔时间,默认为5分钟 )
点击 helloworld 可以查看项目构建细节。 二查看结果 1 、左侧菜单 ( 下图 ) 。
可以切换到其他项目和项目列表,显示当前项目构建的历史记录。 2、构建结果(下图)。
显示单元测试的是否通过情况,被修改的文件列表等,连接到构建结果jar的下载页面。 3、单元测试情况(下图)
查看详细的测试类和测试方法、测试结果。 4、统计图表(下图) 5、控制面板(下图)
五、持续构建 以上这些就是持续构建的全部吗?不! 1、修改 projects/helloworld/src/hello下的HelloWorld.java文件,比如加一个空格。 2、将HelloWorld.java 的变化提交到CVS服务器。 3、等5分钟...5分钟一到,CC会自动从CVS服务器上检测到文件的变化,然后checkout到project/helloworld目录下进行构建:包括编译、测试、打包、发布等。 CC解决对于那些开发模式是项目一开始就划分模块,然后等所有的代码都开发完成之后再集成到一起进行测试,到最后集成的时候才发现问题,开发者需要在集成阶段花费大量的时间来寻找 bug 的根源,加上软件的复杂性,问题的根源很难定位,甚至出现不得不调整底层架构的情况。
在windows下的使用的是可执行文件:CruiseControl-2.6.2.rc1.exe,安装完毕后目录下包括: 2、文件及目录的说明:
cruisecontrol.bat 启动文件 ;
config.xml 配置文件 (默认的配置文件名称 );
apache-ant-1.6.5 是CruiseControl自带的ant环境,CruiseControl要借助ant完成一些指定的任务 ;
docs 包括CruiseControl的使用文档和一个helloworld的使用范例 ;
lib 是运行需要的jar包 ;
logs 日志目录,构建时产生的log存储于此 ;
project 需要构建的项目所在目录,也是checkout默认的目录,所有的构建项目在project均以项目名为目录;在project目录下,有一个自带的项目connectfour,包含了src、lib、test和build.xml。
webapps web 应用目录。CruiseControl内置了jetty作为web容器,可以通过web方式查看构建结果和手动创建项目 ;
artifacts 输出目录,集成后生成的jar就保存在这里。上图是刚刚安装,所以这个目录还没有。 三、第一次接触 安装完毕后,在cmd提示符下,进入cruisecontrol.bat所在目录。
执行: > cruisecontrol 1、控制端输出信息
控制端会输出一大堆的信息,还有一些错误。不要紧,这是由于CruiseControl默认的配置是使用svn导致的。后面会对此做修改。执行完毕后,程序不会退出,处于等待状态。 2、查看文件内容变化 查看cruisecontrol 目录,会发现多出来三个文件。artifaces就是上面提过的保存构建结果的目录。
查看artifaces目录可以看到新生成的connectfour项目的内容,包括connectfour.jar 。 3、以web方式查看 打开浏览器,访问 http://127.0.0.1:8080/ 会看到CruiseControl的界面。
关闭cmd 控制台或退出CruiseControl,进行下一步。 三、配置 为了能让CruiseControl 正常工作,需要进行合理的配置。 CruiseControl(以下简称 CC) 主要有两个配置文件:
一个是config.xml,是CC初始化、调度等任务参数的配置;
一个是build.xml,ant执行的配置文件,CC借助ant完成指定的任务,如checkout、compile、jar、test等。 四、举例 下面根据一个例子来说明使用的步骤。 1、复制docs/main下的helloworld目录到project目录下。
2 、在project/helloworld目录保留src目录和cvs-build.xml文件,其他的全部删除。
注意:这些文件的原始文件还在docsmain下,以后可能你会用得着。
3 、修改文件名 cvs-build.xml 为 build.xml。
4 、修改build.xml文件:只需要修改property部分的内容,其他内容不变:
A 、注释掉build.compiler和build.compiler.emacs <!--property name="build.compiler" value="jikes"/-->
<!--property name="build.compiler.emacs" value="true"/--> B、修改 cvs.repository 为你的CVSNT的访问参数: < property name ="cvs.repository" value =":pserver:cvsUserName:cvsPassworld@127.0.0.1:/ cvsroot "/> * 注意此处的 ”cvsroot ” 为你在 CVS 服务器中所建立的服务名 C、修改cvs.package为模块名称也就是需要构建的项目名称,这里是helloworld < property name ="cvs.package" value ="helloworld"/> D、将dist.dir的值改为 target,这是发布目录,要求和config.xml文件中指定值保持一致。 < property name ="dist.dir" value ="target"/>
完整的property修改如下: <!--property name="build.compiler" value="jikes"/-->
<!--property name="build.compiler.emacs" value="true"/-->
< property name ="build.dir" value ="classes"/>
< property name ="dist.dir" value ="target"/>
< property name ="logdir" value ="logs"/>
< property name ="source.dir" value ="src"/>
< property name ="junit.results" value ="test-results"/>
< property name ="cvs.repository" value =":pserver:cvsUserName:cvsPassworld@127.0.0.1:/cvsroot "/> <!-- * 注意此处的 ”cvsroot ” 为你在 CVS 服务器中所建立的服务名 -->
< property name ="cvs.package" value ="helloworld"/> 5、修改 config.xml A、修改project的name属性值为构建项目的名称 helloworld < project name ="helloworld">
B 、将 svnbootstrapper 改为 cvsbootstrapper < svnbootstrapper localWorkingCopy ="projects/$" />
C 、将 svn 改为 cvs < svn localWorkingCopy ="projects/$"/>
D 、将 merge 属性dir的值改为 projects/$/target/test-results < merge dir ="projects/$/target/test-results"/>
修改后完整的 config.xml 如下: <cruisecontrol> <project name="helloworld"> <listeners> <currentbuildstatuslistener file="logs/${project.name}/status.txt"/> </listeners> <bootstrappers> <cvsbootstrapper localWorkingCopy="projects/${project.name}" /> </bootstrappers> <modificationset quietperiod="5"> <cvs localWorkingCopy="projects/${project.name}"/> </modificationset> <schedule interval="300"> <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/> </schedule> <log> <merge dir="projects/${project.name}/test-results"/> </log> <publishers> <onsuccess> <artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/> </onsuccess> </publishers> </project> </cruisecontrol> 6、用wincvs 将project/helloworld 导入CVS(即你在CVS服务器中所建的仓库)中 7、将 project/helloworld 删除 8、将helloworld 从CVS(即你在CVS服务器中所建的仓库)中checkout 到project目录 9、将CVSROOT从CVS(即你在CVS服务器中所建的仓库)中checkout到project目录 10、在CVSROOT目录中创建一个文件 users 没有扩展名,文件的内容为: # CruiseControl login mapping email configuration
# $Id$
cvsUserName:cvsUserName@127.0.0.1 说明一下:(这一步很重要否则无法访问 cvs)
cvsUserName是在project/helloworld目录下的 build.xm文件中设置的 cvs.repository属性中值一部分,就是访问CVS的用户名。使用冒号(:)做映射,映射的值为该CVS用户名加上@符号,再加上CVS服务的ip。 然后将users文件 checkin 到 CVS服务器中。这时候,project中的CVSROOT目录已经没用了,可以删除。 11、运行 CruiseControl
没有任何错误。
在artifacts目录可以看到helloworld项目和以生成时间命名的目录,目录内是项目的输出jar 。
相应的project/helloworld和logs/helloworld也生成对应的文件和测试目录等,不再细述。 12、通过 web方式查看
通过浏览器访问 http://127.0.0.1:8080 会看到CC的首页面,如下图: 图上说明了项目构建的时间、是否成功和构建的标号。还可以通过手动点击Build按钮除法CC立即执行构建任务。否则CC会等待下一次构建时间(在config.xml中,schedule的属性interval的值以秒为单位设定构建执行的间隔时间,默认为5分钟 )
点击 helloworld 可以查看项目构建细节。 二查看结果 1 、左侧菜单 ( 下图 ) 。
可以切换到其他项目和项目列表,显示当前项目构建的历史记录。 2、构建结果(下图)。
显示单元测试的是否通过情况,被修改的文件列表等,连接到构建结果jar的下载页面。 3、单元测试情况(下图)
查看详细的测试类和测试方法、测试结果。 4、统计图表(下图) 5、控制面板(下图)
五、持续构建 以上这些就是持续构建的全部吗?不! 1、修改 projects/helloworld/src/hello下的HelloWorld.java文件,比如加一个空格。 2、将HelloWorld.java 的变化提交到CVS服务器。 3、等5分钟...5分钟一到,CC会自动从CVS服务器上检测到文件的变化,然后checkout到project/helloworld目录下进行构建:包括编译、测试、打包、发布等。 CC解决对于那些开发模式是项目一开始就划分模块,然后等所有的代码都开发完成之后再集成到一起进行测试,到最后集成的时候才发现问题,开发者需要在集成阶段花费大量的时间来寻找 bug 的根源,加上软件的复杂性,问题的根源很难定位,甚至出现不得不调整底层架构的情况。