在理解一個新的東西時,我們首先要去了解下它的概念。
概念
持續集成(英語:Continuous integration,縮寫為 CI),一種軟件工程流程(即,開發流程),將所有工程師對于軟件的工作復本,每天集成數次到共用主線(mainline)上。
這個名稱最早由葛來迪?布區(Grady Booch)在他的布區方法中提出,但是他并沒有提到要每天集成數次。之后成為極限編程(extreme programming,縮寫為XP)的一部分。在測試驅動開發(TDD)的作法中,通常還會搭配自動單元測試。
持續集成的提出,主要是為了解決軟件進行系統集成時面臨的各項問題(版本沖突等問題),極限編程稱這些問題為集成地獄(integration hell)。
在了解到持續集成的概念(一直不斷在項目主線分支上開發)后,我們來看看我們為什么要做持續集成呢,做持續集成有什么好處呢?
為什么要做持續集成
持續集成在目前大多數的公司里都會有這樣或者那樣的使用。有的會選擇一些Open Source的工具,如CruiseControl,Hudson,LuntBuild
等等等等,有的會購買有更好服務,更強功能的商業產品,如TeamCity,QuickBuild
等等,而有的會選擇自己實現,如Cron+Ant/Maven/Make
等等。那么使用下來效果如何呢?真得達到了預期的效果嗎?我想來恐怕未必吧,否則也就不會有這么多的討論了。
它的好處主要有兩個。
- 快速發現錯誤。每完成一點更新,就集成到主干,可以快速發現錯誤,定位錯誤也比較容易。
- 防止分支大幅偏離主干。如果不是經常集成,主干又在不斷更新,會導致以后集成的難度變大,甚至難以集成。
持續集成的目的,就是讓產品可以快速迭代,同時還能保持高質量。它的核心措施是,代碼集成到主干之前,必須通過自動化測試。只要有一個測試用例失敗,就不能集成。
Martin Fowler(不要告訴我,你不知道大名鼎鼎的Martin叔,提示,IOC和DI那篇文章)說過,"持續集成并不能消除Bug,而是讓它們非常容易發現和改正。"
與持續集成相關的,還有兩個概念,分別是持續交付和持續部署。
持續交付
持續交付(Continuous delivery)指的是,頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審。如果評審通過,代碼就進入生產階段。
持續交付可以看作持續集成的下一步。它強調的是,不管怎么更新,軟件是隨時隨地可以交付的。
持續部署
持續部署(continuous deployment)是持續交付的下一步,指的是代碼通過評審以后,自動部署到生產環境。
持續部署的目標是,代碼在任何時刻都是可部署的,可以進入生產階段。
在了解到做持續集成的好處之后,那么我們怎樣來做持續集成呢?首先,我們得要有一臺(或好幾臺)服務器用來做持續集成。
持續集成服務器的選擇
在進行持續集成實踐前,應當正確的選擇并配置持續集成服務器。比較成熟的持續集成服務器包括:CruiseControl, Anthill, Bamboo, TeamCity, Continuum
等。
CruiseControl作為開源產品,以其對于各種SCM(源碼管理,制造業上是供應鏈關系管理)以及構建工具的廣泛支持而被許多開發團隊所接受。而開發自動化專家 Duvall 采用一致的評估標準和很多說明性示例,介紹了一些開源 CI 服務器,包括 Continuum、CruiseControl 和 Luntbuild
。并指出“要根據 自己的 具體技術和政策需求對工具進行分析”。并用以下五個指標來評估CI工具,它們分別是:(1) 特性;(2) 可靠性;(3) 壽命;(4) 目標環境;(5) 易用性。
而CruiseControl是我唯一真正用過的持續集成工具,它現在靈活而又強大功能也讓我瞠目,而且配置與管理也較兩年前容易得多啦。
為什么說它強大呢?因為你只要想得到的問題,它也都會有所考慮。朋友的Blog上有些CruiseControl的最佳實踐足以證明這一點,只要你肯去實踐
只有持續集成服務器是遠遠不夠的
正如Jez Humble所說,CruiseControl和其它的CI工具本質上只不過是一個定時器,時間一到,做你讓它做的事情。所以,必然要有其它工具與其結合,方顯持續集成的本色。這些工具又是什么呢?
想測試的話,你就要用一些測試工具,如JUnit,JWebUnit,Selenium
等等;
想檢查代碼標準的話,你就要用checkstyle
等代碼規范檢查工具;
想要了解測試覆蓋率的話,你可能就要用到JCoverage
啦。
當然,想得到二進制文件,就要用到Ant,Make
之類的工具啦。
總結
持續集成只是軟件開發的一種方式而已,雖然好處挺顯而易見的,但是能夠很好實踐的團隊不知道又有多少,我們只有在開發的過程中不斷總結適合自己團隊的開發方式,把項目完成即可。