|
文 / 黃亮 王立杰
持續(xù)集成作為一種敏捷軟件開發(fā)實(shí)踐,已經(jīng)被越來越多的開發(fā)者所接受。持續(xù)集成倡導(dǎo)開發(fā)團(tuán)隊(duì)頻繁地進(jìn)行系統(tǒng)集成——通常一天一次到數(shù)次,每次集成都能被自動(dòng)編譯和測(cè)試驗(yàn)證,從而能在最短的時(shí)間內(nèi)發(fā)現(xiàn)問題,縮短開發(fā)周期,提高軟件質(zhì)量。
筆者面對(duì)的是具有十多年開發(fā)維護(hù)歷史的5個(gè)相互依賴產(chǎn)品,每個(gè)產(chǎn)品均超過百萬行代碼的復(fù)雜系統(tǒng)。集成本身涉及很多煩瑣的手工操作,很難實(shí)現(xiàn)過程自動(dòng)化。在實(shí)施過程中,受困于軟件系統(tǒng)的歷史遺留問題,而通常市面上的持續(xù)集成工具又不能滿足系統(tǒng)的需求,讓我們不得不著手開發(fā)自己的集成系統(tǒng)。經(jīng)過近一年的持續(xù)努力,終于完成了系統(tǒng)集成的自動(dòng)化,將集成頻度從數(shù)周甚至數(shù)月集成提高到日集成,大大提高了生產(chǎn)效率。
集成的困境
OSS系統(tǒng)是我們一個(gè)具有十多年生命歷程的復(fù)雜系統(tǒng),多年來一直處于不斷的開發(fā)和維護(hù)中,子產(chǎn)品的數(shù)目和系統(tǒng)的代碼量也隨著時(shí)間日益增長(zhǎng),集成的周期、發(fā)布周期也隨之逐漸增長(zhǎng)。OSS系統(tǒng)包含有5個(gè)需要集成的產(chǎn)品:ComLIB 、DB-Com、Data Broker、DataGen、DataAgent,每個(gè)產(chǎn)品均有上百萬行源代碼和龐大的測(cè)試用例,產(chǎn)品可以單獨(dú)構(gòu)建,但運(yùn)行時(shí)有相互依賴關(guān)系。OSS產(chǎn)品棧如圖1所示,上層產(chǎn)品對(duì)下層產(chǎn)品具有依賴,部分產(chǎn)品棧亦可以組成一個(gè)應(yīng)用系統(tǒng),如DataGen+CommonLib可以組成一個(gè)應(yīng)用系統(tǒng),DataBroker+ DBCom+CommonLib也可以組成一個(gè)應(yīng)用系統(tǒng)。
圖1 OSS產(chǎn)品棧
同時(shí),OSS的每個(gè)產(chǎn)品又包含不同的發(fā)布單元,用于運(yùn)行于不同功能服務(wù)器上:Control Server、SITE、PAP、Workstation、Application Server和不同的操作系統(tǒng)環(huán)境中,產(chǎn)品在不同的服務(wù)器上安裝單元如表1所示。
表1 OSS產(chǎn)品在不同服務(wù)器上的安裝單元
傳統(tǒng)手工集成需要完成如下事情:
1.從代碼庫取出產(chǎn)品棧中每個(gè)產(chǎn)品需要集成的代碼;
2.在Build server上對(duì)每個(gè)產(chǎn)品進(jìn)行編譯,單元測(cè)試(每個(gè)產(chǎn)品編譯需要2~3小時(shí),單元測(cè)試需要4~5小時(shí));
3.在Package server上對(duì)編譯好的產(chǎn)品進(jìn)行打包(每個(gè)產(chǎn)品打包需要約1小時(shí));
4.在Lab中卸載舊的產(chǎn)品;
5.在不同的服務(wù)器上(Control Server、Site、Workstation、APP Server)安裝產(chǎn)品中相應(yīng)的產(chǎn)品的相應(yīng)部件,需要按照產(chǎn)品依賴關(guān)系進(jìn)行安裝 (2~3小時(shí));
6.檢查每個(gè)產(chǎn)品的每個(gè)部件在Lab環(huán)境中的安裝情況,確認(rèn)安裝成功;
7.運(yùn)行功能測(cè)試腳本做回歸測(cè)試(10~12小時(shí));
8.檢查測(cè)試結(jié)果(3小時(shí));
9.對(duì)系統(tǒng)進(jìn)行卸載測(cè)試,檢查卸載結(jié)果 (1~2小時(shí))。
如果在此過程中,一旦遇到問題,則需要花費(fèi)更長(zhǎng)的時(shí)間。如此昂貴的集成代價(jià)使得OSS系統(tǒng)通常數(shù)周甚至更長(zhǎng)的時(shí)間才艱難地進(jìn)行一次集成。而自動(dòng)化還要解決多產(chǎn)品、多平臺(tái)、多種安裝和運(yùn)行環(huán)境、多個(gè)操作需要人工干預(yù)的難題。
集成目標(biāo)
持續(xù)集成需與自動(dòng)化結(jié)合才能發(fā)揮其威力,為給OSS系統(tǒng)瘦身,我們?cè)O(shè)定了如下自動(dòng)化持續(xù)集成目標(biāo):
1.在集成服務(wù)器上配置cron job,每天晚上進(jìn)行集成,第二天早上發(fā)布結(jié)果;
2.在集成服務(wù)器上配置集成方案,指定所需要的產(chǎn)品棧或子棧,指定所需產(chǎn)品的版本或分支,指定需要進(jìn)行卸載、安裝測(cè)試,功能測(cè)試的Lab以及Lab里的服務(wù)器;
3.只需修改少量參數(shù)配置,即可以實(shí)現(xiàn)不同的持續(xù)集成方案。
自動(dòng)化實(shí)現(xiàn)
通過一系列自動(dòng)化工具的開發(fā)和整合,我們逐步完成了多產(chǎn)品編譯、測(cè)試、安裝、卸載、功能測(cè)試等一系列步驟的自動(dòng)化操作,為了縮短集成時(shí)間,我們廣泛地采用并行工作,在編譯、測(cè)試、安裝、卸載等多個(gè)環(huán)節(jié)均采用并行,最后實(shí)現(xiàn)了成熟的集成系統(tǒng)。
1.自動(dòng)化構(gòu)建+并行編譯
首先完成5個(gè)產(chǎn)品統(tǒng)一的Daily build。對(duì)5個(gè)產(chǎn)品采用統(tǒng)一的編譯、單元測(cè)試、打包接口,利用不同的編譯服務(wù)器對(duì)5個(gè)產(chǎn)品同時(shí)進(jìn)行編譯,對(duì)同一產(chǎn)品的不同編譯單元,也采用負(fù)荷分擔(dān)的方式分發(fā)到多臺(tái)服務(wù)器上進(jìn)行并行編譯、并行單元測(cè)試、并行打包,并對(duì)編譯、單元測(cè)試結(jié)果進(jìn)行統(tǒng)一管理。
2.自動(dòng)化監(jiān)視
通過監(jiān)視編譯、打包、測(cè)試過程的輸出和進(jìn)程狀態(tài)等對(duì)編譯、打包、測(cè)試過程進(jìn)行監(jiān)控,發(fā)現(xiàn)諸如NFS錯(cuò)誤或者編譯系統(tǒng)故障之類非代碼錯(cuò)誤及時(shí)取消并重啟操作,確保Daily build不會(huì)因?yàn)榫幾g服務(wù)器等異常發(fā)生中斷。
3.自動(dòng)部署安裝
利用腳本工具打包好的系統(tǒng)進(jìn)行自動(dòng)并行安裝,免除手動(dòng)安裝的煩瑣操作。當(dāng)所有待安裝的產(chǎn)品都編譯、打包完畢后,利用腳本工具將集成后的系統(tǒng)并行安裝到多個(gè)Lab(每個(gè)Lab由一套不同機(jī)器的設(shè)備組成,包含Control Server、Site、WorkStation、Application Server),對(duì)于同一Lab中的不同機(jī)器亦進(jìn)行并行部署,并對(duì)安裝日志進(jìn)行統(tǒng)一管理。
4.自動(dòng)功能測(cè)試
卸載、安裝操作成功后,即對(duì)選用的測(cè)試用例進(jìn)行測(cè)試,測(cè)試用例經(jīng)過精心挑選,根據(jù)功能分為不同的核心單元,周一到周五只運(yùn)行核心的測(cè)試用例,周末時(shí)間再運(yùn)行所有的用例。用例無法在一個(gè)Lab一個(gè)晚上運(yùn)行時(shí),則將用例分布配置在多個(gè)Lab里面,并行運(yùn)行。
5.結(jié)果匯報(bào)及存檔
定點(diǎn)(如早上9:00)對(duì)前一天晚上進(jìn)行的所有操作進(jìn)行匯報(bào),包括不同產(chǎn)品的編譯、打包、測(cè)試,不同Lab上不同服務(wù)器的卸載、安裝結(jié)果,不同Lab上功能測(cè)試用例通過情況等信息自動(dòng)以郵件的方式通知開發(fā)和測(cè)試人員,并將結(jié)果存檔方便隨時(shí)查看,對(duì)其中的關(guān)鍵數(shù)據(jù)如測(cè)試用例通過率等寫于數(shù)據(jù)庫,便于跟蹤分析。
自動(dòng)測(cè)試統(tǒng)計(jì)結(jié)果如圖2所示。
圖2 自動(dòng)測(cè)試統(tǒng)計(jì)結(jié)果
6.流程整合和協(xié)作
流程1~2、5發(fā)生在編譯服務(wù)器群上,流程3~4發(fā)生在運(yùn)行環(huán)境Lab群上,需要將1~5流程集成自動(dòng)化,并且流程間需要相互協(xié)作。我們采取集中控制的方式,將1~5所需要腳本工具和配置文件集中放置,這樣便于管理和維護(hù),其他服務(wù)器通過NFS共享訪問腳本工具和配置文件,只需要在其他服務(wù)器上配置相關(guān)的cron job,便能相互協(xié)作起來。協(xié)作流程如圖3所示。
圖3 協(xié)作流程示意圖
回顧與反思
經(jīng)過近一年的完善,我們的OSS系統(tǒng)終于從之前的數(shù)周才能一次手工集成,達(dá)到了每天集成,許多人工操作和檢查統(tǒng)計(jì)工作均自動(dòng)化,不僅僅大大解放了Build Manager的工作,而且避免了人工差錯(cuò),提高了效率。對(duì)于像OSS這種歷史悠久的復(fù)雜系統(tǒng),持續(xù)集成是一個(gè)長(zhǎng)期優(yōu)化、完善的實(shí)踐過程。畢竟持續(xù)集成不是一朝一夕就可以實(shí)現(xiàn)的,而應(yīng)該成為一種持之以恒的習(xí)慣。
總之,一個(gè)完善的運(yùn)行良好的持續(xù)集成,必須考慮如下問題:
1.持續(xù)集成的頻度和粒度
每個(gè)開發(fā)人員提交代碼更改之前,在自己的branch上需要確保編譯、單元測(cè)試通過,避免不必要的集成失敗,只有開發(fā)人員確認(rèn)的可靠代碼,才進(jìn)行集成。對(duì)于小型系統(tǒng)可以做到每次提交都集成,對(duì)于像我們OSS這樣的大型系統(tǒng),可以做到每天一集成。
2.統(tǒng)一構(gòu)建、并行構(gòu)建
對(duì)于多產(chǎn)品的系統(tǒng),采用統(tǒng)一的構(gòu)建、打包、安裝方式有助于靈活實(shí)現(xiàn)自動(dòng)化。并行構(gòu)建、并行測(cè)試、并行安裝等可以充分利用服務(wù)器物理資源縮短集成時(shí)間。
3.協(xié)作整合
在并行的同時(shí),也需要采用合適的同步協(xié)作的方法,以保證系統(tǒng)正確運(yùn)行。如編譯、打包、單元測(cè)試的進(jìn)程在編譯服務(wù)器群上,安裝、卸載、功能測(cè)試等進(jìn)程在運(yùn)行系統(tǒng)的Lab服務(wù)器群上,而郵件通知?jiǎng)t又需要將這些進(jìn)程運(yùn)行的結(jié)果整合起來。簡(jiǎn)單的文件或目錄共享遠(yuǎn)程調(diào)用往往就能完成這些控制權(quán)的轉(zhuǎn)移,實(shí)現(xiàn)協(xié)作和工具整合。
4.高性能build server
高性能的編譯服務(wù)器或服務(wù)器群也是持續(xù)集成中強(qiáng)有力的支撐。支持并行編譯的話將更好。
5.完善的結(jié)果報(bào)告
完善的結(jié)果報(bào)告能縮短開發(fā)或測(cè)試人員發(fā)現(xiàn)、解決問題的時(shí)間。完整有效的報(bào)告應(yīng)該包含軟件版本信息,本次集成中所做的修改,單元測(cè)試和回歸測(cè)試結(jié)果,卸載/安裝結(jié)果。
6.持續(xù)集成工具
在持續(xù)集成實(shí)踐過程中,一個(gè)完善的SCM系統(tǒng)(如ClearCase、SVN、CVS),分支并行開發(fā)的策略幾乎是必備的支撐。同時(shí),如果在Unix或Linux環(huán)境下,亦無須迷信于專門的持續(xù)集成工具,有些時(shí)候,借助各種腳本工具與cron job完全可以滿足這些需要。
7.自動(dòng)化
持續(xù)集成必須跟自動(dòng)化結(jié)合,才能真正的發(fā)揮其威力。
it知識(shí)庫:大型復(fù)雜軟件產(chǎn)品持續(xù)集成的實(shí)踐與反思,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。