徐曉平
摘要:由于具有集成作用和暴露問題及時的優(yōu)點,Jenkins每日構(gòu)建越來越廣泛的被應用于軟件項目開發(fā)中。然而Jenkins每日構(gòu)建系統(tǒng)易存在不全面、不流暢和不整潔的問題,具體地說,上述三個問題在構(gòu)建內(nèi)容、構(gòu)建過程和構(gòu)建報告中均可能出現(xiàn)。該文提出每日構(gòu)建應追求全面、流暢和整潔的思想,并提出一種在內(nèi)容、過程和報告三個方面均全面、流暢和整潔的構(gòu)建系統(tǒng)設(shè)計和實現(xiàn)。
關(guān)鍵詞:全面;流暢;整潔;每日構(gòu)建;Jenkins
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)25-0222-02
1 概述
有人把每日構(gòu)建比作是項目的心跳,更確切的說法是項目中同步跳動的脈搏[1]。微軟推出每日構(gòu)建并從中受益以后,越來越多的軟件項目開始著手每日構(gòu)建過程的研究和實施。然而當很多開發(fā)者進行實施每日構(gòu)建的過程時,卻碰到了各種各樣的問題,在實際實施每日構(gòu)建過程并非理想中的順利[2]。
提到每日構(gòu)建,就不可避免的會將它與持續(xù)集成聯(lián)系起來。而且隨著軟件開發(fā)中的應用需求變化越來越頻繁,變化速度越來越快,敏捷開發(fā)方法應運而生,持續(xù)集成作為每日構(gòu)建的衍生正是其不可缺少的組成部分[3]。然而,相對于持續(xù)集成而言,每日構(gòu)建擁有的時間窗口更長,可以加入更多活動,會比持續(xù)集成更全面。另外,每日構(gòu)建一般都是在下班后的晚間進行,能更充分的利用資源,提高測試的效率,加快軟件的開發(fā)速度[4]。因此,持續(xù)集成并不能在所有軟件開發(fā)項目中代替每日構(gòu)建,相反的是,每日構(gòu)建是一種比持續(xù)集成更適用的實踐。
2 每日構(gòu)建追求目標
全面、流暢和整潔是每日構(gòu)建自身屬性所決定應該追求的目標。每日構(gòu)建的時間窗口一般都會比較長,典型的構(gòu)建是晚上10點一直到第二天早上的9點[5],也可以根據(jù)需要延長時間,可以進行大型構(gòu)建,因此在構(gòu)建上有做到全面的條件。每日構(gòu)建是為敏捷開發(fā)服務的,保證團隊的敏捷性就是保證開發(fā)的流暢性,而保證每日構(gòu)建的流暢性是保證敏捷開發(fā)流暢性的關(guān)鍵[6]。流暢性不僅需要體現(xiàn)在代碼集成編譯和測試等構(gòu)建功能上,更要在內(nèi)容、過程和報告三方面均有體現(xiàn)。整潔也應該是每日構(gòu)建所追求的,整潔的每日構(gòu)建系統(tǒng)可以加快軟件開發(fā)人員定位編譯、測試或者其他問題的速度。
3 系統(tǒng)方案設(shè)計與實現(xiàn)
3.1 概述
本系統(tǒng)的目的是以開源的Jenkins為平臺,以一臺Windows7操作系統(tǒng)的PC機為承載,對3GPP LTE終端中某協(xié)議的軟件開發(fā)進行每日構(gòu)建,由此可見,此系統(tǒng)還具有經(jīng)濟性的特點。此終端協(xié)議是多模塊性質(zhì)的協(xié)議,對應的代碼也是分模塊的,不同的開發(fā)人員負責不同的模塊。
3.2 方案設(shè)計
3.2.1 系統(tǒng)架構(gòu)
此系統(tǒng)有三個組成部分:Windows7操作系統(tǒng)定時任務,Jenkins構(gòu)建執(zhí)行和郵件發(fā)送。Windows7定時任務的作用是每天啟動Jenkins服務器和執(zhí)行每日構(gòu)建中某些內(nèi)容需要的軟件。此PC機在使用中不僅用做在晚上執(zhí)行每日構(gòu)建,在白天也做其他作用,Jenkins服務可能會在白天被誤關(guān),因此利用定時任務來保證Jenkins的打開。打開執(zhí)行每日構(gòu)建中某些內(nèi)容需要的軟件也可以在Jenkins里實現(xiàn),但是Jenkins的功能就不專一。在構(gòu)建過程中使用定時任務中途干預可以解決Job超時導致構(gòu)建報告不準確的問題。Jenkins部分即時對各個模塊的代碼進行每日構(gòu)建。郵件發(fā)送部分使用郵件自動發(fā)送軟件將每日構(gòu)建的結(jié)果發(fā)送出去,在Jenkins中的所有任務均結(jié)束時將報告通過SVN提交,郵件自動發(fā)送軟件檢測到提交后發(fā)送報告。本流程包括構(gòu)建前的準備工作、正式構(gòu)建和構(gòu)建完發(fā)送結(jié)果,具有全面、流暢和整潔的特點。
3.2.2 構(gòu)建內(nèi)容組成
此系統(tǒng)對3GPP LTE終端中某部分協(xié)議的代碼進行構(gòu)建的內(nèi)容有編譯、Pclint檢查、Logiscope檢查、單元/覆蓋測試、集成測試和報告生成。
由于此部分協(xié)議代碼需要依賴其他代碼才能編譯成可執(zhí)行版本,同時為了避免其他代碼對此部分協(xié)議代碼的影響,在編譯之前僅對這部分代碼進行SCM更新。Pclint是C/C++軟件代碼靜態(tài)檢查分析工具,可以檢查出編譯器無法發(fā)現(xiàn)的潛在錯誤[7],對于穩(wěn)定性要求高的代碼更應該使用Pclint。Logiscope可用于檢查代碼的可維護性和可讀性[8],這對于處于維護工作占較大比例階段的協(xié)議代碼有重要作用。同時,由于敏捷強調(diào)開發(fā)人員應在軟件生產(chǎn)的所有過程中發(fā)揮作用,因此各個開發(fā)人員需要對各個模塊的代碼均有所了解甚至掌握。單元測試具有規(guī)模小、復雜性低和可以平行展開、多人同時測試等優(yōu)點,因此需要將單元測試加入到每日構(gòu)建中去。覆蓋測試也稱代碼覆蓋率檢查,是衡量測試質(zhì)量的一個重要指標,雖然不應該過分追求覆蓋率,但是合理程度的覆蓋率是對代碼質(zhì)量的保證。集成測試是在單元測試的基礎(chǔ)上將所有模塊組裝成一個子系統(tǒng)或者系統(tǒng)進行測試。
對于上述的構(gòu)建內(nèi)容,組成全面,涉及軟件開發(fā)的全過稱,可以有效保證軟件質(zhì)量。同時各個組成功能獨立互不干擾,有利于提高構(gòu)建執(zhí)行流暢性。在整潔性方面,各個組成分工明確,不重疊,不交叉。
3.2.3 構(gòu)建流程
構(gòu)建流程,從全面性的角度看,要保證構(gòu)建內(nèi)容全部被執(zhí)行到;從流暢性的角度看,要確保即使前一個元素執(zhí)行失敗或者執(zhí)行超時甚至被系統(tǒng)掛起也不影響下一個元素的執(zhí)行,這里采用多Job方式,同時在不影響整體構(gòu)建的前提下將容易執(zhí)行失敗或者執(zhí)行超時甚至是被系統(tǒng)掛起的Job或者Task放在后面執(zhí)行;從整潔性的角度看,過程要簡單,要方便故障定位,功能類似的內(nèi)容作為多個Task盡量集中在一個Job里。構(gòu)建內(nèi)容被分成了3個Job,Job1包含編譯、Pclint檢查、Logiscope檢查和單元/覆蓋測試等4個Task,Job2包含3個模塊的集成測試等3個Task,Job3包含報告生成。在Job1和Job2中,后一個Task開始之前均定時強制關(guān)閉前一個Task的線程,目的是保障后一個Task不因前一個Task線程被掛住。endprint
3.2.4 構(gòu)建報告
構(gòu)建報告要全面反映構(gòu)建結(jié)果,不僅可以反饋構(gòu)建成功時的結(jié)果也要能反饋構(gòu)建失敗時的信息。在流暢性方面,生成報告時不能因為某個Job或者Task執(zhí)行時出錯或者超時導致信息缺失或者沒有輸出就停止而不生成這個或者后面的Job或者Task的報告。報告采用表格形式,直觀、整潔。
3.3 系統(tǒng)實現(xiàn)
3.3.1 定時任務
在定時任務中,采用windows command批處理腳本實現(xiàn)啟動Jenkins服務,啟動過程如下:step1,進入到Jenkins的war包所在的目錄;step2,java —jar jenkins.war —httpPort=8080。如正常啟動,在命令窗口中會顯示“Jenkins is fully up and running”。
在集成測試中,需要對模塊x、模塊y和模塊z三個模塊進行集成測試,而且每個模塊的集成測試都可能會發(fā)生超時。假設(shè)集成測試的先后順序是x、y和z,在某一次構(gòu)建中模塊x的集成測試超時了,導致在當天的構(gòu)建報告發(fā)送出去之后才開始執(zhí)行y和z的集成測試,那么y和z的集成測試報告是上一次構(gòu)建的結(jié)果。在發(fā)生Job超時的情況下需要停止以便構(gòu)建后面的Job,本文使用開源的python-jenkins接口來定時停止Job。
3.3.2 構(gòu)建執(zhí)行
整個構(gòu)建過程被分為3個Job,這3個Job均采用windows command腳本實現(xiàn)調(diào)用。Job1包含4個批處理bat,分別調(diào)用編譯、pclint檢查、單元測試/覆蓋率測試和Logiscope檢查。由于Logiscope檢查部分易于崩潰,所以將此Task排到所屬Job的末尾。Job2實現(xiàn)3個模塊的集成測試,在每個模塊的集成測試中,首先要編譯用例,然后執(zhí)行,每個模塊用例的編譯和執(zhí)行各自用一個bat來調(diào)用。Job3先使用bat腳本從構(gòu)建日志中提取數(shù)據(jù),再利用vbs腳本將構(gòu)建結(jié)果填充到html格式的報告模板中。在實現(xiàn)中,使用容錯處理增強報告生成的流暢性,例如,在讀取某個文件內(nèi)容之前不僅先判斷該文件是否存在還判斷文件中是否有內(nèi)容。
3.3.3 郵件發(fā)送
報告生成以后,通過svn commit+blat方式發(fā)送報告,批處理命令如下:blat “每日構(gòu)建.html” —to “郵箱地址1”-subject “每日構(gòu)建_xx年xx月xx日” —server “smtp.郵箱服務器地址” —u “郵箱地址2”-pw “密碼”,其中,”郵箱地址1”為收件人郵箱,”郵件地址2”為發(fā)件人郵箱,”密碼”為發(fā)件人郵箱密碼。
4 結(jié)束語
每日構(gòu)建具有很強的實用性,特別在機器資源緊張時更能體現(xiàn)每日構(gòu)建的價值。同時,在內(nèi)容、執(zhí)行和報告上均做到全面、流暢和整潔的每日構(gòu)建會在保證軟件質(zhì)量方面起到重要作用。本文提出的方案與設(shè)計在時間上具有較強的普遍適用性,其思想也具有較強的指導意義。
參考文獻:
[1] 茍振興. 把握項目的脈搏[J]. 程序員, 2004(6):57-60.
[2] 鄢彪, 吳克河. 每日構(gòu)建之裝配[J]. 程序員, 2005(4):64-67.
[3] 王寧. 基于Jenkins的持續(xù)集成系統(tǒng)的設(shè)計與實現(xiàn)[D]. 北京郵電大學, 2014.
[4] 孫凌云. 基于Daily Build的軟件自動化測試系統(tǒng)的研究與實現(xiàn)[D]. 西安電子科技大學, 2014.
[5] 周瑩, 歐中紅, 李俊等. 基于Jenkins的持續(xù)集成自動部署研究[J]. 計算機與數(shù)字工程, 2016(2):267-270.
[6] Richard Sun. 持續(xù)性構(gòu)建[J]. 程序員, 2007(8).
[7] Pclint [EB/OL].http://baike.baidu.com.
[8] Logiscope [EB/OL].http://baike.baidu.com.endprint