现在的位置: 首页 > 综合 > 正文

搭建CruiseControl 环境

2013年04月13日 ⁄ 综合 ⁄ 共 10033字 ⁄ 字号 评论关闭
转自:http://blog.csdn.net/tony1130/archive/2008/01/13/2041968.aspx
官方网站:http://cruisecontrol.sourceforge.net/main/configxml.html

搭建你的持续集成服务器

 CruiseControl是一个不错的持续集成服务器,不过国内社区的普遍反应是:它的配置太麻烦,无从下手。从本篇文章开始,我将逐步介绍
CruiseControl的环境搭建与配置,以及持续集成中的一些实践。我们将从最简单的使用方式(stand-alone)开始,以便您可以快速开始
您的持续集成之旅,而不必面对“千奇百怪”的问题。
好!先让我们简单搭建个持续集成服务器再说吧


一、我使用的CruiseControl版本
  1. CruiseControl是一个java开源项目,我将以它最近的一个分支版本来介绍它的使用。CruiseControl最近发布的版本是V2.7.1。这个分支版本就是在V2.7.1基础之上。
  2. 这个分支版本包含一个Dashboard,可以方便地看到各项目的构建状态。
  3. 这个分支版本当然还支持多个Build Loop,你可以在多个机器上部署独立的Build Loop,从而建立你自己的Build Grid。

二、得到CruiseControl的分支版本

    要得到这个分支版本,你可以使用subversion不用任何密码从CruiseControl的Repository中检出。命令如下:
svn checkout https://cruisecontrol.svn.sourceforge.net/svnroot/cruisecontrol/branches/cce/cruisecontrol/

三、构建CruiseControl

       0.    你机器上至少要安装有JAVA 1.4,并在环境变量中设置有JAVA_HOME,并把java/bin加入到path中。CruiseControl自带了ANT,所以不用事先安装。

  1. 从源代码中构建CruiseControl

       如果从源码中构建CruiseControl,要确保你的机器可以访问互联网。因为构建过程中要检查一些license。另外,最好有SVN 客户端软件,因为在构建时,它会用到javahl。
      
在刚刚checkout出来的CruiseControl目录下,有一个批处理文件,名为release.bat。运行这个批处理文件,你会在
target目录下发现一个压缩文件,名这cruisecontrol-bin-2.7.2-dev.zip。将其解压到一个目录,我们这里解压到C盘根
目录下。解压后,目录结构如下:
目录结构
      2.  直接使用已构建完成的CruiseControl 
如果你不想做这一步,也可以在binaryrelease目录下发现解压后的文件,把它们拷贝到相应的目录下也可以。

四、运行CruiseControl

   CruiseControl可以运行在多种应用服务器中,当然,它自己也捆绑了一个开源应用服务器,那就是Jetty 6。为了尽快建立我们的环境,我们这里暂时使用它自己捆绑的Jetty,快速开始我们的持续集成之旅。
  
直接运行CruiseControl目录下的CruiseControl.bat,它会自行启动Jetty6,当从Console中看到它启动完毕后,你
就可以在浏览器中访问http://localhost:8080/dashboard,此时你会看到一个名为connectFour的示例项目在
Dashboard上显示了。

Build Dashboard

(如果你足够快的话,你会发现Dashboard 上的小方块是从灰色变成深绿色的。为什么呢?我们以后再说。)
“绿色”表示该项目构建通过。如果要是有多个项目的话,应该看到多个小方块。

点击“Builds” Tab页,就到了 Builds 页。这一页会以列表的方式显示所有的项目。当前只有一个项目,所以在列表中只有一行,如下图所示:
Builds Page
 在该页面上点击某个项目时,会打开Build Detail页,
显示该项目最近一次Build的信息。页面右侧是该项目所有历史构建信息。你会发现,这时connectFour项目有两个构建历史版本,一个是刚刚构建
完成的,另一个是两年前的构建。这些信息是来自于CruiseControl对该项目的日志文件。此时,点击这两个构建结果中的任何一个,都会打开该次构
建的Build Detail页面,显示相关的构建历史信息。如下图所示:
Build Detail

了解CuiseControl的配置文件

我们已经看到CruiseControl开始工作了。接下来我们先了解一个它的配置文件,然后再加入你的项目。
CruiseControl的配置文件的确了比较复杂,一方面是因为:它太灵活,太想完成你想达到的任何效果了。另一方面就是:它在文档化方面的确很落后。你只能在用户组中找答案。(不过,这也是学习的一个途径。如果你了解开源的话,你就会习惯于在用户组中找答案啦。)


了解配置文件之前,让我们先定义一下我们可能会用到的术语。

  1. 工作目录(也就是CruiseControl的工作目录):是指启动CruiseControl的脚本目录。在Stand-alone情况下,就是文件cruisecontrol.bat所在的目录。如果你把它部署到了应用服务器中,那一般就指bin目录了。

       2.  Log
目录
:就是CruiseControl存储所有构建项目日志信息的目录,默认值为工作目录下名为logs目录。
       3. Projects目录:就是CruiseControl存储所有构建项目源代码的目录,默认值为工作目录下名为projects目录。

一、配置文件及其正确位置

      配置文件包括两个,一个名为config.xml,另一个名为dashboard-config.xml。默认情况下,这两个文件和cruisecontrol.bat在同一下目录下,即工作目录
    
如果在配置文件中,任何路径前面如果没有“/”的话,那就是相对于工作目录的。
  
    
     
另外,CruiseControl是可以改变他们的位置的,但建议在没有深入了解CruiseControl时,不要试图改变它们,因为我们的目标是让CruiseControl在最短的时间里为你创建价值。

二、Config.xml 文件

<cruisecontrol>
    
<project name="connectfour"--这里的name应该和你在projects目录下的项目名完全一致。

        <listeners>          --用于监听项目状态的变化(指building,passed等)
            
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>   --这里的${project.name}
        
</listeners>                                                                                                                
是指“connectfour”

        <bootstrappers>        --用于CruiseControl从Repository更新代码
            
<svnbootstrapper localWorkingCopy="projects/${project.name}" />
        
</bootstrappers>

        <modificationset quietperiod="30">      --用于监听在quietperiod秒内Repository是否变化
            
<svn LocalWorkingCopy="projects/${project.name}"/>
        
</modificationset>

        <schedule interval="300"
--用于每隔interval秒,CruiseControl去检查并计划一次构建
            
<ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
        
</schedule>

        <log
--用于得到并保存log文件。默认情况下,将放在projects/${project.name}的目录下
            
<merge dir="projects/${project.name}/target/test-results"/> --用于将Build中生成的结果合并
        
</log>                                                                                                           
到log文件中

        <publishers--用于将构建的结果(如二进制文件)发布到指定的位置
            
<onsuccess--决定在构建成功的情况下,发布哪些内容
                
<artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
            
</onsuccess>
        
</publishers>

    </project>
</cruisecontrol>

三、dashboard-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
/********************************************************************************
 这里省略了一些声明 :)
 ********************************************************************************/
 
-->
 
<dashboard>
     
<buildloop
        
logsdir=""       
--这里指定logs目录,一定要与config.xml文件中一致,否则你会有麻烦。
                                               
如果为空串,则默认为工作目录下的logs目录。
              artifactsdir
="" />  --这里指定artifacts目录,一定要与config.xml文件中一致
                                                  
如果为空串,则默认为工作目录下的artifacts目录。
    <features allowforcebuild=""/> 
--是否可以在Dashboard上强制构建(force
build)

    
<trackingtool projectname="" baseurl="" keywords=""/> 
--这是用于与Mingle的集成

     
<subtabs>   --在这里,你可以自己扩展你自己的subtab页,不过要先实现一些接口。
        
<subtab class="net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidget" />
    
</subtabs>
</dashboard>

四、配置文件中的注意事项

1、如果logs、artifacts和projects目录不存在,在你运行CruiseControl之前,要手工建立它们。
2、确保两个配置文件中的logs/artifacts目录指向同一个目录。因为CruiseControl
core会向其中写数据,而Dashboard会从中读数据。

五、小贴士

在Config.xml文件中,有几个元素的概念要先澄清一下(只针对当前示例,严格定义请参见CruiseControl的文档)。

  1. <listeners> 用于监听状态变化,如waiting for build,queued,building。一般不用改变。
  2. <bootstrappers>用于检出代码,CruiseControl有很多种bootstrapper,示例中使用的是SVN。localWorkingCopy属性是指你把代码检出到安装CruiseControl机器的哪个文件目录。
  3. <modificationset>用于监听Repository的变化频率,如果CruiseControl发现代码有变化,而且在quietperiod秒内没有其它用户检入代码(用于保证被构建的版本完整性),CruiseControl才会检出代码。
  4. <schedule
    >用于指定CruiseControl去检查Repository的时间间隔。并指定使用哪个构建文件。示例中使用的是ant脚本,构建文件是被检出项目的根目录下的build.xml(即在Repository中)。

  5. <log>用于指定CruiseControl把日志放在哪里,把哪些构建结果放在日志中。如果没有指定任何属性,默认为logs目录下的${project.name}目录。
  6. <publishers>
    用于在构建结束后,发布哪些消息和文件。CruiseControl有很多插件可以做各种各样的Publishing。例如,在构建成功后,通过http调用指定的页面,也可以给指定的人发邮件。在失败时,播放音乐,通知team。

向CruiseControl中加入一个新项目

现在我们已经在自己的机器上建立了一个持续集成服务器,并初步了解它的配置文件。

接着我们就要把自己的项目加到其中。 做为一个入门示例,我们先要陈述一下假设条件,以便我们快速推进我们的部署过程。


一、 准备工作(请确认一下)

1、你的项目代码放在Google Code上面(Google Code用的是SVN
),你的项目名称是yourprojectname,项目的源文件就放在trunk目录下。那么,其svn update的链接如下:http://yourprojectname.googlecode.com/svn/trunk/。CruiseControl只会更新文件,不会修改源代码,所以匿名检出就可以了。

2、你的项目是一个JAVA项目,用ANT进行构建,构建文件名为build.xml,放在项目的根目录上,默认的ant
task名为all。确保文件中其中所有路径都是相对于项目根目录的,将其Copy到任何目录下,ant
all都可以正确运行。(我们的主要目的是建立环境,使其在今后的开发工作中可以发挥作用,而不是要发现我们构建脚本中错误。)

3、你的CruiseControl工作目录是C:/CruiseControl,方便起见,我们以下将用${CC_HOME}代替。

4、你的logs目录是${CC_HOME}/logs。如果你没有独自改动配置的话,它的位置就如前所述。

5、你的projects目录是${CC_HOME}/projects。如果你没有独自改动配置的话,它的位置就如前所述。

6、你的artifacts目录是${CC_HOME}/artifacts。如果你没有独自改动配置的话,它的位置就如前所述。


二、加入项目

1、手工检出文件:

确保将你的项目代码检出到${CC_HOME}/projects/yourprojectname目录下,即在该目录就是你项目的根目录,可以找到名为build.xml文件。

2、修改配置文件(添加你的项目)

将下面的代码段加入到config.xml文件中,位于<CruiseControl>节点下。


    <project name="yourprojectname"> --这里一定要与你的projects目录下的项目名相同

        
<listeners>
            
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        
</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>
            
<merge dir="projects/${project.name}/target/test-results"/>
             <!--
在上面一句,一定要确保构建失败后可以找到这个dir,如果没有,删除这个元素好了-->
        </log>

        
<publishers>
            
<onsuccess>
                
<artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
                <!--
在上面一句,一定要确保你打包出来的文件名是yourprojectname.jar -->
            </onsuccess>
        
</publishers>

    
</project>

最终的文件如下:

<cruisecontrol>
    
<project name="connectfour">

        
<listeners>
            
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        
</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>
            
<merge dir="projects/${project.name}/target/test-results"/>
        
</log>

        
<publishers>
            
<onsuccess>
                
<artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
            
</onsuccess>
        
</publishers>

    
</project>

    
<project name="yourprojectname">

        
<listeners>
            
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        
</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>
            
<merge dir="projects/${project.name}/target/test-results"/>
        
</log>

        
<publishers>
            
<onsuccess>
                
<artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
            
</onsuccess>
        
</publishers>

    
</project>

</cruisecontrol>

三、看一下结果

(1)
CruiseControl会自动更新这个配置文件,加载时间一般是在任何一个项目需要检查是否有更新时。

(2)
你会看到这个项目在Dashboard上首先是灰色的方块,因为这个项目还从来没有在CruiseControl上构建过,没有任何历史信息,我们称该项目为"inactive"。

(3)
过一会儿,你会看到一个环形动态图标,表示它在构建中(执行build.xml脚本)。

(4)
当环形动态图标消失时,你会看到它变成红色(如果构建失败的话)或绿色(如果构建成功的话)。

我新加的项目名是vcdstore,现在我的dashboard上有两个项目了。

小贴士:

(1)
目前CruiseControl还不支持首次自动检出代码,所以你要先把项目代码手工检出到本地。

(2)
如果你的SVN使用https方式更新代码,你一定要在命令行方式检出代码,并选择永久接受证书。

(3)
CruiseControl这个分支版本不支持在UI上增加项目。

(4)
如果你在config.xml文件中把你的项目删除,却不删除它的日志的话,你在Dashboard上还是可以看到这个项目,此时它被标记为"Discontinued",表示你可以看到它的历史信息,但CruiseControl不会再构建它了。

抱歉!评论已关闭.