1. 环境搭建
1.1. 下载及目录介绍

从官方站点http://cruisecontrol.sourceforge.net/download.html下载一份最新的 CC 压缩包,最新的版本号为2.8.4

下载了cruisecontrol-bin-2.8.4.zip 直接解压到E盘下,文件结构如下图:

  • apache-ant-1.7.0:CC中使用ANT工具
  • artifacts:CC编译生成发布包
  • etc:自带容器Jetty对应的配置文件
  • lib:自带容器Jetty所需要到的Jar包
  • logs:各项目生成日志存在文件夹
  • projects:存放各项目文件目录,进行程序的编译
  • webapps:CC自带应用程序存放目录
  • cc-config:用于CC环境变量配置
  • cruisecontrol:主应用程序CC目录
  • dashboard:用于编译结果发布程序
  • documentation:CC相关文档
  • config.xml:用于CC编译配置文件,通过修改配置文件引入不同的插件,执行不同的编译流程
  • cruisecontrol.bat:在WINDOWS环境下进行启用CC批处理脚本
  • cruisecontrol.sh:在Linux等环境下启动CC脚本
  • dashboard-config.xml:Dashboard配置文件

1.2. 运行环境
使用JAVA开发的CC,当然需要运行在JDK下并通过Web容器进行发布,具体要求如下:

  • CC需要运行在至少JDK 1.4环境中,在环境变量中设置有JAVA_HOME,并把java/bin加入到path中;
  • CC已经内建集成了ANT,不需要单独引入;
  • CC可以运行在多种应用服务器中,在自带压缩包中捆绑了一个开源应用服务器,那就是Jetty 6,下面为了尽快建立我们的环境,以下将使用该容器。

1.3. 快速启动CC
运行根目录下批处理文件cruisecontrol.bat,出现如下界面:

运行成功后,我们可以在浏览器输入 http://localhost:8080/cruisecontrol/ 来验证一下结果(采用Jetty默认的设置,端口号为 8080)

如果看到上图结果,恭喜你已经成功启动CC。
另外CC提供了更加人性化结果展示Dashboard界面,在浏览器输入 http://localhost:8080/dashboard/

2. 配置介绍
当CC服务器启动时,会自动检测配置信息中的任务信息,并对其进行校验和初始化,之后所有的工作,都是依据该配置信息进行的。
CC的配置使用了其安装目录下的config.xml文件,我们可以通过文本编辑器打开该配置文件,编辑各种配置信息。配置信息的定义遵循了标准XML文件格式,同时遵循了ANT自动构建配置信息的规则。

config.xml
<cruisecontrol>
<project name="connectfour">

<!-- 用来访问项目当前创建的状态   file: 指定了状态文件的位置 -->
     <listeners>
             <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
         </listeners>

<!-- 在 CC 进行创建之前运行,创建前的准备工作 -->
          <bootstrappers>
             <!-- 从源码控制系统更新本地文件: cvsbootstrappers、vssbootstrappers、svnbootstrapper -->
                 <antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="clean" />
          </bootstrappers>

<!-- 检查各个源码控制系统中是否发生变化;quietperiod: 单位为秒 设定等待的时间 -->
         <!-- 第一次的取出工作为手动执行 -->
          <modificationset quietperiod="30">
             <!-- touch any file in connectfour project to trigger a build -->
             <filesystem folder="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>

<!-- 在 build loop 结束之后运行,发布 build 的结果 -->
         <publishers>
             <onsuccess>
               <!--用于对创建过程中产生的人工制品进行发布-->
                 <artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
             </onsuccess>

<!--
           mailhost=邮件主机
           returnname=发件人
           returnaddress=发件地址
           defaultsuffix=默认邮件后缀
         -->
         <htmlemail
           charset="UTF-8"
           mailhost="test163.com"
           defaultsuffix="@xxx.com"
           username="xxx@163.com"
           password="xxx"
           returnname="CruiseControl"
           returnaddress="xxx@163.com"
           subjectprefix="构建日志"
           xsldir="webapps/cruisecontrol/xsl"
           css="webapps/cruisecontrol/css/cruisecontrol.css">
           <always address="xxx@xxx.com.cn"/>
           <failure address="xxx@xxx,yyy@yyy.com.cn"/>           
         </htmlemail>
         </publishers>
     </project>
</cruisecontrol>
build.xml

<!-调用ANT执行集成流程,包括清空目录、编译、休眠、测试、打包 -->
<project name="connectfour" default="all">
<target name="all" depends="clean, compile, sleep, test, jar"/> <!-- 1. 删除根目录下target 目录-->
<target name="clean">
<delete dir="target" quiet="true" />
</target> <!-- 2. 编译程序,创建目录并编译程序,编译输出为target/classes目录下-->
<target name="compile">
<mkdir dir="target/classes"/>
<javac srcdir="src" destdir="target/classes"/>
</target> <!-- 3. 在创建前等待60秒,用于Dashboard观察进程-->
<target name="sleep">
<echo message="Sleeping for a while so you can see the build in the new dashboard" />
<sleep seconds="60" />
</target> <!-- 4. 进行自动化测试,依赖任务为compile-->
<target name="test" depends="compile">
<mkdir dir="target/test-classes"/>
<!-调用junit进行自动化测试-->
<javac srcdir="test" destdir="target/test-classes">
<classpath>
<pathelement location="target/classes"/>
<pathelement location="lib/junit.jar"/>
</classpath>
</javac> <!-创建测试结果存放目录-->
<mkdir dir="target/test-results"/>
<junit haltonfailure="no" printsummary="on">
<classpath >
<pathelement location="target/classes"/>
<pathelement location="lib/junit.jar"/>
<pathelement location="target/test-classes"/>
</classpath>
<formatter type="brief" usefile="false"/>
<formatter type="xml" /> <!-测试文件所在文件地址-->
<batchtest todir="target/test-results" >
<fileset dir="target/test-classes" includes="**/*Test.class"/>
</batchtest>
</junit>
</target> <!-- 5. 程序打包,依赖与compile任务-->
<target name="jar" depends="compile">
<jar jarfile="target/connectfour.jar" basedir="target/classes"/>
</target>
</project>

2.3. 执行配置解析
一个持续集成项目是从project节点开始的,对该项目进行的操作都会作为子节点存在与该根节点之下。对于每一个project节点,CC系统都会将其当作一个处理单元,并在最初建立该项目的时候进行初始化操作。

name是project节点常用的属性,也是必设且值唯一的属性,该属性的值会在整个CC系统使用,包括配置文件的${project.name}变量值。

在一个项目节点中,我们可以定义监听器、本地目录位置、变更轮询目录位置、轮询间隔、任务执行、单元测试、日志记录等多种项目操作,同时CC系统支持插件扩展功能,这些扩展插件可以直接在一个项目中使用。

2.3.1. 轮询版本控制系统

版本库轮询机制是使用modificationset进行配置的。CC系统内置的轮询模块会根据设定的时间段对版本库
进行检测,一旦发现版本库发生变更,就会调用Check Out Build Test
Publish等一系列的操作,对最新的代码进行集成,并运行一系列预先设定的任务。

CC支持十多种版本控制系统,比如CVS、SVN、Starteam、VSS等,对这些版本控制系统的调用,只需要配置相应的节点名称即可。本文以SVN版本管理系统为例。在modificationset节中,我们看到唯一的一个子节点:

<svn localWorkingCopy="projects/CM/${project.name}/src/${project.name}"/>

该节点使用了svn关键字,表示当前工程使用的版本控制系统是SVN,localWorkingCopy属性的值是告诉CC本地的拷贝目录,其余的工作则由CC内置的操作模块进行。
2.3.2. 执行构建脚本

实质上,执行构建脚本也是CC的一个可定制任务,但由于自动构建是持续集成的一个重要组成部分,因此在此单独提出。

CC的自动构建是使用ANT工具来进行的,当然我们也可以使用其它的自动构建工具来替代(比如Maven),这些的工具仅仅是体现在一个任务配置语句上,在此,以ANT工具为例。

在schedule节,我们同样使用了一个子节点来描述自动构建工作:

<ant anthome="ant6" buildfile="projects/CM/${project.name}/src/${project.name}/build.xml"/>

该节点使用了ant关键字,表示该任务使用了ant来进行自动构建任务,anthome属性则指定了ANT工具的具体位置,buildfile属性则指定了ANT进行自动构建所使用的配置文件Build.xml文件的路径。
这样,在CC决定进行自动构建任务时,会根据设定找到执行所使用到的信息。

2.3.3. 执行单元测试

CC可以自动侦测自动构建配置文件中单元测试的任务,并在代码集成完毕将执行结果反馈到相应的模块。

ANT支持xUnit系列的单元测试框架,只需要在配置文件中加入一个target节,即可在自动构建完成之后,进行单元测试工作,有关的详细配置,请参阅ANT官方文档。

(转)使用CruiseControl+SVN+ANT实现持续集成之二的更多相关文章

  1. (转)使用CruiseControl+SVN+ANT实现持续集成之三

    在上一节中我们介绍了环境搭建和配置介绍,并快速启动CC查看集成结果,在本节中我们将详细介绍CC构建操作及监视. 1. 启动CC服务器 通过执行其根目录下的cruisecontrol.bat文件来启动C ...

  2. Jenkins+svn+ant+tomcat持续集成

    转载自 http://www.cnblogs.com/liuhaixia/p/7267473.html Jenkins是基于Java开发的一种持续集成工具,用于监控秩序重复的工作.通过Jenkins+ ...

  3. (转)使用SVN+CruiseControl+ANT实现持续集成之一

    在前面的文章中, 介绍自己当时所在团队的处境(使用.NET开发),一个不到十个人的研发团队在保证正常开发进度同时需要并发支持四.五十个项目问题处理,经常为了程序版 本冲突.日常测试版本.发布版本提供等 ...

  4. CruiseControl.Net全面实现持续集成

    使用CruiseControl.Net全面实现持续集成   持续集成想必大家很多人都听说过,甚至都实践过,最近我又一次亲历了一次持续集成,现将我的经验分享给大家.关于持续集成的理论在本文概不涉及,本文 ...

  5. 持续集成之二:搭建SVN服务器(subversion)

    安装环境 Red Hat Enterprise Linux Server release 7.3 (Maipo) jdk1.7.0_80 subversion-1.10.3.tar.gz apr-1. ...

  6. Jenkins +Maven+Tomcat+SVN +Apache项目持续集成构建

    详解Jenkins +Maven+Tomcat+SVN +Apache项目持续集成 一:前言 1. Jenkins jenkins版本大全http://mirrors.jenkins-ci.org/ ...

  7. 使用Visual Studio Team Services持续集成(二)——为构建定义属性

    使用Visual Studio Team Services持续集成(二)--为构建定义属性 1.从VSTS帐户进入到Build 2.编辑构建定义并单击Options Description:如果这里明 ...

  8. 使用gitlab构建基于docker的持续集成(二)

    使用gitlab构建基于docker的持续集成(二) gitlab docker aspnetcore Centos配置gitlab镜像并且启动 Centos配置防火墙 windows上访问gitla ...

  9. Jenkins+ANT+SVN快速搭建持续集成环境

    伟大的语言都从helloworld开始,这里我们用Jenkins+ANT+SVN来搭建这一套持续集成环境. 环境准备: 一台已经配置好Jenkins和Ant的机器. 项目准备: 用Ecplise建立一 ...

随机推荐

  1. socket.io+angular.js+express.js做个聊天应用(一)

    node,express开发环境等安装如果已经搞好了. justhacker@justhacker-ThinkPad-Edge-E440:~/projects/nodejs$ express -e c ...

  2. 【WinForm】C# 采用POST登录京东

    C# POST 传值登录 京东 想做一个DEMO 练练html的传值和接收,就用Winform 做了一个登录京东的程序. 首先参考的网址是: 艹蛋的青春じ 让我蛋疼ミ:http://www.cnblo ...

  3. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

  4. LibSVM学习(四)——逐步深入LibSVM 转

    原文:http://blog.csdn.net/flydreamgg/article/details/4470121 其实,在之前上海交大模式分析与机器智能实验室对2.6版本的svm.cpp做了部分注 ...

  5. java_DAO类基本设计

    package cn.itcast.oa.base; import java.util.List; public interface BaseDao<T> { void save(T en ...

  6. vs 行数

    工具->选项->文本编辑器->选择你用的语言,选中行号,即可!

  7. IJKMediaFramework第三方库的使用

    大多数做直播的时候使用 FFMpeg.  IJKMediaFramework也是基于FFMpeg封装 使用起来比较简单,个人觉得如果有能力可以使用 FFMpeg , 使用 FFMpeg对 内存的占用比 ...

  8. hibernate 创建session

    //1. 创建一个 SessionFactory 对象 SessionFactory sessionFactory = null; //1). 创建 Configuration 对象: 对应 hibe ...

  9. CF Drazil and Date (奇偶剪枝)

    Drazil and Date time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  10. 一次配置jdk环境变量的感悟

    开发java也一年多了,昨日一次偶然的机会,想在dos命令下执行一个程序,发现在 命令行输入 javac Test.java的时候,竟然提示javac不是内部命令, 之后输入 java ,也提示不是内 ...