`

用CruiseControl监视你的项目

阅读更多

官方网站: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构建能力。

 


使用CruiseControl创建你的Build Grid

 


如果您一直跟着这个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,如下所示:

<cruisecontrol>
    <project name="CI_TWO_connectFour">

        <listeners>
            <currentbuildstatuslistener file="Z:/${project.name}/status.txt"/>
                  <!-- 请注意这里的z: -->
        </listeners>

        <bootstrappers>
            <svnbootstrapper localWorkingCopy="projects/${project.name}" />
        </bootstrappers>

        <modificationset quietperiod="30">
            <svn localWorkingCopy="projects/${project.name}"/>
        </modificationset>

        <schedule interval="300">
            <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
        </schedule>

        <log dir="Z:/">
                <!-- 请注意这里的z: -->
            <merge dir="projects/${project.name}/target/test-results"/>
        </log>

        <publishers>
            <onsuccess>
                <artifactspublisher dest="Y:/${project.name}" file="projects/${project.name}/target/connectfour.jar"/>
            <!-- 请注意这里的Y: -->
                </onsuccess>
        </publishers>

    </project>
</cruisecontrol>

(5) 修改启动脚本

打开CruiseControl.bat文件,找到下面这行代码:

set EXEC=%JAVA_PATH% %CC_OPTS% -Djavax.management.builder.initial=mx4j.server.MX4JMBeanServerBuilder -jar "%LAUNCHER%" %* -jmxport 8000 -
webport 8080 -rmiport 1099

将下面这段代码:


-dashboardrul http://192.168.1.6:8080/dashboard加入到上面的代码后,最后的代码如下: set EXEC=%JAVA_PATH% %CC_OPTS% -Djavax.management.builder.initial=mx4j.server.MX4JMBeanServerBuilder -jar "%LAUNCHER%" %* -jmxport 8000 -
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错误。

 


CruiseControl定时触发构建

 


CruiseControl倾向于通过源码变化来自动触发构建,但仍提供了几种方式来定时触发构建,以达到nightly building的效果。

在开始配置之前,先说明一下config.xml文件中Project元素的相关属性。


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 interval="3600">
            <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" />
        </schedule>

二、每天触发一次
       主要使用Schedule元素中各种构建器(如ant,nant,rake等)的time属性。time属性的格式为hhmm,例如2300就表示晚上十一点。
        <schedule>
            <ant anthome="xxxxxx" buildfile="projects/${project.name}/xxxxx.xml" time="2300"/>
        </schedule>   
当然,也可以使用pause子元素来指定在某段时间内不构建,如白天上班时间不构建,其它时间每隔一小时构建一次可用如下配置表示:
        <schedule interval="3600">
            <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
            <pause starttime="0800" endtime="1800"/>
        </schedule>

三、每周触发一次
       主要使用Schedule元素中各种构建器(如ant,nant,rake等)的time及day属性。day属性值为英文星期几且大小写不敏感,如sunday。
        <schedule>
            <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"  day="Sunday"/>
        </schedule>如果想指定具体时间,可以同时使用time属性,例如星期日的晚上十一点可以表示如下:
        <schedule>
            <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" time="2300" day="Sunday"/>
        </schedule>
需要说明的是,如果项目的构建时间长于指定的时间间隔,则构建次数会少于理想次数。例如设置每小时构建一次,但是每次构建要花费一个半小时。
另外,day属性还不支持多天,即不支持day="Monday Wednesday Friday"这种设置方式。如果想达到每隔一天构建一次的话,只能使用Schedule的interval属性。

个人建议,CruiseControl最好将触发事件写在各种Builder之外,而当前情况是:如果该Builder不支持time和day属性(如exec),可能就无法象上面所说的那样配置了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics