CruiseContol:持续集成工具
CruiseContol:持续集成工具- -
安装CruiseControl
和AntHill一样,使用CruiseControl构建持续集成系统,需要Tomcat,Ant,CVSNT和WinCVS的支持(参见AntHill:构建Nightly Build系统)。安装CruiseControl很简单,下载cruisecontrol-2.2.zip(参见持续集成资源),解压到安装目录C:\BuildServer,即可完成安装。
安装Tomcat4.1到C:\BuildServer目录,并在C:\BuildServer目录创建workingCopy子目录,作为CruiseControl的工作目录。BuildServer的目录结构如下图所示,其中CruiseControl的启动脚本cruisecontrol.bat(或cruisecontrol.sh)位于BuildServer\cruisecontrol-2.2\main\bin目录下。
和AntHill一样,使用CruiseControl构建持续集成系统,需要Tomcat,Ant,CVSNT和WinCVS的支持(参见AntHill:构建Nightly Build系统)。安装CruiseControl很简单,下载cruisecontrol-2.2.zip(参见持续集成资源),解压到安装目录C:\BuildServer,即可完成安装。
安装Tomcat4.1到C:\BuildServer目录,并在C:\BuildServer目录创建workingCopy子目录,作为CruiseControl的工作目录。BuildServer的目录结构如下图所示,其中CruiseControl的启动脚本cruisecontrol.bat(或cruisecontrol.sh)位于BuildServer\cruisecontrol-2.2\main\bin目录下。

准备构建目录结构
1.创建CruiseControl的日志目录:C:\BuildServer\cruisecontrol-2.2\main\logs\frameworkProject。
2.创建CVS的工作目录:C:\BuildServer\workingCopy\frameworkProject。
3.创建工作目录的代码库目录:C:\BuildServer\workingCopy\frameworkProject\lib。
4.创建工作目录的单元测试报告目录:C:\BuildServer\workingCopy\frameworkProject\reports\junit\data。
5.创建工作目录的jar文件存放目录:C:\BuildServer\workingCopy\frameworkProject\dist。
初始化代码工作目录
在C:\BuildServer\workingCopy\frameworkProject目录下,使用WinCVS CheckOut src模块:cvs co src。
准备项目的依赖代码库
把构建项目的依赖代码库复制到C:\BuildServer\workingCopy\frameworkProject\lib。完成之后的目录结构如上图所示。
编写项目构建脚本
构建脚本build.xml和build-cc.xml位于C:\BuildServer\workingCopy\frameworkProject目录下。其中build.xml是项目的Ant构建脚本,而build-cc.xml负责帮助CruiseControl从CVS服务器上update源代码到本地的工作目录,然后调用build.xml构建项目。
build-cc.xml
<?xml version="1.0"?>
<project name="CruiseControlWrapperForFrameworkProject" default="build" basedir=".">
<target name="update">
<!-- update the working copy from the cvs -->
<exec executable="cvs">
<arg line="-d :pserver:talent:talent @10.75.140.128:/cvsroot update src"/>
</exec>
</target>
<target name="build" depends="update">
<!-- invoke the project's build script -->
<ant antfile="build.xml" target="jar"/>
</target>
</project>
<?xml version="1.0"?>
<project name="CruiseControlWrapperForFrameworkProject" default="build" basedir=".">
<target name="update">
<!-- update the working copy from the cvs -->
<exec executable="cvs">
<arg line="-d :pserver:talent:talent @10.75.140.128:/cvsroot update src"/>
</exec>
</target>
<target name="build" depends="update">
<!-- invoke the project's build script -->
<ant antfile="build.xml" target="jar"/>
</target>
</project>
build.xml
<?xml version="1.0"?>
<project name="frameworkProject" default="compile">
<description>
This is our framework project which we're putting on CruiseControl
</description>
<target name="setup" depends="setup.properties, setup.paths" />
<target name="setup.properties">
<property name="src.main" value="src" />
<!--<property name="src.test" value="src/test" />-->
<property name="classes" value="classes"/>
<property name="classes.main" value="${classes}/main" />
<!--<property name="classes.test" value="${classes}/test" />-->
<property name="libs" value="lib" />
<property name="dist" value="dist" />
<property name="reports" value="reports" />
<property name="reports.junit.data" value="${reports}/junit/data" />
</target>
<target name="setup.paths">
<path id="classpath.main">
<pathelement location="${classes.main}" />
</path>
<path id="classpath.lib">
<fileset dir="${libs}">
<include name="**/*.jar" />
</fileset>
</path>
</target>
<target name="clean" depends="setup">
<delete dir="${classes}" failonerror="false" />
<delete dir="${reports}" failonerror="false" />
<delete dir="${dist}" failonerror="false" />
</target>
<target name="compile" depends="setup, compile.main" />
<target name="compile.main" depends="setup">
<mkdir dir="${classes.main}" />
<javac srcdir="${src.main}" destdir="${classes.main}">
<classpath refid="classpath.lib" />
</javac>
</target>
<target name="compile.tests" depends="setup">
<mkdir dir="${classes.test}" />
<javac srcdir="${src.test}"
destdir="${classes.test}"
classpathref="classpath.lib" />
</target>
<target name="test" depends="compile">
<delete dir="${reports.junit.data}" failonerror="false" />
<mkdir dir="${reports.junit.data}" />
<junit printsummary="yes" haltonfailure="no"
failureproperty="tests.failed">
<classpath refid="classpath.lib" />
<formatter type="xml" />
<batchtest fork="yes" todir="${reports.junit.data}"
failureproperty="tests.failed">
<fileset dir="${src.test}">
<include name="**/*Test*.java" />
<exclude name="**/AllTests.java" />
</fileset>
</batchtest>
</junit>
<fail if="tests.failed" message="Some unit tests failed" />
</target>
<target name="jar" depends="compile, test">
<mkdir dir="${dist}" />
<jar destfile="${dist}/framework.jar" basedir="${classes.main}" />
</target>
<target name="all" depends="jar" />
</project>
配置CruiseControl
<?xml version="1.0"?>
<project name="frameworkProject" default="compile">
<description>
This is our framework project which we're putting on CruiseControl
</description>
<target name="setup" depends="setup.properties, setup.paths" />
<target name="setup.properties">
<property name="src.main" value="src" />
<!--<property name="src.test" value="src/test" />-->
<property name="classes" value="classes"/>
<property name="classes.main" value="${classes}/main" />
<!--<property name="classes.test" value="${classes}/test" />-->
<property name="libs" value="lib" />
<property name="dist" value="dist" />
<property name="reports" value="reports" />
<property name="reports.junit.data" value="${reports}/junit/data" />
</target>
<target name="setup.paths">
<path id="classpath.main">
<pathelement location="${classes.main}" />
</path>
<path id="classpath.lib">
<fileset dir="${libs}">
<include name="**/*.jar" />
</fileset>
</path>
</target>
<target name="clean" depends="setup">
<delete dir="${classes}" failonerror="false" />
<delete dir="${reports}" failonerror="false" />
<delete dir="${dist}" failonerror="false" />
</target>
<target name="compile" depends="setup, compile.main" />
<target name="compile.main" depends="setup">
<mkdir dir="${classes.main}" />
<javac srcdir="${src.main}" destdir="${classes.main}">
<classpath refid="classpath.lib" />
</javac>
</target>
<target name="compile.tests" depends="setup">
<mkdir dir="${classes.test}" />
<javac srcdir="${src.test}"
destdir="${classes.test}"
classpathref="classpath.lib" />
</target>
<target name="test" depends="compile">
<delete dir="${reports.junit.data}" failonerror="false" />
<mkdir dir="${reports.junit.data}" />
<junit printsummary="yes" haltonfailure="no"
failureproperty="tests.failed">
<classpath refid="classpath.lib" />
<formatter type="xml" />
<batchtest fork="yes" todir="${reports.junit.data}"
failureproperty="tests.failed">
<fileset dir="${src.test}">
<include name="**/*Test*.java" />
<exclude name="**/AllTests.java" />
</fileset>
</batchtest>
</junit>
<fail if="tests.failed" message="Some unit tests failed" />
</target>
<target name="jar" depends="compile, test">
<mkdir dir="${dist}" />
<jar destfile="${dist}/framework.jar" basedir="${classes.main}" />
</target>
<target name="all" depends="jar" />
</project>
配置CruiseControl
config.xml
下面以一个简单的config.xml文件为例,说明CruiseControl的配置方法。配置文件config.xml位于C:\BuildServer\cruisecontrol-2.2\main\bin目录下,和启动脚本cruisecontrol.bat放在一起。
<?xml version="1.0"?>
<cruisecontrol>
<project name="frameworkProject">
<dateformat format="yyyy/MM/dd HH:mm:ss" />
<bootstrappers>
<currentbuildstatusbootstrapper file="../logs/currentbuild.txt" />
</bootstrappers>
<modificationset quietperiod="60" >
<cvs LocalWorkingCopy="../../../workingCopy/frameworkProject/src"/>
</modificationset>
<schedule interval="3600" >
<ant antWorkingDir="../../../workingCopy/frameworkProject" buildfile="build-cc.xml" />
</schedule>
<log dir="../logs/frameworkProject">
<merge dir="../../../workingCopy/frameworkProject/reports/junit/data"/>
</log>
<publishers>
<currentbuildstatuspublisher file="../logs/currentbuild.txt" />
<artifactspublisher dir="../../../workingCopy/frameworkProject/dist" dest="../logs/frameworkProject" />
<htmlemail mailhost="talenttech.com.cn"
returnaddress="buildmaster@talenttech.com.cn"
subjectprefix="[Talent Build Server]"
buildresultsurl="http://10.75.140.128:9000/cruisecontrol/buildresults/ frameworkProject"
logdir="C:\BuildServer\cruisecontrol-2.2\main\logs\frameworkProject"
xsldir="C:\BuildServer\cruisecontrol-2.2\reporting\jsp\xsl"
css="C:\BuildServer\cruisecontrol-2.2\reporting\jsp\css\cruisecontrol.css">
<failure address="liutao@talenttech.com.cn" />
<success address="liutao@talenttech.com.cn" />
<success address="wangkai@talenttech.com.cn" />
<success address="wangchuang@talenttech.com.cn" />
<success address="wu.gaofeng@126.com" />
</htmlemail>
</publishers>
</project>
</cruisecontrol>
下面以一个简单的config.xml文件为例,说明CruiseControl的配置方法。配置文件config.xml位于C:\BuildServer\cruisecontrol-2.2\main\bin目录下,和启动脚本cruisecontrol.bat放在一起。
<?xml version="1.0"?>
<cruisecontrol>
<project name="frameworkProject">
<dateformat format="yyyy/MM/dd HH:mm:ss" />
<bootstrappers>
<currentbuildstatusbootstrapper file="../logs/currentbuild.txt" />
</bootstrappers>
<modificationset quietperiod="60" >
<cvs LocalWorkingCopy="../../../workingCopy/frameworkProject/src"/>
</modificationset>
<schedule interval="3600" >
<ant antWorkingDir="../../../workingCopy/frameworkProject" buildfile="build-cc.xml" />
</schedule>
<log dir="../logs/frameworkProject">
<merge dir="../../../workingCopy/frameworkProject/reports/junit/data"/>
</log>
<publishers>
<currentbuildstatuspublisher file="../logs/currentbuild.txt" />
<artifactspublisher dir="../../../workingCopy/frameworkProject/dist" dest="../logs/frameworkProject" />
<htmlemail mailhost="talenttech.com.cn"
returnaddress="buildmaster@talenttech.com.cn"
subjectprefix="[Talent Build Server]"
buildresultsurl="http://10.75.140.128:9000/cruisecontrol/buildresults/ frameworkProject"
logdir="C:\BuildServer\cruisecontrol-2.2\main\logs\frameworkProject"
xsldir="C:\BuildServer\cruisecontrol-2.2\reporting\jsp\xsl"
css="C:\BuildServer\cruisecontrol-2.2\reporting\jsp\css\cruisecontrol.css">
<failure address="liutao@talenttech.com.cn" />
<success address="liutao@talenttech.com.cn" />
<success address="wangkai@talenttech.com.cn" />
<success address="wangchuang@talenttech.com.cn" />
<success address="wu.gaofeng@126.com" />
</htmlemail>
</publishers>
</project>
</cruisecontrol>
<cruisecontrol>
<cruisecontrol>是配置文件的根元素,它可以拥有一个或多个<project>子元素。本例中它拥有一个项目名为frameworkProject。
<cruisecontrol>是配置文件的根元素,它可以拥有一个或多个<project>子元素。本例中它拥有一个项目名为frameworkProject。
<project>
<project>元素是一个完整的build任务,包括检查配置管理库是否有新的修改,构建项目并发布项目构建结果。它告诉CruiseControl构建什么,何时构建,如何构建以及如何发布构建报告。它有一个必需的属性name和一个可选属性buildafterfailed。
属性buildafterfailed定义了当构建失败时,是否要继续进行,缺省是"true"。
<project>元素的子元素包括,<bootstrappers>,<modificationset>,<schedule>,<log>,<publishers>,<dateformat>和<plugin>,其中<modificationset>和<schedule>是必需的元素。
<project>元素是一个完整的build任务,包括检查配置管理库是否有新的修改,构建项目并发布项目构建结果。它告诉CruiseControl构建什么,何时构建,如何构建以及如何发布构建报告。它有一个必需的属性name和一个可选属性buildafterfailed。
属性buildafterfailed定义了当构建失败时,是否要继续进行,缺省是"true"。
<project>元素的子元素包括,<bootstrappers>,<modificationset>,<schedule>,<log>,<publishers>,<dateformat>和<plugin>,其中<modificationset>和<schedule>是必需的元素。
<dateformat>
<dateformat>用于定义日期的格式,缺省格式是:MM/dd/yyyy HH:mm:ss。
<dateformat>用于定义日期的格式,缺省格式是:MM/dd/yyyy HH:mm:ss。
<bootstrappers>
<bootstrappers>元素是启动任务Plugin的容器,用于定义构建任务启动前需要执行的任务。常用的Plugin包括:
1. <currentbuildstatusbootstrapper>,定义一个CruiseControl的构建状态信息文件。CruiseControl的Build Result JSP从该文件读取状态信息并显示在页面上。属性file用于指定构建状态文件目录和文件名。
2. <cvsbootstrapper>,用于在项目构建开始前从CVS服务器上update指定的文件。通常可以用于更新项目的构建脚本。属性localWorkingCopy指定CVS本地工作目录,属性file指定需要update的文件名,相对于属性localWorkingCopy指定的目录。
<bootstrappers>元素是启动任务Plugin的容器,用于定义构建任务启动前需要执行的任务。常用的Plugin包括:
1. <currentbuildstatusbootstrapper>,定义一个CruiseControl的构建状态信息文件。CruiseControl的Build Result JSP从该文件读取状态信息并显示在页面上。属性file用于指定构建状态文件目录和文件名。
2. <cvsbootstrapper>,用于在项目构建开始前从CVS服务器上update指定的文件。通常可以用于更新项目的构建脚本。属性localWorkingCopy指定CVS本地工作目录,属性file指定需要update的文件名,相对于属性localWorkingCopy指定的目录。
<modificationset>
<modificationset>元素用于告诉CruiseControl是否需要构建项目,即配置管理库的代码是否存在更新。它拥有两个可选属性requiremodification和quietperiod。
属性requiremodification告诉CruiseControl,在配置管理库没有代码更新的情况下,是否需要构建。缺省为"true",即没有更新则无须进行构建。
属性quietperiod告诉CruiseControl,最新一次代码提交后CruiseControl需要等待的时间(秒)。用于防止CruiseControl在开发人员提交代码时进行项目构建。缺省为"60"秒。
在本例中使用<cvs>来检查和工作目录相关的代码在CVS配置管理库是否有更新。<cvs>使用"cvs log"命令来检查最新更新工作目录和当前代码库的差异。
<schedule>
到目前为止,以上的配置文件内容已经定义了CruiseControl构建什么以及何时构建。<schedule>元素告诉CruiseControl每隔多长时间(秒)启动一次构建任务。它有一个可选的属性interval,用于定义以秒为单位的时间间隔。缺省为"300"秒。
在本例中,属性interval设为"3600",这意味着CruiseControl每隔一个小时使用<modificationset>定义的任务检查一次代码库。
<schedule>元素拥有三个子元素<ant>,<maven>和<parse>。
<ant>子元素告诉CruiseControl何时或每隔几次运行Ant来构建项目。
在本例中,antWorkingDir属性设定Ant的工作目录,buildfile属性设定构建脚本build file的目录。
属性multiple告诉CruiseControl每隔几次执行一次本<ant>任务。
除此之外,还可以指定Ant的运行时间(time属性),build file的target(target属性,不设定则为build file的缺省target)。
请参见CruiseControl的配置文档(位于${CruiseControl_Home}/main/docs目录下)。
<log>
<log>元素设定CruiseControl日志文件的存放目录,并通过<merge>子元素指定合并什么样的XML文件(构建过程中产生的文件)到CruiseControl的日志文件中。
<merge>子元素的pattern属性定义匹配的文件名模式,缺省为".xml";dir属性用于指定一个目录,这个目录下所有匹配模式的文件将合并到CruiseControl的日志文件中。
<publishers>
<publishers>元素用于指定构建任务结束后,CruiseControl如何发布项目构建结果。项目构建结果的发布方式可以是Email,网页,复制代码库到指定的目录,或是发布代码库到FTP服务器。
在本例中,共有<currentbuildstatuspublisher>,<artifactspublisher>和<htmlemail>三个publisher。
<currentbuildstatuspublisher> publisher把下次构建的时间写入指定文件,文件名由file属性设定。
<artifactspublisher> publisher元素把项目构建产品复制到指定的目录,dir属性定义源目录,dest定义目标目录的父目录(实际目录还要加上构建时的时间戳,如:父目录/19890604203828)。
<htmlemail> publisher把构建结果以HTML格式通过Email发布。缺省情况下,HTML格式的Emai和CruiseControl Web应用的构建结果JSP页面相同。
本例中<htmlemail>的属性和子元素的作用很容易理解,更多的配置项参见联机文档。
<modificationset>元素用于告诉CruiseControl是否需要构建项目,即配置管理库的代码是否存在更新。它拥有两个可选属性requiremodification和quietperiod。
属性requiremodification告诉CruiseControl,在配置管理库没有代码更新的情况下,是否需要构建。缺省为"true",即没有更新则无须进行构建。
属性quietperiod告诉CruiseControl,最新一次代码提交后CruiseControl需要等待的时间(秒)。用于防止CruiseControl在开发人员提交代码时进行项目构建。缺省为"60"秒。
在本例中使用<cvs>来检查和工作目录相关的代码在CVS配置管理库是否有更新。<cvs>使用"cvs log"命令来检查最新更新工作目录和当前代码库的差异。
<schedule>
到目前为止,以上的配置文件内容已经定义了CruiseControl构建什么以及何时构建。<schedule>元素告诉CruiseControl每隔多长时间(秒)启动一次构建任务。它有一个可选的属性interval,用于定义以秒为单位的时间间隔。缺省为"300"秒。
在本例中,属性interval设为"3600",这意味着CruiseControl每隔一个小时使用<modificationset>定义的任务检查一次代码库。
<schedule>元素拥有三个子元素<ant>,<maven>和<parse>。
<ant>子元素告诉CruiseControl何时或每隔几次运行Ant来构建项目。
在本例中,antWorkingDir属性设定Ant的工作目录,buildfile属性设定构建脚本build file的目录。
属性multiple告诉CruiseControl每隔几次执行一次本<ant>任务。
除此之外,还可以指定Ant的运行时间(time属性),build file的target(target属性,不设定则为build file的缺省target)。
请参见CruiseControl的配置文档(位于${CruiseControl_Home}/main/docs目录下)。
<log>
<log>元素设定CruiseControl日志文件的存放目录,并通过<merge>子元素指定合并什么样的XML文件(构建过程中产生的文件)到CruiseControl的日志文件中。
<merge>子元素的pattern属性定义匹配的文件名模式,缺省为".xml";dir属性用于指定一个目录,这个目录下所有匹配模式的文件将合并到CruiseControl的日志文件中。
<publishers>
<publishers>元素用于指定构建任务结束后,CruiseControl如何发布项目构建结果。项目构建结果的发布方式可以是Email,网页,复制代码库到指定的目录,或是发布代码库到FTP服务器。
在本例中,共有<currentbuildstatuspublisher>,<artifactspublisher>和<htmlemail>三个publisher。
<currentbuildstatuspublisher> publisher把下次构建的时间写入指定文件,文件名由file属性设定。
<artifactspublisher> publisher元素把项目构建产品复制到指定的目录,dir属性定义源目录,dest定义目标目录的父目录(实际目录还要加上构建时的时间戳,如:父目录/19890604203828)。
<htmlemail> publisher把构建结果以HTML格式通过Email发布。缺省情况下,HTML格式的Emai和CruiseControl Web应用的构建结果JSP页面相同。
本例中<htmlemail>的属性和子元素的作用很容易理解,更多的配置项参见联机文档。
创建CruiseControl的Web应用
1. 在C:\BuildServer\cruisecontrol-2.2\reporting\jsp目录下运行build war命令;
2. 提示设置user.log.dir属性时,输入C:\BuildServer\cruisecontrol-2.2\main\logs;
3. 提示设置user.build.status.file属性时,输入currentbuild.txt;
4. 提示设置cruise.build.artifacts.dir属性时,输入/artifacts/frameworkProject;
5. Web应用构建完成后,可以在C:\BuildServer\cruisecontrol-2.2\reporting\jsp\dis目录下找到cruisecontrol.war文件;
6. 把cruisecontrol.war复制到tomcat的webapps目录下,发布CruiseControl的Web应用;
1. 在C:\BuildServer\cruisecontrol-2.2\reporting\jsp目录下运行build war命令;
2. 提示设置user.log.dir属性时,输入C:\BuildServer\cruisecontrol-2.2\main\logs;
3. 提示设置user.build.status.file属性时,输入currentbuild.txt;
4. 提示设置cruise.build.artifacts.dir属性时,输入/artifacts/frameworkProject;
5. Web应用构建完成后,可以在C:\BuildServer\cruisecontrol-2.2\reporting\jsp\dis目录下找到cruisecontrol.war文件;
6. 把cruisecontrol.war复制到tomcat的webapps目录下,发布CruiseControl的Web应用;
启动CruiseControl
使用C:\BuildServer\cruisecontrol-2.2\main\bin目录下cruisecontrol.bat启动CruiseControl。用法如下:
C:\BuildServer\cruisecontrol-2.2\main\bin>cruisecontrol [options]
命令cruisecontrol的选项包括:
-port [number] JMX服务器的Http Controller的端口;缺省为8000
-rmiport [number] JMX服务器的RMI Controller的端口;缺省为1099
-xslpath directory JMX的XSL文件存放目录;
-configfile file 配置文件的路径;缺省为当前目录下的config.xml文件
-debug 将CruiseControl内部的日志级别调整到DEBUG
只有指定port和/或rmiport属性时,JMX服务器才启动。如果要修改port参数(不使用缺省的8000端口),必须要修改reporting/jsp目录下的controlpanel.jsp文件,然后再重新创建和发布CruiseControl的Web应用;也可以直接修改Tomcat\webapps\cruisecontrol目录下的controlpanel.jsp页面。
使用C:\BuildServer\cruisecontrol-2.2\main\bin目录下cruisecontrol.bat启动CruiseControl。用法如下:
C:\BuildServer\cruisecontrol-2.2\main\bin>cruisecontrol [options]
命令cruisecontrol的选项包括:
-port [number] JMX服务器的Http Controller的端口;缺省为8000
-rmiport [number] JMX服务器的RMI Controller的端口;缺省为1099
-xslpath directory JMX的XSL文件存放目录;
-configfile file 配置文件的路径;缺省为当前目录下的config.xml文件
-debug 将CruiseControl内部的日志级别调整到DEBUG
只有指定port和/或rmiport属性时,JMX服务器才启动。如果要修改port参数(不使用缺省的8000端口),必须要修改reporting/jsp目录下的controlpanel.jsp文件,然后再重新创建和发布CruiseControl的Web应用;也可以直接修改Tomcat\webapps\cruisecontrol目录下的controlpanel.jsp页面。
CruiseControl的Web界面
在浏览器地址栏输入:http://BuildServer-IP:9000/cruisecontrol/,可以访问CruiseControl的Web应用,如下图所示:
在浏览器地址栏输入:http://BuildServer-IP:9000/cruisecontrol/,可以访问CruiseControl的Web应用,如下图所示:

在左侧区域,按时间顺序列出最新Build结果的连接。如果Build结果超过10个,左侧区域只显示10个连接,其余的Build结果可以在下面的下拉框中找到。上图中因为Build结果少于10个,所以下拉框是空的。
当点击右上角的Control Panel按钮时,如果出现错误,则是因为没有使用CruiseControl的JMX支持。要启动JMX支持,请看下节内容。
当点击右上角的Control Panel按钮时,如果出现错误,则是因为没有使用CruiseControl的JMX支持。要启动JMX支持,请看下节内容。
使用JMX控制台
要使用CruiseControl的JMX控制台很简单,只需在启动cruisecontrol时指定JMX Server的Http Controller端口即可:cruisecontrol -port 8000。
进入CruiseControl的Web应用界面,点击右上角的Control Panel按钮,则出现CruiseControl的"JMX Control Panel"。
可以通过JMX控制面板在运行时修改配置,而不需要重启CruiseControl。点击CruiseControl Project MBean,尝试它的管理功能。
例如,可以修改MBean的"BuildInterval"属性,来更改项目构建的时间间隔;修改ConfigFileName,则可以更改CruiseControl的配置文件;点击MBean的build操作"invoke"按钮,则可以强制启动项目构建任务。
要使用CruiseControl的JMX控制台很简单,只需在启动cruisecontrol时指定JMX Server的Http Controller端口即可:cruisecontrol -port 8000。
进入CruiseControl的Web应用界面,点击右上角的Control Panel按钮,则出现CruiseControl的"JMX Control Panel"。
可以通过JMX控制面板在运行时修改配置,而不需要重启CruiseControl。点击CruiseControl Project MBean,尝试它的管理功能。
例如,可以修改MBean的"BuildInterval"属性,来更改项目构建的时间间隔;修改ConfigFileName,则可以更改CruiseControl的配置文件;点击MBean的build操作"invoke"按钮,则可以强制启动项目构建任务。
持续集成资源
1. 持续集成:http://www.martinfowler.com/articles/continuousIntegration.html
2. AntHill:http://www.urbancode.com/projects/anthill/
3. CruiseControl:http://cruisecontrol.sourceforge.net/
4. CVSNT:http://www.cvsnt.org/
5. WinCVS中文版:http://www.8848software.com/wincvs/
6. Driving On CruiseControl Part1:
http://www.javaranch.com/journal/200409/DrivingOnCruiseControl_Part1.html
7. Driving On CruiseControl Part2:
http://www.javaranch.com/journal/200410/DrivingOnCruiseControl_Part2.html
8. Scheduled Builds:http://www.pragmaticprogrammer.com/starter_kit/au/scheduled.pdf
1. 持续集成:http://www.martinfowler.com/articles/continuousIntegration.html
2. AntHill:http://www.urbancode.com/projects/anthill/
3. CruiseControl:http://cruisecontrol.sourceforge.net/
4. CVSNT:http://www.cvsnt.org/
5. WinCVS中文版:http://www.8848software.com/wincvs/
6. Driving On CruiseControl Part1:
http://www.javaranch.com/journal/200409/DrivingOnCruiseControl_Part1.html
7. Driving On CruiseControl Part2:
http://www.javaranch.com/journal/200410/DrivingOnCruiseControl_Part2.html
8. Scheduled Builds:http://www.pragmaticprogrammer.com/starter_kit/au/scheduled.pdf
浙公网安备 33010602011771号