一.背景

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的.下一篇文章中我会列出来.

CruiseControl初探相关推荐

  1. 2021年大数据Flink(九):Flink原理初探

    Flink原理初探 Flink角色分工 在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程. JobManager: 它扮演的是集群管理者的角色,负责调度任务.协调 checkp ...

  2. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书

    缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...

  3. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  4. las格式测井曲线_邹榕,等:顺北和托甫台区块奥陶系断裂结构单元测井响应特征初探...

    引用格式:邹榕,徐中祥,张晓明,等.顺北和托甫台区块奥陶系断裂结构单测井响应特征初探[J].油气藏评价与开发,2020,10(2):18-23.ZOUR, XU Z X, ZHANG X M, et ...

  5. 2018-4-15摘录笔记,《网络表征学习前沿与实践》 崔鹏以及《网络表征学习中的基本问题初探》 王啸 崔鹏 朱文武

    1.来源:<网络表征学习前沿与实践>  崔鹏 (1)随着数据的增加以及计算机计算速度的增加,想当然的以为速度快了,数据再多也是可以自己算的,但是若是数据之间存在着复杂的关系,那么处理一个样 ...

  6. 使用CruiseControl.Net全面实现持续集成

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

  7. python argparse_Python 命令行之旅:初探 argparse

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...

  8. HTML5+MUI+HBuilder 之初探情人

    07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪.爆炸式的崛 ...

  9. 使用Mahout搭建推荐系统之入门篇3-Mahout源码初探

    2019独角兽企业重金招聘Python工程师标准>>> 用意: 希望了解Mahout中数据的存储方式, 它如何避免java object带来的冗余开销.学完知识,要进行些实战 去分析 ...

  10. SAP RETAIL 补货类型RF之初探 II

    SAP RETAIL 补货类型RF之初探 II 1, 补货参数 – TargetCoverage字段不能为空. 如果不维护这个参数值,系统会提示:Target stock calculated dyn ...

最新文章

  1. 计算机维护系统Win8PE,u启动windows8PE工具箱
  2. 最近的一次敏捷项目Scrum经验总结
  3. vim入门教程(实践第一)
  4. C#中协变和逆变的基本概念、List和List.Select方法的命名空间
  5. (诊断)No module named MySQLdb
  6. 2021暑假实习-SSM超市积分管理系统-day01笔记
  7. MS SQL SERVER数据库简单回顾
  8. php界面框架luy_LazyPHP
  9. dubbo项目引用另一个项目的接口
  10. ubuntu 20.04 编译yocto 错误集锦
  11. 3803. 数组去重-AcWing题库
  12. django mysql 读写分离
  13. 管理感悟:需要什么样的技术文档
  14. 乌班图系统安装谷歌浏览器
  15. SaaS和和PaaS的概念
  16. 计算机弹出虚拟U盘,我们通过工具所自带的电脑模拟器对我们u盘制作启动盘进行模拟启动测试...
  17. Python简单绘制柱状图
  18. 浏览器解析jsx_React 初窥:JSX 详解
  19. 走进AI时代的文档识别技术 之文档重建
  20. 【新手上路】Java必备小游戏——Flappy Bird(飞翔的小鸟)

热门文章

  1. 监管科技崛起:从FinTech到RegTech
  2. Rust: 如何运行你在Atom中写的Rust代码?
  3. 2022年 品牌新零售将去向何方?
  4. 气候遇上AI:从此天有可测风云
  5. 机器学习笔记(二十四):召回率、混淆矩阵
  6. 【优化算法】晶体结构算法【含Matlab源码 1800期】
  7. 【图像去噪】基于matlab全变分算法图像去噪【含Matlab源码 1324期】
  8. 【图像隐写】基于matlab GUI DWT+SVD数字水印【含Matlab源码 606期】
  9. 【裂痕识别】基于matlab阈值裂痕+划痕检测【含Matlab源码 467期】
  10. c语言程序设计精髓第七周编程题,C语言程序设计精髓编程题在线测试