對開源 CI 服務(wù)器:CruiseControl、Luntbuild 和 Continuum 的調(diào)查
Paul Duvall (paul.duvall@stelligent.com), CTO, Stelligent Incorporated
2006 年 10 月 23 日
由于有許多持續(xù)集成服務(wù)(CI)服務(wù)器可以選擇,所以很難決定哪個(gè)適應(yīng)自己。在 讓開發(fā)自動化 系列的第二篇文章中,開發(fā)自動化專家 Duvall 采用一致的評估標(biāo)準(zhǔn)和很多說明性示例,介紹了一些開源 CI 服務(wù)器,包括 Continuum、CruiseControl 和 Luntbuild。
在我腦海里,我至少能想到 12 種在當(dāng)前市場上可用的 CI 服務(wù)器,包括商業(yè)的和開源的。雖然它們都試圖自動進(jìn)行軟件構(gòu)建的過程,但是都有各自的優(yōu)點(diǎn)和不足。而且,有太多工具可供選擇的不良后果就是很難決定究竟應(yīng)該選擇使用哪個(gè)。
在選用自動化過程的工具時(shí),要時(shí)刻記住的就是:工具要 確實(shí)適用。選擇錯(cuò)誤的工具可能會限制整體的靈活性,會導(dǎo)致執(zhí)行簡單動作反而需要更長時(shí)間,或者會把人鎖定在特定的支持工具或過程。
選擇 CI 服務(wù)器的標(biāo)準(zhǔn)
通常,對一個(gè)新工具的決策分析可以歸結(jié)如下:
我聽說 Tim 在使用 Acme Inc 的工具,而且我認(rèn)為 Tim 是個(gè)聰明人。所以,我也要使用 Acme Inc 的工具。現(xiàn)在我也是個(gè)聰明人了。
 |
關(guān)于本系列 作為開發(fā)人員,我們的工作就是為用戶提供自動化處理;但是,我們中的許多人卻忽視了自動化自己的開發(fā)過程的機(jī)會。出于這個(gè)目的,讓開發(fā)自動化 這一系列的文章專門研究了自動化軟件開發(fā)過程的實(shí)際應(yīng)用,并教您 什么時(shí)候 和 如何 成功應(yīng)用自動化。 |
|
反過來,如果您問 Tim 為什么 他選擇使用 Acme Inc 的工具,您可能會發(fā)現(xiàn)是他的公司強(qiáng)制要求使用的。這就是為什么重要的是要根據(jù) 自己的 具體技術(shù)和政策需求對工具進(jìn)行分析。如果不這么做,可能就會選擇到不符合需求的工具,甚至更糟糕的是,不能帶來任何幫助的工具。
在決策的時(shí)候,通常多數(shù)人都會把重點(diǎn)放在工具的特性上。但是要記住,雖然特性的確重要,但還有其他指標(biāo)需要考慮。在我的實(shí)踐中,我發(fā)現(xiàn)以下五個(gè)指標(biāo)在評估工具時(shí)最有幫助:
 |
什么是持續(xù)集成?
持續(xù)集成(CI)是一種實(shí)踐,可以讓團(tuán)隊(duì)在持續(xù)的基礎(chǔ) 上收到反饋并進(jìn)行改進(jìn),不必等到開發(fā)周期后期才尋找和修復(fù)缺陷。諸如 CruiseControl 之類的檢查工具是在后臺運(yùn)行的,它們輪詢版本控制存儲庫,從中尋找更改之處。當(dāng)發(fā)現(xiàn)某一更改時(shí),這類工具就會通過 Ant 執(zhí)行預(yù)定義的構(gòu)建腳本。持續(xù)檢查借助持續(xù)集成的實(shí)踐得以改進(jìn)。
|
|
- 特性
- 可靠性
- 壽命
- 目標(biāo)環(huán)境
- 易用性
而且不要忘記,客觀地 檢查這五個(gè)方面也是重要的。
產(chǎn)品特性
說到 CI 服務(wù)器的特性,應(yīng)當(dāng)考慮該工具與版本控制系統(tǒng)的集成、處理構(gòu)建平臺(例如 Ant 和 Maven)的能力以及提供反饋和報(bào)告的能力。而且不要忘記檢查其他特性,例如構(gòu)建標(biāo)號和管理項(xiàng)目的依賴項(xiàng)。最后,在需要做一些特定的增強(qiáng)時(shí),理解產(chǎn)品的可擴(kuò)展性會很有幫助。
表 1 詳細(xì)說明了每個(gè)特性:
表 1. 詳細(xì)的 CI 服務(wù)器評估特性
特性 |
解釋 |
版本控制系統(tǒng)集成 |
如果工具不支持您所使用的特定版本控制系統(tǒng),您真的會為它編寫一個(gè)定制集成么? |
構(gòu)建工具集成 |
在選擇 CI 服務(wù)器時(shí),需要考慮目前或?qū)⒁褂媚膫€(gè)構(gòu)建工具。對于 Java™ 編程,有兩個(gè)自然的選擇:Ant 和 Maven,幾乎所有 CI 工具都支持它們。如果構(gòu)建系統(tǒng)既不是 Ant 也不是 Maven,那么 CI 工具支持從命令行運(yùn)行程序的功能么? |
反饋和報(bào)告 |
想想老話 “如果樹倒在森林中,能有人聽到么?” 如果構(gòu)建失敗,會有人知道么?如果沒人知道,那么使用 CI 工具的目的是什么?所有的 CI 工具都提供一些通知機(jī)制,但是哪個(gè)最適合您呢?電子郵件?即時(shí)消息?RSS? |
標(biāo)號 |
有些開發(fā)團(tuán)隊(duì)喜歡跟蹤構(gòu)建,給構(gòu)建一個(gè)唯一的標(biāo)號,這樣日后就能找到具體的構(gòu)建實(shí)例。如果這對您來說很重要,那么要注意只有少數(shù) CI 服務(wù)器提供了這個(gè)功能。 |
項(xiàng)目依賴項(xiàng) |
某些情況下,在構(gòu)建了一個(gè)項(xiàng)目之后,可能需要構(gòu)建其他依賴項(xiàng)目。有些 CI 服務(wù)器支持這個(gè)特性,有些不支持。 |
易于擴(kuò)展 |
擴(kuò)展工具當(dāng)前的功能有多容易?是否用插件就可以實(shí)現(xiàn)簡單的擴(kuò)展,還是總得修改代碼? |
從特性的角度來說,以上提到的幾點(diǎn)在選擇所需要的正確的 CI 服務(wù)器時(shí),至關(guān)重要。
產(chǎn)品可靠性
因?yàn)橄螺d和使用開源 CI 服務(wù)器很簡單,所以可以試用產(chǎn)品來判斷它的可靠性。而且,在工具的可靠性和它在市場上的時(shí)間之間,通常存在一些相關(guān)性。使用新產(chǎn)品時(shí),就會冒著有未發(fā)現(xiàn)的 bug 的風(fēng)險(xiǎn)。而且,用戶群是發(fā)現(xiàn)工具出現(xiàn)的問題的優(yōu)秀資源。大量的問題貼子或者過多的復(fù)雜問題,就表示用戶對這個(gè)工具的意見較大。
因?yàn)槲疫@里討論的服務(wù)器是開源的,所以很容易發(fā)現(xiàn)下載的人數(shù),這也會是產(chǎn)品健康程度的一個(gè)指示。用戶少可能意味著反饋渠道少,可能需要換個(gè)地方看看。
壽命前景
在下載 CI 服務(wù)器之前,了解這個(gè)服務(wù)器未來的前景會有幫助。簡單地說,使用已經(jīng)死亡或正走向死亡的產(chǎn)品不是個(gè)好主意。可以檢查該工具已經(jīng)出現(xiàn)了多少年、在它的用戶群中是否有正常數(shù)量的活動。就像可以從用戶群來判斷產(chǎn)品的可靠性一樣,活躍的社區(qū)是工具未來前景良好的征兆。
目標(biāo)環(huán)境
CI 服務(wù)器不能在 所有 環(huán)境下工作。需要考慮服務(wù)器支持哪個(gè)操作系統(tǒng)以及具體的系統(tǒng)需求。例如,如果工具是用最新版本的 Python 編寫的,那么需要確定這個(gè)版本 Python 能夠用于自己的操作系統(tǒng)。
易用性
產(chǎn)品的易用性可能是最主觀的指標(biāo)。有些人愿意手工修改配置文件,而有些人想讓所有管理任務(wù)都在應(yīng)用程序中執(zhí)行,例如 Web 控制臺。有些服務(wù)器要求從一個(gè)屏幕單擊到下一個(gè)屏幕來執(zhí)行簡單的管理,而其他服務(wù)器則提供了直觀的向?qū)А?
如果想理解 CI 服務(wù)器的具體細(xì)節(jié),那么漂亮的管理 Web 表單就不重要了;但是,如果人手不足、工作繁忙,那么可能不會想在管理 CI 服務(wù)器上花太多時(shí)間。
記住我在這節(jié)討論的五個(gè)方面,再來看一下三個(gè) CI 服務(wù)器:Apache 的 Continuum、CruiseControl 和構(gòu)建管理服務(wù)器 Luntbuild。
Apache Continuum
Continuum 是最新的 CI 服務(wù)器之一,也是值得關(guān)注的一個(gè)新進(jìn)入者。Continuum 的安裝和配置很簡單:只要下載和釋放 ZIP 文件,運(yùn)行命令行程序,就可以運(yùn)行了。基于 Web 的界面使得配置項(xiàng)目很容易。而且,還不需要安裝 Web 服務(wù)器,因?yàn)?Continuum 內(nèi)置了 Jetty Web 服務(wù)器。并且,Continuum 可以作為 Windows 服務(wù)運(yùn)行,還在應(yīng)用程序的某些部分嵌入了上下文敏感的文檔,從而提供了很多幫助。
 |
想要更多細(xì)節(jié)信息? 面對如此之多 CI 服務(wù)器可以選擇,本文可以引導(dǎo)您更詳細(xì)地研究每個(gè)服務(wù)器,并決定哪個(gè)最合適。因?yàn)槲冶容^了三個(gè)不同的服務(wù)器,所以我沒有深入每個(gè)服務(wù)器的特定細(xì)節(jié)。我只是把重點(diǎn)放在了這些服務(wù)器安裝后就提供的選項(xiàng)上。如果需要更多信息,請參考每個(gè)服務(wù)器的安裝和配置指南。 |
|
易于使用
在使用 Continuum 時(shí)會注意到的第一件事就是它的易用性。能夠在幾分鐘之內(nèi)就把服務(wù)器運(yùn)行起來并讓它去查詢修改。實(shí)際上,在 Windows 上啟用 Continuum 只需要四步:
- 下載 Continuum ZIP 文件(請參閱 參考資料)。
- 把文件的內(nèi)容釋放到本地目錄。
- 運(yùn)行 run.bat 文件,然后運(yùn)行 InstallService.bat。
- 打開瀏覽器指向 http://localhost:8080/。
Continuum 內(nèi)置支持五個(gè)版本控制系統(tǒng):Subversion、CVS、StarTeam、Bazaar 和 Perforce。也部分地支持其他版本控制工具,例如 Visual Source Safe 和 ClearCase。 Continuum 還支持四種構(gòu)建機(jī)制:Ant、Maven1、Maven2 和 Shell(命令行)。
配置 Continuum
在第一次訪問 Continuum Web 應(yīng)用程序時(shí),默認(rèn)是 guest 帳戶。guest 提供了對所有項(xiàng)目的只讀存取,沒有管理或配置項(xiàng)目的能力。但是,可以很容易地創(chuàng)建 Administrative 用戶,然后設(shè)置一些適用于所有項(xiàng)目的屬性。
圖 1 顯示了管理頁面,它提供了管理所有項(xiàng)目的 Continuum 設(shè)置的能力,包括創(chuàng)建 Admin 帳戶、構(gòu)建的輸出和部署目錄:
圖 1. Continuum 的配置很簡單
把項(xiàng)目添加到監(jiān)視器
對 Continuum 進(jìn)行配置讓它監(jiān)視項(xiàng)目也非常簡單。簡單到僅僅是選擇期望的構(gòu)建平臺,例如 Ant 或 Maven2,然后把 Continuum 指到期望的版本控制系統(tǒng)。
圖 2 顯示了設(shè)置 Ant 項(xiàng)目時(shí)需要填充的字段:
圖 2. 在 Continuum 中創(chuàng)建項(xiàng)目
在保存了這個(gè)信息之后,Continuum 每小時(shí)查詢版本控制系統(tǒng)一次。可以修改項(xiàng)目的設(shè)置,查詢得更頻繁或更少些。我們在這里談到的是 持續(xù) 集成,我建議每五 分鐘檢查修改一次,而不要每小時(shí)一次。
默認(rèn)情況下,在使用 Ant 時(shí),Continuum 在項(xiàng)目的根目錄查找項(xiàng)目的 build.xml 文件。如果使用不同的名稱或者這個(gè)文件不在項(xiàng)目的根目錄,可以修改這個(gè)設(shè)置。
雖然 Continuum 還是 CI 舞臺上的新人,但是它以其易用性和對當(dāng)前眾多流行的版本控制系統(tǒng)和構(gòu)建工具的支持,還是給這一領(lǐng)域帶來了巨大的沖擊。我希望在未來的版本中會有添加和查看報(bào)告的功能。
CruiseControl
CruiseControl 是 CI 服務(wù)器的老者。它已經(jīng)用了有五年多了,在許多方面, CruiseControl 服務(wù)器 已經(jīng)成為持續(xù)集成實(shí)踐的同義詞。出于完全坦白的目的,我應(yīng)當(dāng)提到,我也是 CruiseControl 的多年的老用戶。
改進(jìn)的安裝
如果您從最后一次使用 CruiseControl 到現(xiàn)在已經(jīng)有段時(shí)間,而且認(rèn)為它的安裝和配置是個(gè)負(fù)擔(dān),那么您可以看看最新版本。現(xiàn)有,有許多方式安裝 CruiseControl。例如,如果使用 Windows,會發(fā)現(xiàn)最簡單的方式是下載二進(jìn)制可執(zhí)行文件,然后運(yùn)行它。不用擔(dān)心,還可以下載源代碼。
安裝之后,CruiseControl 預(yù)先配置了一個(gè)配置文件,輪詢 CVS 存儲庫并執(zhí)行 Ant 構(gòu)建腳本。同樣也不需要安裝 Web 服務(wù)器,因?yàn)?CruiseControl 也內(nèi)嵌了 Jetty。
輪詢版本控制系統(tǒng)
比起 Luntbuild 和 Continuum,CruiseControl 提供了對超過十種不同版本控制系統(tǒng)的支持。而且,CruiseControl 對這些工具中的許多定制命令也提供了支持。清單 1 是一個(gè)使用 CruiseControl config.xml 腳本輪詢 Subversion 存儲庫的示例:
清單 1. 通過 config.xml 文件輪詢存儲庫
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
</listeners>
<modificationset quietperiod="30">
<svn RepositoryLocation="http://www.qualitylabs.org/svn/ambientorb/trunk"
username="bfranklin"
password="G0Fly@Kite"
/>
</modificationset>
|
執(zhí)行構(gòu)建腳本
當(dāng)在版本控制系統(tǒng)(例如 Subversion)中發(fā)現(xiàn)修改時(shí),可以很容易地配置 CruiseControl 去執(zhí)行委托的構(gòu)建腳本。例如,清單 2 演示了從 config.xml 調(diào)用 Ant 腳本,它指示 CruiseControl 每 60 秒鐘查詢 Subversion 存儲庫一次,并執(zhí)行另一個(gè) Ant 腳本。 委托的構(gòu)建腳本(沒有顯示)刪除舊文件,從 Subversion 簽出最新的源代碼,并在代碼上運(yùn)行項(xiàng)目的構(gòu)建腳本。
清單 2. 執(zhí)行 Ant 構(gòu)建腳本
<schedule interval="60">
<ant anthome="apache-ant-1.6.5" buildfile="build-${project.name}.xml"/>
</schedule>
|
當(dāng)設(shè)置了 CruiseControl 的這個(gè)方面并啟動服務(wù)器之后,可以訪問如圖 3 所示的 CruiseControl Web 控制板:
圖 3. CruiseControl 控制板
CruiseControl 控制板
要接收最新構(gòu)建的反饋,可以把 htmlemail
插件添加到清單 3 所示的 config.xml 腳本。可以用 config.xml 文件配置更多反饋機(jī)制,例如發(fā)送文本消息、電子設(shè)備(通過 X10)、甚至即時(shí)消息。
清單 3. 用 CruiseControl 發(fā)送電子郵件
...
<plugin name="htmlemail"
buildresultsurl="http://${env.COMPUTERNAME}/cruisecontrol/buildresults/${project.name}"
mailhost="${smtp.server}"
username="${mail.username}"
password="${mail.password}"
returnaddress="${buildmaster.email}"
returnname="${buildmaster.name}"
subjectprefix="${project.name} build"
xsldir="webapps/cruisecontrol/xsl"
css="${reportdir}/cruisecontrol.css"/>
...
<htmlemail>
<always address="${buildmaster.email}"/>
<failure address="${buildmaster.email}"/>
</htmlemail>
|
CruiseControl 提供了許多有用的特性,有強(qiáng)大的用戶社區(qū),極具擴(kuò)展性。與本文中評估的其他工具相比,有些開發(fā)人員覺得 CruiseControl 不太容易使用。而另一方面,有些開發(fā)人員則發(fā)現(xiàn)用 XML 腳本進(jìn)行修改提供了更好的控制。
Luntbuild
從面市年頭上說,Luntbuild 位于 Continuum 和 CruiseControl 之間。比起 Continuum 和 CruiseControl,Luntbuild 的目標(biāo)是為并行開發(fā)和用戶管理之類的事情提供支持的構(gòu)建管理服務(wù)器。它的整個(gè)配置是通過 Web 應(yīng)用程序管理的,所以沒有配置文件需要處理。它也有商業(yè)版可以使用,叫作 QuickBuild,商業(yè)版中包含用戶支持。
Jetty 不再必需
Luntbuild 提供了幾種安裝方式。您可能會發(fā)現(xiàn)最簡單的方式是通過 GUI 安裝。用 Web 應(yīng)用程序配置和管理 Luntbuild;所以,需要確保正在運(yùn)行一個(gè)能夠處理 JSP 的 Web 服務(wù)器,像 Tomcat 或 Jetty。
版本控制輪詢
Luntbuild 提供了對八種不同版本控制系統(tǒng)的支持,例如 CVS、Subversion、ClearCase 和 Perforce。圖 4 演示了 Luntbuild 被設(shè)置成輪詢 Subversion:
圖 4. Luntbuild 輪詢 Subversion 存儲庫
執(zhí)行構(gòu)建
Luntbuild 支持五種不同的構(gòu)建平臺,包括 Ant、Maven、Maven2、命令行和 rake (用來構(gòu)建 Ruby 應(yīng)用程序)。圖 5 顯示了 Ant 構(gòu)建器的配置頁面:
圖 5. 用 Luntbuild 執(zhí)行 Ant 腳本
構(gòu)建安排
通過使用 Luntbuild 中的 Schedule 標(biāo)簽(如圖 6 所示),可以設(shè)置 Luntbuild 多久輪詢一次版本控制系統(tǒng)來獲得修改。在這個(gè)標(biāo)簽上,還可以指定分配給每個(gè)構(gòu)建的唯一構(gòu)建標(biāo)號。
圖 6. 在 Luntbuild 中安排構(gòu)建
在 Luntbuild 中發(fā)布結(jié)果
配置了項(xiàng)目、版本控制系統(tǒng)適配器、構(gòu)建和計(jì)劃程序之后,就可以指定用戶接收反饋的方式了。但是,Luntbuild 只內(nèi)置了對電子郵件和即時(shí)消息的支持。另外,可以從 Luntbuild 的主頁監(jiān)視構(gòu)建,如圖 7 所示:
圖 7. 從 Luntbuild Web 應(yīng)用程序監(jiān)視構(gòu)建
Luntbuild 提供了一整套強(qiáng)大的功能,包括管理項(xiàng)目依賴項(xiàng)和大量的版本控制系統(tǒng)適配器。我認(rèn)為工作流和用戶界面可以簡化,因?yàn)樾枰S多步驟來設(shè)置和配置工具。
CI 記分卡
在不理解具體需求的情況下,就推薦哪個(gè)工具合適是非常冒失的。每個(gè)服務(wù)器都有許多優(yōu)秀的特性,而且就像我在開始時(shí)所提到的,僅僅因?yàn)槟硞€(gè) CI 服務(wù)器最適合某人,并不意味著它必然滿足您的需求。
如果尋找的是易于使用的工具,請選擇 Continuum。如果擴(kuò)展性、靈活性和繁榮的用戶社區(qū)對您很重要,請使用 CruiseControl。如果需要 Web 管理和擴(kuò)展的用戶支持選項(xiàng),請考慮 Luntbuild。圍繞這些服務(wù)器已經(jīng)形成了開發(fā)“生態(tài)”系統(tǒng),所以如果遺漏了某個(gè)特性,一般都會找到適合需求的擴(kuò)展。
在表 2 中,是我根據(jù)自己的使用經(jīng)驗(yàn)為所考察的每個(gè) CI 服務(wù)器總結(jié)的特性、可靠性、壽命、目標(biāo)環(huán)境和易用性這五個(gè)核心方面:
表 2. CI 服務(wù)器五個(gè)核心方面
| 特性 |
可靠性 |
壽命 |
目標(biāo)環(huán)境 |
易用性 |
Continuum |
支持 Ant、Maven1 和 Maven2,以及 shell。
使用 XML-RPC 和 SOAP 的遠(yuǎn)程管理能力;支持 Maven2;用戶群;期待未來有附加的報(bào)告和反饋機(jī)制——不需要修改代碼。 |
在 2005 年發(fā)布。期待通過它與 Apache 的關(guān)系,得到 Continuum 的更多消息。 |
通過 Apache Maven 的良好用戶社區(qū)支持產(chǎn)品在市場上仍很新。 |
Linux、Mac OS X、Solaris 和 Win32。 |
優(yōu)秀的易用性和安裝。 |
CruiseControl |
許多版本控制集成和擴(kuò)展性。通過 JMX 控制的遠(yuǎn)程訪問。多種反饋機(jī)制,包括 RSS、X10、Jabber 以及其他。 |
在 2001 年發(fā)布。在三個(gè)服務(wù)器中,CruiseControl 在開發(fā)中應(yīng)用得最多。 |
繁榮的用戶社區(qū);每個(gè)跡象都表示 CruiseControl 還會存在一段時(shí)間。 |
Windows 和 Unix;任何能運(yùn)行 Java JVM 的平臺。 |
易于安裝。有些人寧愿不修改 XML 配置文件。 |
Luntbuild |
項(xiàng)目依賴項(xiàng)、標(biāo)號、安全性組和并行開發(fā)。 |
在 2004 年發(fā)布。Luntbuild 提供擴(kuò)展的用戶支持選項(xiàng)。 |
用戶社區(qū)不如 CruiseControl 活躍。 |
能夠運(yùn)行 JVM 和 servlet 容器的系統(tǒng)。 |
易于安裝,但用戶界面/工作流需要大大改進(jìn)。基于 Web 的配置(不需要修改配置文件)。 |
我在本文中只評估了三個(gè)服務(wù)器;還有許多服務(wù)器可能更適合您的需求。但是既然您理解了如何挑選 CI 服務(wù)器,那么選擇工作就應(yīng)當(dāng)很容易了。請繼續(xù)關(guān)注下個(gè)月的文章,我將介紹在開發(fā)項(xiàng)目中經(jīng)常會遇到的構(gòu)建問題。
參考資料
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
討論
關(guān)于作者