段琳++孫恒一
摘 要 傳統(tǒng)的軟件開發(fā)模式經(jīng)常會(huì)遇到開發(fā)階段與驗(yàn)收階段隔離所帶來的諸多問題,基于Bamboo的持續(xù)集成系統(tǒng)通過自動(dòng)化手段為軟件項(xiàng)目開發(fā)團(tuán)隊(duì)轉(zhuǎn)變傳統(tǒng)開發(fā)模式、實(shí)踐持續(xù)集成思想提供了足夠的平臺(tái)支持,有利于項(xiàng)目快速反饋機(jī)制的建立、有利于盡早發(fā)現(xiàn)問題手段的完善,為軟件的高質(zhì)量交付創(chuàng)造條件。
【關(guān)鍵詞】軟件開發(fā)模式 持續(xù)集成 自動(dòng)化
1 引言
傳統(tǒng)的軟件項(xiàng)目在開發(fā)階段并不要求進(jìn)行軟件集成,這就造成了應(yīng)用程序在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi)始終處于無法運(yùn)行的狀態(tài),尤其在軟件開發(fā)團(tuán)隊(duì)規(guī)模比較大的情況下這一現(xiàn)象顯得尤為突出。原因很簡(jiǎn)單,項(xiàng)目干系人沒有興趣在開發(fā)完成之前運(yùn)行整個(gè)應(yīng)用。針對(duì)項(xiàng)目的軟件測(cè)試在沒有可運(yùn)行應(yīng)用程序的情況下,更多依賴于軟件開發(fā)人員自行編寫的單元測(cè)試,而這些測(cè)試用例對(duì)于運(yùn)行環(huán)境來講意義不大。這樣的做法對(duì)于那些項(xiàng)目分支的生命周期很長(zhǎng)或者把驗(yàn)收測(cè)試放到項(xiàng)目尾聲來做的團(tuán)隊(duì)將是災(zāi)難性的。為了彌補(bǔ)這一缺失,團(tuán)隊(duì)負(fù)責(zé)人不得不在開發(fā)結(jié)束后預(yù)留很長(zhǎng)的時(shí)間作為集成階段,最糟糕的是沒人知道到底要花多長(zhǎng)時(shí)間完成項(xiàng)目集成。極端的情況是有些項(xiàng)目到了集成階段才發(fā)現(xiàn)軟件并不完全滿足用戶需求。
解決以上困難的途徑之一就是采用持續(xù)集成。持續(xù)集成要求每當(dāng)有開發(fā)人員提交代碼,就要對(duì)整個(gè)應(yīng)用實(shí)施構(gòu)建、部署并執(zhí)行全面的自動(dòng)化測(cè)試進(jìn)行驗(yàn)證。這一過程中最重要的原則是如果構(gòu)建或者測(cè)試失敗,則開發(fā)團(tuán)隊(duì)?wèi)?yīng)立即停止研發(fā)的工作,在最短的時(shí)間內(nèi)予以修復(fù)。持續(xù)集成的目標(biāo)是保證正在開發(fā)的軟件一直處于正常工作狀態(tài)。
持續(xù)集成是一種軟件工程實(shí)踐,即項(xiàng)目研發(fā)團(tuán)隊(duì)對(duì)源代碼進(jìn)行高頻度集成。每次集成都通過自動(dòng)化構(gòu)建(包括編譯,發(fā)布,自動(dòng)化測(cè)試)來驗(yàn)證集成效果從而盡快發(fā)現(xiàn)并改正軟件錯(cuò)誤,進(jìn)而提高軟件質(zhì)量。企業(yè)可以通過建立以持續(xù)集成為核心軟件開發(fā)控制體系來規(guī)范其軟件版本變更行為,實(shí)現(xiàn)對(duì)軟件版本變更的深入管控,確保軟件版本發(fā)布的正確性、合規(guī)性及穩(wěn)定性。
為了能夠深入理解持續(xù)集成理論,在實(shí)踐中積累應(yīng)用經(jīng)驗(yàn),特選取Atlassion公司的持續(xù)集成管理系統(tǒng)Bamboo進(jìn)行持續(xù)集成系統(tǒng)研究。
2 持續(xù)集成系統(tǒng)研究
2.1 Bamboo簡(jiǎn)介
Atlassian Bamboo是一款商業(yè)的持續(xù)集成構(gòu)建服務(wù)器軟件。它是一套持續(xù)集成服務(wù)系統(tǒng),它會(huì)在代碼庫有變動(dòng)后有策略的觸發(fā)構(gòu)建、部署及測(cè)試以確保新的變化很好地整合到已有的代碼庫中或者通過反饋機(jī)制快速將失敗發(fā)送給開發(fā)團(tuán)隊(duì);發(fā)布管理功能通過腳本執(zhí)行來規(guī)范發(fā)布流程。Bamboo實(shí)現(xiàn)持續(xù)集成的原理圖如圖1所示。
2.2 準(zhǔn)備工作
在開始搭建持續(xù)集成之前,需要做好版本控制、自動(dòng)化構(gòu)建及團(tuán)隊(duì)意識(shí)建立三件事情。
2.2.1 版本控制
與項(xiàng)目相關(guān)的所有內(nèi)容都必須提交到一個(gè)版本控制庫中,包括產(chǎn)品代碼、測(cè)試代碼、數(shù)據(jù)庫腳本、構(gòu)建與部署腳本,以及所有用于創(chuàng)建、安裝、運(yùn)行和測(cè)試的相關(guān)文件,本次研究采用的版本控制工具為Tortoise SVN。
2.2.2 命令行腳本
持續(xù)集成系統(tǒng)是通過命令行來執(zhí)行自動(dòng)構(gòu)建、部署、測(cè)試和發(fā)布的。這么做是為了確保持續(xù)集成是以自動(dòng)化方式完成整個(gè)過程的。應(yīng)盡量保持腳本整潔、易于理解、易于維護(hù),這樣有利于使用持續(xù)集成系統(tǒng)的項(xiàng)目人員更好的協(xié)作。
2.2.3 團(tuán)隊(duì)意識(shí)建立
嚴(yán)格的講,持續(xù)集成并不是一種工具,而是一種軟件開發(fā)實(shí)踐。它需要開發(fā)團(tuán)隊(duì)能夠給予支持并嚴(yán)格遵守持續(xù)集成原則,每個(gè)人以增量的方式頻繁提交代碼并認(rèn)同“修復(fù)破壞應(yīng)用程序的任意修改是最高優(yōu)先級(jí)的任務(wù)”,如果團(tuán)隊(duì)無法達(dá)成類似共識(shí),那么便無法通過持續(xù)集成達(dá)到提升軟件質(zhì)量的目標(biāo)。
2.3 流程自動(dòng)化
源代碼提交流程是Bamboo持續(xù)集成系統(tǒng)應(yīng)用中最重要的組成部分。如圖2所示的源代碼變更流程中,交付/開發(fā)團(tuán)隊(duì)提交代碼至版本控制庫,觸發(fā)構(gòu)建和單元測(cè)試,構(gòu)建成功則觸發(fā)自動(dòng)化驗(yàn)收測(cè)試,成功則繼續(xù)用戶驗(yàn)收測(cè)試以及發(fā)布,在每一步出現(xiàn)問題則及時(shí)反饋給交付/開發(fā)團(tuán)隊(duì)。
這一過程保證了源代碼在提交、構(gòu)建、單元測(cè)試、自動(dòng)化驗(yàn)收測(cè)試、用戶驗(yàn)收及發(fā)布的各個(gè)階段始終處于被控狀態(tài),整個(gè)過程以流水線的形式開展并對(duì)過程結(jié)果予以記錄和反饋,從而實(shí)現(xiàn)流程自動(dòng)化。流水線的輸入是版本控制中的某個(gè)具體版本,輸出的是經(jīng)過測(cè)試的發(fā)布版本。
有效地阻止那些沒有經(jīng)過充分測(cè)試或不滿足功能需求的版本進(jìn)入生產(chǎn)環(huán)境能避免回歸缺陷,尤其是對(duì)那些需要緊急修復(fù)并部署到生產(chǎn)環(huán)境的情況來說更為重要。在構(gòu)建、部署、測(cè)試以及發(fā)布被自動(dòng)化實(shí)現(xiàn)以后,項(xiàng)目團(tuán)隊(duì)能夠更加靈活的處理緊急情況,產(chǎn)品發(fā)布根本不會(huì)存在任何風(fēng)險(xiǎn),因?yàn)榭傆幸粋€(gè)最近的正確版本作為下一次代碼提交的基礎(chǔ),一旦有問題則立刻回滾,然后線下修復(fù)就可以了。另外自動(dòng)化還能避免手工易錯(cuò)步驟帶來的項(xiàng)目風(fēng)險(xiǎn)。
2.4 多種開發(fā)語言支持
Bamboo針對(duì)不同編程語言的特點(diǎn),提供多種構(gòu)建、部署、自動(dòng)化測(cè)試的工具,如圖3所示,構(gòu)建工具包括Ant、Bower、AWS CodeDeploy、Docker、Grails、Grunt、Maven、MSBuild、NAnt、Node.js、Nodeunit、Devenv、Script等;如圖4所示,測(cè)試工具包括JUnit、MBUnit、Mocha Test、MSTest、NUnit、PHPUnit、TestNG等;如圖5所示,部署工具包括Artifact Download、Tomcat、Docker、Heroku、SSH、SCP等。這些工具為實(shí)現(xiàn)持續(xù)集成自動(dòng)化提供有力支持。
本次研究以目前主流的三種軟件開發(fā)語言Java、MS.Net、PHP為例驗(yàn)證Bamboo持續(xù)集成系統(tǒng)對(duì)持續(xù)集成的實(shí)現(xiàn)。
JAVA項(xiàng)目采用:
Ant+Selenium+Nunit+Tomcat。
MS.Net項(xiàng)目采用:
MSBuild+WatiN+MSTest+Artifact Download。
PHP項(xiàng)目采用:
Selenium+PHPUnit+SSH。
實(shí)踐證明,Bamboo提供的持續(xù)集成工具能夠很好地發(fā)揮作用。
2.5 部署一體化
軟件部署流程的起點(diǎn)是開發(fā)人員向版本控制庫提交代碼,持續(xù)集成管理系統(tǒng)對(duì)這次提交做出響應(yīng)即觸發(fā)部署流程。第一個(gè)階段稱為提交階段,通過編譯代碼、運(yùn)行單元測(cè)試、執(zhí)行代碼分析、創(chuàng)建軟件二進(jìn)制包,在所有單元測(cè)試驗(yàn)證通過后將可執(zhí)行代碼打包成可執(zhí)行文件,并放到一個(gè)制品庫(Artifacts Repository)中。Bamboo提供了保存這種過程產(chǎn)物的功能,并能夠?qū)⑵涮峁┙o流水線的后續(xù)階段。
第二階段進(jìn)入驗(yàn)收階段,主要特點(diǎn)為自動(dòng)化驗(yàn)收測(cè)試、冒煙測(cè)試的執(zhí)行。持續(xù)集成服務(wù)系統(tǒng)Bamboo支持多個(gè)代理機(jī)(agent)同時(shí)運(yùn)行自動(dòng)化任務(wù)。這種并行執(zhí)行會(huì)明顯提高執(zhí)行效率,更快得到反饋,更快針對(duì)反饋?zhàn)龀鎏幚?。這個(gè)階段是流水線中第一階段成功完成后自動(dòng)觸發(fā)的,該階段完成后同樣會(huì)將驗(yàn)證后的成果放入到制品庫中。
第三階段進(jìn)入部署階段。前兩個(gè)階段的順利完成為第三階段創(chuàng)造了條件,根據(jù)不同項(xiàng)目特點(diǎn),將產(chǎn)品實(shí)際部署到任意環(huán)境(測(cè)試環(huán)境、發(fā)布環(huán)境、生產(chǎn)環(huán)境等)。Bamboo在完成整個(gè)過程中,需要版本控制、制品倉庫管理、配置管理的全程配合,如圖6的部署基本流程演示了整個(gè)部署一體化實(shí)現(xiàn)流程。
3 結(jié)論
基于Bamboo的持續(xù)集成系統(tǒng)通過自動(dòng)化手段為軟件項(xiàng)目開發(fā)團(tuán)隊(duì)轉(zhuǎn)變傳統(tǒng)開發(fā)模式、實(shí)踐持續(xù)集成思想提供了足夠的平臺(tái)支持,有利于項(xiàng)目快速反饋機(jī)制的建立、有利于盡早發(fā)現(xiàn)問題手段的完善,為軟件的高質(zhì)量交付創(chuàng)造條件。
參考文獻(xiàn)
[1]Jez Humble,David Farley.持續(xù)交付-發(fā)布可靠軟件的系統(tǒng)方法[M].北京:人民郵電出版社,2011:87-90.
[2]董越.軟件集成策略:如何有效地提升質(zhì)量[M].北京:電子工業(yè)出版社,2013,277-288.
[3]杜瓦爾,邁耶斯,格洛弗.持續(xù)集成軟件質(zhì)量改進(jìn)和風(fēng)險(xiǎn)降低之道[M].北京:機(jī)械工業(yè)出版社,2008,59-66.
作者簡(jiǎn)介
段琳(1990-),女,白族,云南省大理市人。碩士研究生學(xué)位。研究方向?yàn)閿?shù)字圖像處理。
孫恒一(1989-),男,云南省玉溪市人。碩士研究生學(xué)位。研究方向?yàn)殡娏π畔⒒?/p>
作者單位
云南電網(wǎng)有限責(zé)任公司信息中心 云南省昆明市 650217