Posted on 2008-01-05 18:29
切爾斯基 閱讀(2718)
評論(0) 編輯 收藏
/*************************/
"擁抱變化" 是敏捷的態度之一, CruiseControl 正是來實證這種態度的作品. 多種類型的"變化"都會觸發CruiseControl的一次構建過程.
我們知道CruiseControl能根據源代碼的變化來調度一次構建, 但你知道CruiseControl支持多少種調度模式嗎?
---切爾斯基
/*************************/
1. 基于 "源代碼變化" 的調度 ( 3 種)
這是 CruiseControl 最經典的調度模式, 可以參見
<modificationset>
2. 基于 "時間變化" 的調度 ( 6 種)
這是另外一種常用的調度模式, 通常用于 Nightly Build. 但是 CruiseControl
并沒有從架構級別上支持這種調度, 基于時間的調度被分散到各個插件中, 得自己去看文檔尋找
以常用的幾種插件為例, 我們來看看CruiseControl支持的幾種基于 "時間變化" 的調度模式
2.1 一天之內的調度
<schedule>
<ant .../>
<pause starttime="0200" endtime="0600"/>
</schedule>
<schedule>
<ant .../>
<pause starttime="0000" endtime="0200"/>
<pause starttime="0600" endtime="2359"/>
</schedule>
從這里我們可以看出CruiseControl缺少對 <not> 的支持
2.2 一周之內的調度
這樣就有總共 3*2=6 種基于時間的調度
3. 基于 "依賴變化" 的調度 ( 6 種)
通常我們會將大的項目分成多個小項目來組織構建, 這些小項目之間有依賴關系, 某個項目要等待另外一個成功之后再構建才有意義,
比如說要用到其它project的構建產物來作為輸入, 我們將這種情況稱之為Build Pipeline
CruiseControl并沒有對項目之間的依賴, 或曰Build Pipeline提供顯式建模或支持,
只是有一些插件來局部支持
-
你依賴的某個project構建成功后再構建, 參見<buildstatus>插件
-
你依賴的某個project構建成功, 并且當你自己的project試圖構建時, 你依賴的project還是最新的(源代碼沒有變化)時再構建,
參見<veto>插件
-
當硬盤上某個文件變化后再構建, 通常這個文件是其它project的構建產物, 參見<filesystem>插件
-
當Web服務器上的某個文件變化后再構建, 參見<httpfile>插件
-
基于上次構建結果的調度, 參見
-
多線程模式下某幾個項目不能同時構建, 參見<lockfilelistener>,
<lockfilebootstrapper>插件
/*************************/
由于
<modificationset> 可以包含多個插件, 并且缺省是 OR 的關系, 所以你基本上可以正交的應用前面提到的所有調度模式, 這樣你就能得到
3 * 6 * 6 = 108 種調度模式
下面描述兩種令上述模式都失效的調度模式
/*************************/
4. 基于 "強制命令" 的調度
/*************************/
在使用CruiseControl的過程中, 通常會遇到某些構建比較耗時, 或者檢查整個源代碼倉庫的時間過長等情況.
對此 CruiseControl 提供了一些優化措施
/*************************/
5. 優化調度
<schedule interval="60">
<ant target="masterbuild" />
<ant target="cleanbuild"
multiple="5"/>
</schedule>
<modificationset>
<cvs localworkingcopy="/home/project">
<timebuild username="you_guys_are_not_agile" time="2300"/>
</modificationset>
缺少的那一塊
-
CruiseControl用<ant>等Builder來做
-
CruiseControl缺乏對project之間依賴關系, 或Build Pipeline的支持
-
CruiseControl的插件容器基本上是 OR 的關系, 缺乏對邏輯關系的顯式建模, 應該提供
AND, NOT 等關系, 這樣我們就能組合應用已有的插件. CruiseControl的現狀是分別提供了<compound>,
<composite>,
<compoundpublisher>等插件
-
CruiseControl已經提供了
參考
此文獻給小丸子