在理解一個(gè)新的東西時(shí)张抄,我們首先要去了解下它的概念砂蔽。
概念
持續(xù)集成(英語(yǔ):Continuous integration,縮寫為 CI)署惯,一種軟件工程流程(即左驾,開發(fā)流程),將所有工程師對(duì)于軟件的工作復(fù)本极谊,每天集成數(shù)次到共用主線(mainline)上诡右。
這個(gè)名稱最早由葛來(lái)迪?布區(qū)(Grady Booch)在他的布區(qū)方法中提出,但是他并沒(méi)有提到要每天集成數(shù)次怀酷。之后成為極限編程(extreme programming稻爬,縮寫為XP)的一部分。在測(cè)試驅(qū)動(dòng)開發(fā)(TDD)的作法中蜕依,通常還會(huì)搭配自動(dòng)單元測(cè)試桅锄。
持續(xù)集成的提出琉雳,主要是為了解決軟件進(jìn)行系統(tǒng)集成時(shí)面臨的各項(xiàng)問(wèn)題(版本沖突等問(wèn)題),極限編程稱這些問(wèn)題為集成地獄(integration hell)友瘤。
在了解到持續(xù)集成的概念(一直不斷在項(xiàng)目主線分支上開發(fā))后翠肘,我們來(lái)看看我們?yōu)槭裁匆龀掷m(xù)集成呢,做持續(xù)集成有什么好處呢辫秧?
為什么要做持續(xù)集成
持續(xù)集成在目前大多數(shù)的公司里都會(huì)有這樣或者那樣的使用束倍。有的會(huì)選擇一些Open Source的工具,如CruiseControl盟戏,Hudson绪妹,LuntBuild
等等等等,有的會(huì)購(gòu)買有更好服務(wù)柿究,更強(qiáng)功能的商業(yè)產(chǎn)品邮旷,如TeamCity,QuickBuild
等等蝇摸,而有的會(huì)選擇自己實(shí)現(xiàn)婶肩,如Cron+Ant/Maven/Make
等等。那么使用下來(lái)效果如何呢貌夕?真得達(dá)到了預(yù)期的效果嗎律歼?我想來(lái)恐怕未必吧,否則也就不會(huì)有這么多的討論了啡专。
它的好處主要有兩個(gè)险毁。
- 快速發(fā)現(xiàn)錯(cuò)誤。每完成一點(diǎn)更新植旧,就集成到主干辱揭,可以快速發(fā)現(xiàn)錯(cuò)誤离唐,定位錯(cuò)誤也比較容易病附。
- 防止分支大幅偏離主干。如果不是經(jīng)常集成亥鬓,主干又在不斷更新完沪,會(huì)導(dǎo)致以后集成的難度變大,甚至難以集成嵌戈。
持續(xù)集成的目的覆积,就是讓產(chǎn)品可以快速迭代,同時(shí)還能保持高質(zhì)量熟呛。它的核心措施是宽档,代碼集成到主干之前,必須通過(guò)自動(dòng)化測(cè)試庵朝。只要有一個(gè)測(cè)試用例失敗吗冤,就不能集成又厉。
Martin Fowler(不要告訴我,你不知道大名鼎鼎的Martin叔椎瘟,提示覆致,IOC和DI那篇文章)說(shuō)過(guò),"持續(xù)集成并不能消除Bug肺蔚,而是讓它們非常容易發(fā)現(xiàn)和改正煌妈。"
與持續(xù)集成相關(guān)的,還有兩個(gè)概念宣羊,分別是持續(xù)交付和持續(xù)部署璧诵。
持續(xù)交付
持續(xù)交付(Continuous delivery)指的是,頻繁地將軟件的新版本仇冯,交付給質(zhì)量團(tuán)隊(duì)或者用戶腮猖,以供評(píng)審。如果評(píng)審?fù)ㄟ^(guò)赞枕,代碼就進(jìn)入生產(chǎn)階段澈缺。
持續(xù)交付可以看作持續(xù)集成的下一步。它強(qiáng)調(diào)的是炕婶,不管怎么更新姐赡,軟件是隨時(shí)隨地可以交付的。
持續(xù)部署
持續(xù)部署(continuous deployment)是持續(xù)交付的下一步柠掂,指的是代碼通過(guò)評(píng)審以后项滑,自動(dòng)部署到生產(chǎn)環(huán)境。
持續(xù)部署的目標(biāo)是涯贞,代碼在任何時(shí)刻都是可部署的枪狂,可以進(jìn)入生產(chǎn)階段。
在了解到做持續(xù)集成的好處之后宋渔,那么我們?cè)鯓觼?lái)做持續(xù)集成呢州疾?首先,我們得要有一臺(tái)(或好幾臺(tái))服務(wù)器用來(lái)做持續(xù)集成皇拣。
持續(xù)集成服務(wù)器的選擇
在進(jìn)行持續(xù)集成實(shí)踐前严蓖,應(yīng)當(dāng)正確的選擇并配置持續(xù)集成服務(wù)器。比較成熟的持續(xù)集成服務(wù)器包括:CruiseControl, Anthill, Bamboo, TeamCity, Continuum
等氧急。
CruiseControl作為開源產(chǎn)品颗胡,以其對(duì)于各種SCM(源碼管理,制造業(yè)上是供應(yīng)鏈關(guān)系管理)以及構(gòu)建工具的廣泛支持而被許多開發(fā)團(tuán)隊(duì)所接受吩坝。而開發(fā)自動(dòng)化專家 Duvall 采用一致的評(píng)估標(biāo)準(zhǔn)和很多說(shuō)明性示例毒姨,介紹了一些開源 CI 服務(wù)器,包括 Continuum钉寝、CruiseControl 和 Luntbuild
弧呐。并指出“要根據(jù) 自己的 具體技術(shù)和政策需求對(duì)工具進(jìn)行分析”鸳址。并用以下五個(gè)指標(biāo)來(lái)評(píng)估CI工具,它們分別是:(1) 特性泉懦;(2) 可靠性稿黍;(3) 壽命;(4) 目標(biāo)環(huán)境崩哩;(5) 易用性巡球。
而CruiseControl是我唯一真正用過(guò)的持續(xù)集成工具,它現(xiàn)在靈活而又強(qiáng)大功能也讓我瞠目邓嘹,而且配置與管理也較兩年前容易得多啦酣栈。
為什么說(shuō)它強(qiáng)大呢?因?yàn)槟阒灰氲玫降膯?wèn)題汹押,它也都會(huì)有所考慮矿筝。朋友的Blog上有些CruiseControl的最佳實(shí)踐足以證明這一點(diǎn),只要你肯去實(shí)踐
只有持續(xù)集成服務(wù)器是遠(yuǎn)遠(yuǎn)不夠的
正如Jez Humble所說(shuō)棚贾,CruiseControl和其它的CI工具本質(zhì)上只不過(guò)是一個(gè)定時(shí)器窖维,時(shí)間一到,做你讓它做的事情妙痹。所以铸史,必然要有其它工具與其結(jié)合,方顯持續(xù)集成的本色怯伊。這些工具又是什么呢琳轿?
想測(cè)試的話,你就要用一些測(cè)試工具耿芹,如JUnit崭篡,JWebUnit,Selenium
等等吧秕;
想檢查代碼標(biāo)準(zhǔn)的話琉闪,你就要用checkstyle
等代碼規(guī)范檢查工具;
想要了解測(cè)試覆蓋率的話寇甸,你可能就要用到JCoverage
啦塘偎。
當(dāng)然疗涉,想得到二進(jìn)制文件拿霉,就要用到Ant,Make
之類的工具啦咱扣。
總結(jié)
持續(xù)集成只是軟件開發(fā)的一種方式而已绽淘,雖然好處挺顯而易見的,但是能夠很好實(shí)踐的團(tuán)隊(duì)不知道又有多少闹伪,我們只有在開發(fā)的過(guò)程中不斷總結(jié)適合自己團(tuán)隊(duì)的開發(fā)方式沪铭,把項(xiàng)目完成即可壮池。