一.背景

CruiseControl从<项目自动化之道>这本书中了解到,然后又从网上查资料做了一定尝试.同时,项目持续集成这部分我也计划在自己参与的项目上先试点实行,才有了这篇文章.

二.CruiseControl 是什么

简单点说,就是一个项目自动构建,持续集成工具和框架(为什么我叫它框架,是因为CruiseControl可以支持很多第三方扩展,而且也不只是能build java应用,比如.net,不过.net的CruiseControl被改名成CruiseControl.NET了).

三.为什么用它

1.开源免费,sourceforge上就可以下载到;

2.出来的时间较早,1.0版本出现在2001年,现在已经发展到了2.8版本了,部署使用的参考内容比较多;

3.包含许多不同类型代码控制的插件和支持许多第三方工具(这部分我还没去做尝试);

4.在java产品的版本构建上支持跨平台;

5.项目自身而言,使用自动构建和定时构建,能在此基础上持续改进,提升产品质量;

四.模块及体系结构

4.1 模块

CruiseControl 主要分3个模块:

1. build loops :后台功能,是CruiseControl的核心,定期调度CruiseControl中定义的要去build的项目,执行build.

2. dashboard: 一个web应用中的前端模块,使用者通过这个web页面可以获取到当前CruiseControl中的项目的build的状态等一些基础信息.如下图:

3. jsp reporting: 一个web应用中的前端模块 ,使用者在这个模块的页面中可以看到先前每个project build之后生成的详细信息.如下图:

4.2 CruiseControl的体系结构

五.运行原理

在CruiseControl的config文件中定义要持续集成的project,之后CruiseControl每隔一段时间就去轮询config文件,根据config文件中最新的配置去调用build工具去执行版本构建任务,这时候CruiseControl就会记录下版本构建的结果,构建过程中生成的日志,根据构建结果来执行其它操作,比如给相关人员发送邮件等.

六.安装部署

6.1 系统需求

1.操作系统

根据CruiseControl所包含的文件来看,CruiseControl支持在linux,unix和windows上运行.我本次是在windows上做了部署和build试验.在Solaris上只做了CruiseControl的部署,没有做project的build试验.

2.java环境

必须安装JDK,要设置JAVA_HOME环境变量,并且将$JAVA_HOME/bin加到了PATH路径中.

3.端口准备

默认情况下,CruiseControl启动后要占用操作机器上的8000端口给jmx用,8080端口供web访问用,1099端口给rmi用.所以需要提前确认这些端口没有被系统中其他程序占用.当然,也可以直接去修改启动的bat或者sh文件.

4.权限问题

在linux,unix等机器上,要确保对应的.sh是可执行的.

6.2 部署程序

cruisecontrol-bin-2.8.4.zip解压后运行cruisecontrol.bat即可(如果端口冲突,请改端口).

6.3 验证部署结果

运行成功后访问http://ip:port/dashboard,页面能显示connectfour这个project就说明部署正常.

在dashboard上面看见绿色的图块,鼠标放上去,看见Project: connectfour上次build成功,则说明现在一切正常,可以把自己的project放过来,做版本持续集成了.

七.部署自己的第一个java project

1.在eclipse中创建一个java project,名称为myProject

2.创建一个java类HelloWorld,位于cn.com.carnation包下,类的代码如下:

package cn.com.carnation;

public class HelloWorld{

public HelloWorld(){

super();

}

public String getHelloWorld(){

return "Hello,world!";

}

}

3.构建ant编译时所用的build.xml配置文件,内容如下:

<project name="myProject" default="all" basedir=".">

<property file="build.properties"/>

<path id="project.classpath">

<pathelement location="${svnjavahl.jar}" />

<pathelement location="${svnant.jar}" />

<pathelement location="${svnClientAdapter.jar}" />

</path>

<target name="all" depends="clean, compile, sleep, jar"/>

<target name="clean">

<delete dir="target" quiet="true" />

</target>

<target name="compile" >

<mkdir dir="target/classes"/>

<javac srcdir="src" destdir="target/classes">

<classpath>

<pathelement location="build/lib/${app.name}.jar" />

<pathelement path="${basedir}/lib" />

</classpath>

</javac>

</target>

<target name="sleep">

<echo message="Sleeping for a while so you can see the build in the new dashboard" />

<sleep seconds="5" />

</target>

<target name="jar" depends="compile">

<jar jarfile="target/myProject.jar" basedir="target/classes"/>

</target>

</project>

4.先手动执行一次,确认可以成功编译

在cmd下进入myProject 目录,使用ant来build一个版本

5.将这个project加入cruisecontrol的配置文件config.xml中,添加的代码如下:

6.等待一段时间, cruisecontrol会自动将新加进配置的project进行build,等待的时间从目前来看,是原有的project轮询的时间与当前时间的差值.

八.其它问题

8.1从svn获取要build的版本

从svn获取要build的版本,是持续集成的最重要的一步.

要从svn获取要build出来的版本,ant已经可以做到. Subclipse组织提供了一个名为svnant的project ,专门用来做ant在构建版本时从svn更新代码的操作.具体内容,可以参考官方网站:http://subclipse.tigris.org/svnant.html.

我只在此处列出一个可以的样例来说明怎样在版本构建前更新本地的代码:

1. build.xml中新加进去的部分

解释:先通过导入build.properties文件中的一些定义,通过这些定义,将svnant所需的三个jar文件加载到了一个path元素中,最后定义好要连接的svn的url目录,用户,密码,要迁出的目标目录.然后再定一个一个ant task,在里面做svn的代码迁出.

<property file="build.properties"/>

<path id="project.classpath">

<pathelement location="${svnjavahl.jar}" />

<pathelement location="${svnant.jar}" />

<pathelement location="${svnClientAdapter.jar}" />

</path>

<property name="svn_User" value="***"/>

<property name="svn_Password" value="***"/>

<property name="svn_url" value="svn://******/myProject" />

<property name="desdir" value="${basedir}" />

<taskdef resource="svntask.properties" classpathref="project.classpath"/>

<target name="update">

<svn>

<checkout url="${svn_url}" revision="HEAD" destPath="${basedir}" />

</svn>

</target>

2. build.properties文件中的内容

svnant.version=1.0.0

lib.dir=D:\program files\apache_org\apache-ant-1.8.2\lib

svnant.jar=${lib.dir}/svnant.jar

svnClientAdapter.jar=${lib.dir}/svnClientAdapter.jar

svnjavahl.jar=${lib.dir}/svnjavahl.jar

8.2设置发送邮件

8.2.1 介绍

CruiseControl中可以在每个要持续集成的project的配置中添加邮件通知.这样即使项目组员没有在公司,也可以获取到版本构建的情况.

1. 在CruiseControl中,发送的邮件分为两个格式:普通格式和html格式,对应的配置是email和htmlemail.

2. email或者htmlemail在配置中的位置

email配置点是project的publisher元素下的子元素.

8.2.2一个具体的例子

1. 以下是CruiseControl的config.xml文件中关于邮件通知的配置:

2. 配置说明:

1. mailhost用来指定邮件服务器,mailport用来制定端口,smtp邮件服务器的服务端口是25.username和password是用来发送build结果邮件的用户.reportsucess是表示在邮件中一直报告build成功的结果,默认就已经是取了always的值.

2. email的子元素<always>包含的值是一个电子邮件地址,表示不论build的结果如何,都将接收邮件.一个email可以包含0到多个always的子元素. <success>子元素包含的电子邮件地址是.build成功后的邮件接收人. <failure>子元素包含的电子邮件地址是build失败后的邮件接收人.

3. 邮件结果

8.3 远程控制部署project

1. 进入CruiseControl的dashboard页面中,有tools区域,如下所示:

2. 点击cc-config,调用java运行远程方法,在本地打开一个swing的界面的管理监控器(CruiseControl config/Monitoring tool),在其中可以管理CruiseControl的project.这部分内容后面会补充.

图8.3.1 监控和管理现有project

图8.3.2添加一个project

九.后续需解决问题

9.1 CruiseControl config/Monitoring tool 的使用以及在实际中的应用

这一块的功能现在只是有大体上的了解,还未具体实践过.

9.2 build过程中进行单元测试

单元测试在持续版本构建中必须要做,先前是手工做版本构建,现在实行自动构建,则单元测试部分需要加大力度去做,但这部分有遗留问题存在.因此需要特别考虑.

9.3 通知邮件的内容丰富

现有配置的通知邮件的内容只是告诉接收者build是否成功,然后就是一个url连接.而且这个url连接现在点击打开之后会访问出错.因此价值还不是很大.

除了通知build结果外,最好是把build过程中的日志特别是出错日志附带到邮件正文或者附件中,这样才能有更高的价值.

9.3将build好的版本部署到web服务器上

最好是将通过单元测试的包上传到web服务器上,部署到weblogic下,并且能自动启动weblogic.

后记:

1.文章第一次发出来,发现其中一张配置的图片中还有我的公司邮箱的配置,泄漏个人隐私和公司机密,哎,差点傻逼了啊.

2.其实cruisecontrol支持在build之前自己去svn上checkout代码,而不用依赖svnant的.下一篇文章中我会列出来.

转自:http://www.cnblogs.com/leipei2352/archive/2011/04/24/2026205.html

最新文章

  1. Redis学习笔记--五种数据类型的使用场景
  2. Magento Table Rate运费国家代码汇总
  3. Codeforces Round #180 (Div. 2) A. Snow Footprints 贪心
  4. UIView下使用Animation控制动画
  5. launchpad bzr
  6. 物理机与虚拟机IP互ping通,而互ping主机名不通
  7. 图的BFS代码
  8. 第七个问题(枚举和set)
  9. 八、 Spring Boot 过滤器、监听器
  10. Java并发框架——AQS阻塞队列管理(二)——自旋锁优化
  11. Kibana 搜索语法
  12. JAVA中MAP转LIST
  13. php背景图片上生成二维码,二维码上带logo 代码示例 (原)
  14. 惊不惊喜, 用深度学习 把设计图 自动生成HTML代码 !
  15. java虚拟机规范(se8)——java虚拟机结构(三)
  16. Angular 2的表格控件
  17. 多个按钮触发同一个Bootstrap自适应模态窗口
  18. DevExpress使用技巧总结
  19. Quartz.NET教程:(01) 使用Quartz
  20. 并发基础(六) 线程Thread类的start()和run()

热门文章

  1. 在cli命令行上显示当前数据库,以及查询表的行头信息
  2. SAP后勤模块实施攻略——1.ERP和SAP
  3. 软件磁盘阵列(RAID)
  4. 解释*args和**kwargs的含义
  5. list列表、tuple元组、range常用方法总结
  6. HTML系列(3)基本的HTML标签(二)
  7. java 图片Base64字符串转图片二进制数组
  8. Qt5.4.1移植到arm——Linuxfb篇
  9. Python编程-多线程
  10. [SCOI2013]火柴棍数字(背包)