SVN+CruiseControl+ANT環(huán)境搭建和配置介紹
51CTO向您推薦《使用SVN+CruiseControl+ANT實現(xiàn)持續(xù)集成》
1. 環(huán)境搭建
1.1. 下載及目錄介紹
從官方站點http://cruisecontrol.sourceforge.net/download.html下載一份最新的 CC 壓縮包,最新的版本號為2.8.4
下載了cruisecontrol-bin-2.8.4.zip 直接解壓到E盤下,文件結(jié)構(gòu)如下圖:
apache-ant-1.7.0:CC中使用ANT工具
artifacts:CC編譯生成發(fā)布包
etc:自帶容器Jetty對應(yīng)的配置文件
lib:自帶容器Jetty所需要到的Jar包
logs:各項目生成日志存在文件夾
projects:存放各項目文件目錄,進行程序的編譯
webapps:CC自帶應(yīng)用程序存放目錄
cc-config:用于CC環(huán)境變量配置
cruisecontrol:主應(yīng)用程序CC目錄
dashboard:用于編譯結(jié)果發(fā)布程序
documentation:CC相關(guān)文檔
config.xml:用于CC編譯配置文件,通過修改配置文件引入不同的插件,執(zhí)行不同的編譯流程
cruisecontrol.bat:在WINDOWS環(huán)境下進行啟用CC批處理腳本
cruisecontrol.sh:在Linux等環(huán)境下啟動CC腳本
dashboard-config.xml:Dashboard配置文件
1.2. 運行環(huán)境
使用JAVA開發(fā)的CC,當(dāng)然需要運行在JDK下并通過Web容器進行發(fā)布,具體要求如下:
CC需要運行在至少JDK 1.4環(huán)境中,在環(huán)境變量中設(shè)置有JAVA_HOME,并把java/bin加入到path中;
CC已經(jīng)內(nèi)建集成了ANT,不需要單獨引入;
CC可以運行在多種應(yīng)用服務(wù)器中,在自帶壓縮包中捆綁了一個開源應(yīng)用服務(wù)器,那就是Jetty 6,下面為了盡快建立我們的環(huán)境,以下將使用該容器。
1.3. 快速啟動CC
運行根目錄下批處理文件cruisecontrol.bat,出現(xiàn)如下界面:
運行成功后,我們可以在瀏覽器輸入 http://localhost:8080/cruisecontrol/來驗證一下結(jié)果(采用Jetty默認(rèn)的設(shè)置,端口號為 8080)
如果看到上圖結(jié)果,恭喜你已經(jīng)成功啟動CC。
另外CC提供了更加人性化結(jié)果展示Dashboard界面,在瀏覽器輸入 http://localhost:8080/dashboard/
2. 配置介紹
當(dāng)CC服務(wù)器啟動時,會自動檢測配置信息中的任務(wù)信息,并對其進行校驗和初始化,之后所有的工作,都是依據(jù)該配置信息進行的。
CC的配置使用了其安裝目錄下的config.xml文件,我們可以通過文本編輯器打開該配置文件,編輯各種配置信息。配置信息的定義遵循了標(biāo)準(zhǔn)XML文件格式,同時遵循了ANT自動構(gòu)建配置信息的規(guī)則。
2.1. config.xml
- <cruisecontrol>
- <project name="connectfour">
- <!-- 用來訪問項目當(dāng)前創(chuàng)建的狀態(tài) file: 指定了狀態(tài)文件的位置 -->
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
- <!-- 在 CC 進行創(chuàng)建之前運行,創(chuàng)建前的準(zhǔn)備工作 -->
- <bootstrappers>
- <!-- 從源碼控制系統(tǒng)更新本地文件: cvsbootstrappers、vssbootstrappers、svnbootstrapper -->
- <antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="clean" />
- </bootstrappers>
- <!-- 檢查各個源碼控制系統(tǒng)中是否發(fā)生變化;quietperiod: 單位為秒 設(shè)定等待的時間 -->
- <!-- 第一次的取出工作為手動執(zhí)行 -->
- <modificationset quietperiod="30">
- <!-- touch any file in connectfour project to trigger a build -->
- <filesystem folder="projects/${project.name}"/>
- </modificationset>
- <!-- 指定了構(gòu)建的時間間隔 單位為秒-->
- <schedule interval="300">
- <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
- </schedule>
- <!-- 指定項目日志保存的地點 -->
- <log>
- <merge dir="projects/${project.name}/target/test-results"/>
- </log>
- <!-- 在 build loop 結(jié)束之后運行,發(fā)布 build 的結(jié)果 -->
- <publishers>
- <onsuccess>
- <!--用于對創(chuàng)建過程中產(chǎn)生的人工制品進行發(fā)布-->
- <artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
- </onsuccess>
- <!--
- mailhost=郵件主機41 returnname=發(fā)件人42 returnaddress=發(fā)件地址43 defaultsuffix=默認(rèn)郵件后綴44 -->
- <htmlemail46 charset="UTF-8" mailhost="test163.com" 48 defaultsuffix="@xxx.com" username="xxx@163.com"
- password="xxx"
- returnname="CruiseControl"
- returnaddress="xxx@163.com"
- subjectprefix="構(gòu)建日志"
- xsldir="webapps/cruisecontrol/xsl"
- css="webapps/cruisecontrol/css/cruisecontrol.css">
- <always address="xxx@xxx.com.cn"/>
- <failure address="xxx@xxx,yyy@yyy.com.cn"/> 58 </htmlemail>
- </publishers>
- </project>
- </cruisecontrol>
2.2. build.xml
- <!—調(diào)用ANT執(zhí)行集成流程,包括清空目錄、編譯、休眠、測試、打包 -->
- <project name="connectfour" default="all">
- <target name="all" depends="clean, compile, sleep, test, jar"/>
- <!-- 1. 刪除根目錄下target 目錄-->
- <target name="clean">
- <delete dir="target" quiet="true" />
- </target>
- <!-- 2. 編譯程序,創(chuàng)建目錄并編譯程序,編譯輸出為target/classes目錄下-->
- <target name="compile">
- <mkdir dir="target/classes"/>
- <javac srcdir="src" destdir="target/classes"/>
- </target>
- <!-- 3. 在創(chuàng)建前等待60秒,用于Dashboard觀察進程-->
- <target name="sleep">
- <echo message="Sleeping for a while so you can see the build in the new dashboard" />
- <sleep seconds="60" />
- </target>
- <!-- 4. 進行自動化測試,依賴任務(wù)為compile-->
- <target name="test" depends="compile">
- <mkdir dir="target/test-classes"/>
- <!—調(diào)用junit進行自動化測試-->
- <javac srcdir="test" destdir="target/test-classes">
- <classpath>
- <pathelement location="target/classes"/>
- <pathelement location="lib/junit.jar"/>
- </classpath>
- </javac>
- <!—創(chuàng)建測試結(jié)果存放目錄-->
- <mkdir dir="target/test-results"/>
- <junit haltonfailure="no" printsummary="on">
- <classpath >
- <pathelement location="target/classes"/>
- <pathelement location="lib/junit.jar"/>
- <pathelement location="target/test-classes"/>
- </classpath>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml" />
- <!—測試文件所在文件地址-->
- <batchtest todir="target/test-results" >
- <fileset dir="target/test-classes" includes="**/*Test.class"/>
- </batchtest>
- </junit>
- </target>
- <!-- 5. 程序打包,依賴與compile任務(wù)-->
- <target name="jar" depends="compile">
- <jar jarfile="target/connectfour.jar" basedir="target/classes"/>
- </target>
- </project>
2.3. 執(zhí)行配置解析
一個持續(xù)集成項目是從project節(jié)點開始的,對該項目進行的操作都會作為子節(jié)點存在與該根節(jié)點之下。對于每一個project節(jié)點,CC系統(tǒng)都會將其當(dāng)作一個處理單元,并在最初建立該項目的時候進行初始化操作。
name是project節(jié)點常用的屬性,也是必設(shè)且值唯一的屬性,該屬性的值會在整個CC系統(tǒng)使用,包括配置文件的${project.name}變量值。
在一個項目節(jié)點中,我們可以定義監(jiān)聽器、本地目錄位置、變更輪詢目錄位置、輪詢間隔、任務(wù)執(zhí)行、單元測試、日志記錄等多種項目操作,同時CC系統(tǒng)支持插件擴展功能,這些擴展插件可以直接在一個項目中使用。
2.3.1. 輪詢版本控制系統(tǒng)
版本庫輪詢機制是使用modificationset進行配置的。CC系統(tǒng)內(nèi)置的輪詢模塊會根據(jù)設(shè)定的時間段對版本庫進行檢測,一旦發(fā)現(xiàn)版本庫發(fā)生變更,就會調(diào)用Check Out Build Test Publish等一系列的操作,對最新的代碼進行集成,并運行一系列預(yù)先設(shè)定的任務(wù)。
CC支持十多種版本控制系統(tǒng),比如CVS、SVN、Starteam、VSS等,對這些版本控制系統(tǒng)的調(diào)用,只需要配置相應(yīng)的節(jié)點名稱即可。本文以SVN版本管理系統(tǒng)為例。在modificationset節(jié)中,我們看到唯一的一個子節(jié)點:
<svn localWorkingCopy="projects/CM/${project.name}/src/${project.name}"/>
該節(jié)點使用了svn關(guān)鍵字,表示當(dāng)前工程使用的版本控制系統(tǒng)是SVN,localWorkingCopy屬性的值是告訴CC本地的拷貝目錄,其余的工作則由CC內(nèi)置的操作模塊進行。
2.3.2. 執(zhí)行構(gòu)建腳本
實質(zhì)上,執(zhí)行構(gòu)建腳本也是CC的一個可定制任務(wù),但由于自動構(gòu)建是持續(xù)集成的一個重要組成部分,因此在此單獨提出。
CC的自動構(gòu)建是使用ANT工具來進行的,當(dāng)然我們也可以使用其它的自動構(gòu)建工具來替代(比如Maven),這些的工具僅僅是體現(xiàn)在一個任務(wù)配置語句上,在此,以ANT工具為例。
在schedule節(jié),我們同樣使用了一個子節(jié)點來描述自動構(gòu)建工作:
<ant anthome="ant6" buildfile="projects/CM/${project.name}/src/${project.name}/build.xml"/>
該節(jié)點使用了ant關(guān)鍵字,表示該任務(wù)使用了ant來進行自動構(gòu)建任務(wù),anthome屬性則指定了ANT工具的具體位置,buildfile屬性則指定了ANT進行自動構(gòu)建所使用的配置文件Build.xml文件的路徑。
這樣,在CC決定進行自動構(gòu)建任務(wù)時,會根據(jù)設(shè)定找到執(zhí)行所使用到的信息。
2.3.3. 執(zhí)行單元測試
CC可以自動偵測自動構(gòu)建配置文件中單元測試的任務(wù),并在代碼集成完畢將執(zhí)行結(jié)果反饋到相應(yīng)的模塊。
ANT支持xUnit系列的單元測試框架,只需要在配置文件中加入一個target節(jié),即可在自動構(gòu)建完成之后,進行單元測試工作,有關(guān)的詳細(xì)配置,請參閱ANT官方文檔。
原文鏈接:http://www.cnblogs.com/shishanyuan/archive/2011/09/15/2177862.html
【編輯推薦】