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

相關文章
相關標籤/搜索