/*************************/
"擁抱變化" 是敏捷的態(tài)度之一, CruiseControl 正是來實(shí)證這種態(tài)度的作品. 多種類型的"變化"都會(huì)觸發(fā)CruiseControl的一次構(gòu)建過程.
我們知道CruiseControl能根據(jù)源代碼的變化來調(diào)度一次構(gòu)建, 但你知道CruiseControl支持多少種調(diào)度模式嗎?
---切爾斯基
/*************************/
1. 基于 "源代碼變化" 的調(diào)度 ( 3 種)
這是 CruiseControl 最經(jīng)典的調(diào)度模式, 可以參見 <modificationset>
-
一個(gè)小擴(kuò)展, 基于 "部分源代碼變化" 的調(diào)度, 參見<modificationset>的 "ignoreFiles" 屬性
-
一個(gè)小擴(kuò)展, "不需要任何源代碼變化" 的調(diào)度, 參見<modificationset>的 "requiremodification" 屬性(Deprecated), 和
2. 基于 "時(shí)間變化" 的調(diào)度 ( 6 種)
這是另外一種常用的調(diào)度模式, 通常用于 Nightly Build. 但是 CruiseControl 并沒有從架構(gòu)級(jí)別上支持這種調(diào)度, 基于時(shí)間的調(diào)度被分散到各個(gè)插件中, 得自己去看文檔尋找
以常用的幾種插件為例, 我們來看看CruiseControl支持的幾種基于 "時(shí)間變化" 的調(diào)度模式
2.1 一天之內(nèi)的調(diào)度
-
每天的某個(gè)時(shí)間段之外的時(shí)間來構(gòu)建, 參見<pause>插件, 如每天的凌晨2點(diǎn)至6點(diǎn)不要構(gòu)建:
<schedule><ant .../>
<pause starttime="0200" endtime="0600"/>
</schedule>
-
每天的某個(gè)時(shí)間段之內(nèi)的時(shí)間來構(gòu)建, 參見<pause>插件, 如每天的凌晨2點(diǎn)至6點(diǎn)之間構(gòu)建:
<schedule><ant .../>
<pause starttime="0000" endtime="0200"/>
<pause starttime="0600" endtime="2359"/>
</schedule>
從這里我們可以看出CruiseControl缺少對(duì) <not> 的支持
2.2 一周之內(nèi)的調(diào)度
這樣就有總共 3*2=6 種基于時(shí)間的調(diào)度
3. 基于 "依賴變化" 的調(diào)度 ( 6 種)
通常我們會(huì)將大的項(xiàng)目分成多個(gè)小項(xiàng)目來組織構(gòu)建, 這些小項(xiàng)目之間有依賴關(guān)系, 某個(gè)項(xiàng)目要等待另外一個(gè)成功之后再構(gòu)建才有意義, 比如說要用到其它project的構(gòu)建產(chǎn)物來作為輸入, 我們將這種情況稱之為Build Pipeline
CruiseControl并沒有對(duì)項(xiàng)目之間的依賴, 或曰Build Pipeline提供顯式建模或支持, 只是有一些插件來局部支持
-
你依賴的某個(gè)project構(gòu)建成功后再構(gòu)建, 參見<buildstatus>插件
-
你依賴的某個(gè)project構(gòu)建成功, 并且當(dāng)你自己的project試圖構(gòu)建時(shí), 你依賴的project還是最新的(源代碼沒有變化)時(shí)再構(gòu)建, 參見<veto>插件
-
當(dāng)硬盤上某個(gè)文件變化后再構(gòu)建, 通常這個(gè)文件是其它project的構(gòu)建產(chǎn)物, 參見<filesystem>插件
-
當(dāng)Web服務(wù)器上的某個(gè)文件變化后再構(gòu)建, 參見<httpfile>插件
-
多線程模式下某幾個(gè)項(xiàng)目不能同時(shí)構(gòu)建, 參見<lockfilelistener>, <lockfilebootstrapper>插件
/*************************/
由于 <modificationset> 可以包含多個(gè)插件, 并且缺省是 OR 的關(guān)系, 所以你基本上可以正交的應(yīng)用前面提到的所有調(diào)度模式, 這樣你就能得到 3 * 6 * 6 = 108 種調(diào)度模式
下面描述兩種令上述模式都失效的調(diào)度模式
/*************************/
4. 基于 "強(qiáng)制命令" 的調(diào)度
-
固定時(shí)間間隔的構(gòu)建, 不管有沒有源代碼變化, 一種方式是前面提到的<alwaysbuild>插件
-
按需構(gòu)建, 只有你通過UI或JMX顯式的來觸發(fā)構(gòu)建的時(shí)候才構(gòu)建, 一種方式是<forceonly>插件
/*************************/
在使用CruiseControl的過程中, 通常會(huì)遇到某些構(gòu)建比較耗時(shí), 或者檢查整個(gè)源代碼倉庫的時(shí)間過長等情況. 對(duì)此 CruiseControl 提供了一些優(yōu)化措施
/*************************/
5. 優(yōu)化調(diào)度
<schedule interval="60">
<ant target="masterbuild" />
<ant target="cleanbuild" multiple="5"/>
</schedule>
-
Fallback Build, 用固定時(shí)間的構(gòu)建來彌補(bǔ)一整天沒有源代碼變化的非敏捷情形, 參見<timebuild>插件
<modificationset>
<cvs localworkingcopy="/home/project">
<timebuild username="you_guys_are_not_agile" time="2300"/>
</modificationset>
-
先進(jìn)行耗時(shí)耗資源少的檢查, 有變化后再全面檢查取得所有變化, 參見<compound>插件
-
同時(shí)運(yùn)行多個(gè)構(gòu)建, 參見<threads>插件
缺少的那一塊
-
CruiseControl用<ant>等Builder來做
-
CruiseControl缺乏對(duì)project之間依賴關(guān)系, 或Build Pipeline的支持
-
CruiseControl的插件容器基本上是 OR 的關(guān)系, 缺乏對(duì)邏輯關(guān)系的顯式建模, 應(yīng)該提供 AND, NOT 等關(guān)系, 這樣我們就能組合應(yīng)用已有的插件. CruiseControl的現(xiàn)狀是分別提供了<compound>, <composite>, <compoundpublisher>等插件
參考
-
CruiseControl Scheduling Scenarios: http://confluence.public.thoughtworks.org/display/CC/CruiseControl+Scheduling+Scenarios
-
CruiseControl Enterprise 最佳實(shí)踐 (1) : Publish with a Publisher
-
CruiseControl Enterprise 最佳實(shí)踐 (2) : Keep your dependencies to yourself
-
CruiseControl Enterprise 最佳實(shí)踐 (3) : Configuring CruiseControl the CruiseControl way