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