CruiseControl初探

一.背景

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

二.CruiseControl 是什么

简单点说,就是一个项目自动构建,持续集成工具和框架(为何我叫它框架,是由于CruiseControl能够支持不少第三方扩展,并且也不仅是能build java应用,好比.net,不过.net的CruiseControl被更名成CruiseControl.NET了).前端

三.为何用它

1.开源免费,sourceforge上就能够下载到;java

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

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

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

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

四.模块及体系结构

4.1 模块

CruiseControl 主要分3个模块:服务器

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

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

clip_image002

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

clip_image004

4.2 CruiseControl的体系结构

clip_image006

五.运行原理

在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放过来,作版本持续集成了.

clip_image007

七.部署本身的第一个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中,添加的代码以下:

image

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

clip_image011

八.其它问题

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文件中关于邮件通知的配置:

image

2. 配置说明:

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

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

3. 邮件结果

clip_image015

8.3 远程控制部署project

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

clip_image016

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

clip_image018

图8.3.1 监控和管理现有project

clip_image019

图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

相关文章
相关标签/搜索