現在已經讓 CruiseControl 自動運行在一個很好的受控環境中。下面要做的就是向配置中添加自己的項目。正如所料,config.xml 文件中的項目看起來非常相似,不同之處只是要用哪個工具來構建項目的細節?梢栽谖谋揪庉嬈髦杏每截愓迟N的方式手工維護 config.xml 文件,但是一種更少出錯的技術是使用 XSLT 樣式表從更簡單的 XML 文檔生成 config.xml 文件。實現這個方案的文件集合已經合成了一個可以下載的壓縮 tar 文件(請參閱 下載)。請解壓縮這些文件到 /home/cruise 目錄:
[cruise@fcvm ~]$ ls config.xml force-build pkg xstream.ser cruisecontrol.log log src [cruise@fcvm ~]$ tar xvzf [...]/simple-cc.tar.gz meta-config-params.xsl meta-config.xsl meta-config.xml mkconfig [cruise@fcvm ~]$ ls config.xml meta-config-params.xsl pkg cruisecontrol.log meta-config.xml src force-build meta-config.xsl xstream.ser log mkconfig [cruise@fcvm ~]$ |
簡化的配置文件名為 meta-config.xml。這個文件要用 meta-config.xsl 樣式表進行變換,生成 CruiseControl 的 config.xml 文件。叫作 mkconfig
的簡單腳本用早先安裝的 XMLStarlet 工具執行轉換操作。請運行 mkconfig
重新生成 CruiseControl 的 config.xml 文件。
前面開始的簡單 CruiseControl 配置對于讓第一個構建工作來說足夠了,但是對于監視構建過程來說還不夠。最常見的需求是把集成構建的結果通過電子郵件發送給相關開發人員。meta-config.xsl 樣式表生成發送電子郵件消息的配置,但是要做到這一點,它需要一些本地環境變量的信息。它必須知道的許多變量要從 meta-config-params.xsl 文件讀;在開始之前應該根據實際情況修改這個文件。這個文件中的設置如下所示:
- home :構建進程的主目錄。如果采用的是這篇文章中描述的目錄布局,那么默認設置就可以了。
- cruisecontrol-home :CruiseControl 發行包解壓后所在的目錄。同樣,默認設置應當就可以了。
- ant-home :Ant 的安裝目錄。要使用 Fedora Core 4 自帶的 Ant,應當把這個值設為 /usr。
- maven-home :Maven 的安裝目錄(如果需要用它的話)。默認值假設把 Maven 解壓縮到 /home/cruise/pkg 目錄。
- return-address :CruiseControl 構建電子郵件的返回電子郵件地址。
- return-name :構建電子郵件返回地址的名稱。
- developers-address :除了上次成功構建之后進行過提交的開發人員之外,應當總是得到構建電子郵件拷貝的一個電子郵件地址。
對于構建成功或失敗時應當給誰發送電子郵件,CruiseControl 在這方面相當靈活。在這里使用的配置將向最后一次構建之后向版本控制系統中提交變更的每個開發人員發送電子郵件。持續集成構建可能還包含在其他地方開發的開放源碼項目(我將把它們稱作 遠程項目),這時,當遠程項目的開發人員弄糟了什么事的時候,可能并不想讓構建系統向他們發送電子郵件。在這種情況下,可以向一個地址發送郵件,這個地址通常是一個郵件列表,如果團隊成員經常想知道構建的狀態,可以訂閱這個郵件列表。這可以讓團隊負責人盡早發現構建發生了損壞。
清單 4 顯示了 meta-config.xml 文件的語法:
清單 4. meta-config.xml 的語法
<projects> <project name="project-name" [interval="seconds"]> <svn/>|<cvs/> <ant/>|<maven/> <clean>goals or targets to clean source tree</clean> <build>goals or targets to build</build> [<srcdir>source directory</srcdir>] [<remote-project/>] [<repo-dependency>groupId</repo-dependency>*] [<srcdir-dependency>project-name</srcdir-dependency>*] [<modificationset>CruiseControl elements</modificationset>] </project>* </projects> |
配置文件基本上是個 <project>
元素列表。每個項目都有一個 name
屬性?蛇x的 interval
屬性覆蓋了 CruiseControl 默認的 5 分鐘的構建間隔時間?梢蕴岣哌h程項目的構建間隔,以減輕它們的版本控制倉庫的負擔。
利用 <svn/>
或 <cvs/>
空元素,每個項目必須指定自己用來更新源樹的版本控制工具。項目還必須指定要使用的構建工具,或者是 <ant/>
或者是 <maven/>
。項目還必須包含兩個元素,說明要使用哪個目標(或哪個 Maven 的目標)清理和構建源樹。對于 Maven,典型的值可能是 <clean>clean</clean>
和 <build>jar:install-snapshot</build>
。對于 Ant,可能需要檢查 build.xml 文件來找到目標的名稱。
假設項目的源在 /home/cruise/src 目錄下,根據項目命名,那么 name
屬性為 my-project
的項目的源應當在 /home/cruise/src/my-project 中。有些項目擁有大型源樹,擁有可以單獨構建的子目錄;為了處理這種情況,<project>
元素可以包含可選的 <srcdir>
元素,由它指定 /home/cruise/src 目錄的特定子目錄。例如:
<project name="my-utils"> <srcdir>big-project/my-utils</srcdir> ... |
CruiseControl 默認的行為是向上次構建之后簽入變更的每個人發送電子郵件。如果是從遠程版本控制倉庫中拉出源代碼,請添加 <remote-project/>
元素,這可以使電子郵件發送到 meta-config.xsl 文件中指定的 developers-address
地址。
CruiseControl 并不知道項目之間的依賴關系?赡苡幸粋項目生成的 JAR 文件包含的工具類集合是其他許多項目依賴的,但是除非向 CruiseControl 解釋這個關系,否則它對這個關系將毫不知情?梢詫ぞ哳惖捻椖窟M行修改,從而造成它被重新構建,但是依賴它的項目不會針對工具類的新版本重新被構建和測試。這可能會降低集成測試的價值,所以出現了對這一問題的一些解決方案。
CruiseControl 為這個目的提供的主要工具是 <filesystem>
元素?梢园堰@個元素包含在某個項目的 <modificationset>
小節中,這樣只要文件系統的某些區域發生了修改,項目就會被重新構建。清單 1 中初始的 config.xml 文件就采用這種方式,在強制構建目錄中的文件發生修改時,觸發重新構建。所有的項目都會在文件系統的某個位置創建或更新制品。(例如,作為工具類項目的構建結果,會更新自己產生的 JAR 文件。)可以在 <filesystem>
元素中用這些位置,觸發依賴這些制品的項目進行構建。
Ant 在項目構建的方式方面有很高的靈活性,所以不可能確定地指出項目重新構建時會更新文件系統的哪個區域。在這里可以采用的唯一方法就是檢查每個文件的 build.xml 文件,找出它把構建的制品放在哪兒。然后才能把合適的 <filesystem>
元素添加到依賴這些制品的項目中。簡化的 meta-config.xml 文件支持一個 <modificationset>
元素,里面可以包含任何 CruiseControl 元素。它們會被拷貝到 config.xml 文件中。例如,依賴 XStream 的項目可能包含以下內容:
<project name="my-project"> [...] <modificationset> <filesystem folder="/home/cruise/src/xstream/xstream-SNAPSHOT.jar"/> </modificationset> </project> |
Maven 在每個項目上放了一個公共構建過程,所以在 Maven 項目間指定依賴性時,可以提供一些公共規則。項目可以對 Maven 倉庫中由指定群組創建的制品指定依賴。更準確地說,包含 <repo-dependency>classworlds</repo-dependency>
可以讓項目在 /home/cruise/.maven/repository/classworlds 下的文件發生變化時,重新進行構建。假設 classworlds
構建是在本地 Maven 倉庫中安裝了制作好的 JAR 文件,那么任何包含這個元素的項目都會自動重新構建。
項目也可以指定對其他項目的構建輸出的依賴。包含 <srcdir-dependency>classworlds</srcdir-dependency>
可以讓項目在 ${srcdir}/target 下的文件發生變化時重新進行構建,其中 ${srcdir} 是命名項目的源目錄。
下面是向持續集成構建添加新項目的步驟:
- 作為 cruise 用戶,把源代碼簽出到 /home/cruise/src 目錄。
- 檢查是否可以手工構建源樹。
- 向 meta-config.xml 添加適當的條目。
- 運行
./mkconfig
。 - 重啟 CruiseControl,以便它能從 config.xml 讀取新的項目條目?梢杂
ps
命令找到運行 CruiseControl 的 JVM 的進程 ID,然后用kill
命令殺死進程。也可以用 root 用戶身份運行svc -t /service/cruisecontrol
,讓daemontools
殺死進程。不管采用哪種方法,supervise
都可以保證 CruiseControl 會被重啟。 - 可選地,更新 /home/cruise/force-build/${project-name} 的時間戳也可以讓 CruiseControl 觸發自動重新構建。
文章來源于領測軟件測試網 http://www.kjueaiud.com/