转自:http://blog.youkuaiyun.com/tony1130/archive/2008/01/20/2054643.aspx
官方网站:http://cruisecontrol.sourceforge.net/main/configxml.html
用CruiseControl监视你的项目
现在,我们已经为自己的项目建立了持续集成服务器。让我们来看一下CruiseControl正在对你说些什么。
一、项目的状态
首先CruiseControl把项目分成三类,Discontinued,Inactive,及Active。
如果一个项目是Discontinued,表示CruiseControl可以找到该项目的日志文件,但在配置文件(Config.xml)中并没有该文件。所以CruiseControl不会去构建它,但你可以看到这个项目过去构建的历史信息。如果想把这个项目从CruiseControl中删除,只有把该项目的日志目录删除才行。如果该项目名为"vcdstore",目录当该是${CruiseContor.Home}/logs/vcdstore。
如果一个项目是Inactive,表示CruiseControl在配置文件(Config.xml)中发现了该项目,但是没有发现关于这个项目的任何历史信息,即在CruiseControl的日志目录中还没有该项目的日志文件,或日志文件被人为删除了。CruiseControl会根据配置信息对这个项目进行检查新版本并进行构建。当第一次构建完成后,CruiseControl就会生成日志,这个项目状态就会转为Active了。
如果一个项目是Active,表示CruiseControl即可以找到该项目的日志文件,又在配置文件(Config.xml)中可以发现它。此时,这个项目可能是构建成功,也可能是构建失败,还可能是构建中。
二、Dashboard
你可以通过 http://localhost:8080/dashboard 访问Dashboard。
Dashboard主要有四个页面,它们分别是Dashboard,Builds,Build Details和Administatiorn。
(1) Dashboard
你可以在Dashboard上看到所有项目的状态, 红色方块表示该项目最近一次构建是失败的。 绿色方块表示该项目最近一次构建是成功的。灰色方块表示该项目可能是Inactive的,也可能是Discontinued。当把鼠标放在小方块上时,会显示该项目的主要信息。点击小方块,会进入Build Details页面。
(2) Builds
你可以在Builds页面上以列表的方式看到所有项目的状态,点击每个列表,可以进行Build Details页面。
如果你将ForceBuild配置为true,在列表右侧有一个按钮,你可以强迫该项目进行构建,而不必等到其下一次检查,也不必等到它有版本变化。
(3) Build Details
此页面会列出该项目某次构建的详细信息,包括与上次构建相比有哪些变化,测试结果是什么,详细的日志输出,如果构建成功的话,在配置文件(config.xml)中配置的Artifacts也会在名为Artifacts的tab页上看到。
右侧的列表是该项目所有的构建列表,点击其中一个构建,你就可以得到该次构建的详细信息。
(4) Administration
该页面你可以看到About和Configuration两个子标签。
在About子标签中,你可以看到CruiseControl所用的环境信息,如CruiseControl的版本号、所用的操作系统和JDK版本等。
在Administration子标签中,你可以看到CruiseControl的Dashboard-config.xml文件内容。在该版本中,还不支持修改,也移除了"Add Project"按钮。
三、CruiseControl Reporting
你也可以通过链接http://localhost:8080/ 来访问CruiseControl的Old Reporting。
点击项目名称,可以看到详细内容。
四、CruiseControl JMX控制台
你也可以通过链接http://localhost:8000/来访问CruiseControl的JMX控制台。
在控制台上点击项目名称(如connectfour),可以修改项目配置,暂停/恢复项目构建等。

小贴士:
(1) 以上的链接均以不修改CruiseControl默认配置为基础。
(2) 接下来,我们会介绍如何通过Build Grid来推展我们的CruiseControl构建能力。
如果您一直跟着这个Thread,那么现在你应该已经可以使用CruiseControl来进行持续集成了。如果你有很多项目需要持续集成的话,可能在同一时刻会有很多项目排队等待构建的现象,以至于使各项目团队无法得到及时的反馈,此时一个集成服务器就不够了。下面我们就来扩展我们的Build Grid吧。
一、前提条件与假设
根据前面的介绍,你的第一台持续集成服务器已经可以正常运行了。这里列出如下假设,以方便后续描述。
(1) 首台持续集成服务器IP地址为:192.168.1.6,hostname为CI_One。
(2) 在首台持续集成服务器上:
CruiseControl的根目录是:C:/CruiseControl,今后用${CC.HOME}表示。
CruiseControl的Projects目录是:C:/CruiseControl/Proects,今后用${CC.Projects}表示。
CruiseControl的Logs目录是:C:/CruiseControl/Logs,今后用${CC.Logs}表示。
CruiseControl的Artifacts目录是:C:/CruiseControl/Artifacts,今后用${CC.Artifacts}表示。
(3) 你将在IP地址为:192.168.1.8,hostname为CI_Two的机器上部署第二个持续集成服务器。
(4) 把名为CI_One的机器做为主服务器,即把CI_Two上构建的日志(Logs)和结果(Artifacts)放发布到CI_One的${CC.Logs}和${CC.Artifacts}中。
(5) 你将在CI_Two上构建名为CI_TWO_connectFour的项目,它也使用SVN作为项目的SCM。
二、准备工作
(1) 将CI_One上的${CC.Logs}和${CC.Artifacts}设为共享目录,保证CI_Two对这两个目录可写。
(2)可以在CI_Two上,把CI_One的${CC.Logs}和${CC.Artifacts}两个目录分别映射成两个网络驱动器,名字为别为Z:/和Y:/。
(3) 将CI_One上的CruiseControl,整个拷贝到CI_Two上的C盘根目录下,即对于CI_Two来说,CruiseControl的工作目录是C:/CruiseControl。(当然,也可以把一个你编译后生成的CruiseControl拷贝过来。)
(4) 在CI_Two的${CC.Projects}目录下,建立名为CI_TWO_connectFour的目录,把SVN中的源代码checkout到这个目录下,并确保build.xml文件在这个目录下。
三、第二台持续集成服务器的配置工作
以下所有工作全部发生在名为CI_Two这台机器上。
(4) 修改配置文件config.xml,如下所示:





<!-- 请注意这里的z: -->















<!-- 请注意这里的z: -->







</ onsuccess >




(5) 修改启动脚本
打开CruiseControl.bat文件,找到下面这行代码:

webport 8080 -rmiport 1099
将下面这段代码:


webport 8080 -rmiport 1099 -dashboardrul http: // 192.168 . 1.6 : 8080 / dashboard
保存该文件。
四、运行Build Grid
(1) 运行${CC.Home}中的CruiseControl.bat,启动CI_One上的CruiseControl。
(2) 运行${CC.Home}中的CruiseControl.bat,启动CI_Two上的CruiseControl。
五、访问你的Build Grid
(1) 在任何一台可以访问CI_One的机器上,通过浏览器访问下面的网址http://192.168.1.6:8080/dashboard 来查看你构建的项目。当然,使用hostname也可以。因为CruiseControl内置了一个Jetty应用服务器,版本是6.1。
(2) 你同样可以使用http://CI_One:8080/ 访问CI_One的Old Reporting 页面,用http://CI_Two:8080/访问CI_Two的Old Reporting。不过你会发现,你在CI_Two上配置的项目状态在CI_One的Old Reporting页面都显示为?????。这就是Old Reporting 的局限性。
小贴士:
(1) 要保证所有项目(无论在哪台机器上构建)的项目名都不相同,否则,CruiseControl的DashBoard只会选取其中的一个同名项目,忽略其它的同名项目。
(2) 在CI_Two中启动脚本中,一定要正确填写DashBoardURL参数,确保是CI_One的地址和端口。
(3) 如果项目的log文件比较大,或者构建时使用内存较多,在启动脚本中,可以通过增加JAVA命令行参数,扩大JVM的内存,以免出现OutOfMemory错误。
- Project 元素对应你的一个需要构建的项目。其中:
- name为其指定名称。
- buildafterfailed 表示本次构建失败,是否要求CruiseControl继续下一次构建。
- 当设置为true时,表示如果本次构建失败,即使没有任何人检入代码,间隔时间一到,CruiseControl也构建它。
- 当设置为false时,表求如果本次构建失败,如果没有任何人检入代码,CruiseControl就不会再次构建它。
- 其默认值是true。
- requireModification表示是否需要源文件发生变化才进行构建。
- 当设置为true时,CruiseControl会根据modificationset元素的设置对源文件进行检查。
- 当设置为false时,CruiseControl仅根据Schedule元素的设置进行定时构建。
- 其默认值是true。
- forceOnly表示是否只能手工构建。
- 当设置为true时,用户只能通过手工启动该项目的构建。
- 当设置为false时,表示即可以根据条件自动构建,用户也可以通过手工构建(前提dashboard-config.xml中的配置必须是true)。
- 其默认值是false。
为了达到定时构建的目的,首先要将Config.xml文件中该项目Project元素的requireModification属性设置为false。
一、每小时触发一次
设置Schedule元素的interval属性值为3600,即表示每小时会计划构建一次,由于requireModification已经设置为false,所以无论如何,CruiseControl都会构建。例如:



二、每天触发一次
主要使用Schedule元素中各种构建器(如ant,nant,rake等)的time属性。time属性的格式为hhmm,例如2300就表示晚上十一点。







三、每周触发一次
主要使用Schedule元素中各种构建器(如ant,nant,rake等)的time及day属性。day属性值为英文星期几且大小写不敏感,如sunday。






需要说明的是,如果项目的构建时间长于指定的时间间隔,则构建次数会少于理想次数。例如设置每小时构建一次,但是每次构建要花费一个半小时。
另外,day属性还不支持多天,即不支持day="Monday Wednesday Friday"这种设置方式。如果想达到每隔一天构建一次的话,只能使用Schedule的interval属性。
个人建议,CruiseControl最好将触发事件写在各种Builder之外,而当前情况是:如果该Builder不支持time和day属性(如exec),可能就无法象上面所说的那样配置了。