一.什么是持续化集成
什么是持续化集成?它对我们的日常工作有什么样的帮助?敏捷已经是一个非常热门的话题,它高效的工作方式和快速的需求应对能力,赢得了很多中小软件厂商的关注。那么敏捷除了一些经常谈论到编程思维和迭代的开发模式等,其实还部分依赖于好的改善工作流程的工具。持续化集成工具便是服务于敏捷软件开发的一个系列。它主要将原本分散,无序的工作流程,通过工具软件有机的组织起来,并且在组织的过程中,参与开发、设计、测试的各个部门的人员都能从中获取到自动化方面的便利。使得团队的工作效率大大提升。
二.CruiseControl 是什么
CruiseControl是一款由ThoughtWorks公司开发的轻量级的持续化集成工具。它能够将代码版本控制,单元测试,代码规范检查,项目的发布部署等工作步骤有机的组织起来,并且利用其调度性可作自动化处理,它还有强大的日志记录功能,能将集成结果及时地反馈给项目管理人员和项目开发人员。CruiseControl是使用java语言编写的一个持续集成工具,他有着良好的框架,所以可以在他基础上二次开发成自己定制的持续集成工具。CruiseControl集成了很多第插件,比如:源码控制、邮件通知、实时消息通知等等。而且他提供了一个web界面使大家更加方便的查看构建项目的当前以及历史状态。虽然CruiseControl使用java语言编写,但他并不限制只能构建JAVA项目,你可以通过ant等脚本构建各种语言的持续集成环境。
三.CruiseControl的特点
1.开源免费,http://cruisecontrol.sourceforge.net/上就可以下载到;
2.出来的时间较早,1.0版本出现在2001年,现在已经发展到了2.8.4版本了,部署使用的参考内容比较多;
3.包含许多不同类型代码控制的插件和支持许多第三方工具;
4.在java产品的版本构建上支持跨平台;
5.项目自身而言,使用自动构建和定时构建,能在此基础上持续改进,提升产品质量。
四.体系结构
4.1 组件
CruiseControl 主要分3个组件:
1. build loops :主要负责根据外部的xml配置,定时、周期性的根据外部SCM的状态启动构建任务,并将构建结果通过Email/IM/RSS等方式通知到相应的客户端。
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上。
2.版本下载
第一步:
A、从上面的官方网站下载最新的稳定版本,当前最新的稳定版本为2.8.4
B、下载JAVA安装包
第二步:解压下载的工具包(由于CC是绿色版的,所以解压即可不需安装),并在你的环境变量中增加两个环境变量
A、JAVA_HOME设置为你的JAVA安装目录
B、设置ANT_HOME为CC解压目录下的apache-ant-1.7.0目录,并且将“你的下载目录\cruisecontrol-bin-2.8.4\apache-ant-1.7.0\bin”加入你的path路径中
3.java环境
必须安装JDK,要设置JAVA_HOME环境变量,并且将$JAVA_HOME/bin加到了PATH路径中,如2中所述。
4.端口准备
默认情况下,CruiseControl启动后要占用操作机器上的8000端口给jmx用,8080端口供web访问用,1099端口给rmi用。所以需要提前确认这些端口没有被系统中其他程序占用,当然,也可以直接去修改启动的bat或者sh文件。
5.权限问题
如果在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放过来,做版本持续集成了。
七.部署构建自己的第一个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一个版本。指令为:ant run
5.将这个project加入cruisecontrol的配置文件config.xml中,添加的代码如下:
6.等待一段时间,cruisecontrol会自动将新加进配置的project进行build,等待的时间从目前来看是原有的project轮询的时间与当前时间的差值。
7.CC项目的目录结构
在下面粉红色的方框中,只需要配置一下文件即可:
1、confile.xml文件 -------所有项目的信息配置,包含了SCM以及发布信息等等
2、cruisecontrol.bat -------启动CC工具
3、apache-ant-1.7.0文件夹 -----这里存放了ant工具所有内容,包括lib
4、artifacts文件夹 -----存放了每次构建发布的工件,以项目进行区分
5、etc文件夹 -----存放了工具的配置,包括jetty容器、数据库连接配置等
6、lib文件夹 -----存放了所有CC依赖的lib库
7、log文件夹 -----存放了所有日志信息
8、projects文件夹 ------存放了你的构建项目的描述信息,构建自己的项目需要在这里面配置
9、webapps文件夹 ------存放了CC的WEB部署,如果你想定制自己的界面,就需要在这里配置
八.其它问题
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的配置中添加邮件通知,这样即使项目组员没有在公司,也可以获取到版本构建的情况。
- 在CruiseControl中,发送的邮件分为两个格式:普通格式和html格式,对应的配置是email和htmlemail。
- email或者htmlemail在配置中的位置:email配置点是project的publisher元素下的子元素。
8.2.2 一个具体的例子
1. 以下是CruiseControl的config.xml文件中关于邮件通知的配置:
2. 配置说明:
- mailhost用来指定邮件服务器,mailport用来制定端口,smtp邮件服务器的服务端口是25。username和password是用来发送build结果邮件的用户,reportsucess是表示在邮件中一直报告build成功的结果,默认就已经是取了always的值。
- 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。
监控和管理现有project
添加一个project