林新黨,穆加艷
(1. 海軍駐南京地區(qū)雷達系統(tǒng)軍事代表室,南京 210003;2.中國船舶重工集團公司第七二四研究所,南京 211153)
基于Jenkins的持續(xù)集成系統(tǒng)研究
林新黨1,穆加艷2
(1. 海軍駐南京地區(qū)雷達系統(tǒng)軍事代表室,南京 210003;2.中國船舶重工集團公司第七二四研究所,南京 211153)
針對敏捷開發(fā)實踐的特點,研究了基于Jenkins的持續(xù)集成系統(tǒng)。綜合考慮了軟件開發(fā)的項目組織形式,采用了支持分布式工作流的代碼存儲庫,利用測試驅動開發(fā)的測試方法。實現(xiàn)了自動化軟件單元測試及持續(xù)集成,并與傳統(tǒng)的人工測試在時間開銷方面作了比較分析。
持續(xù)集成系統(tǒng);自動化測試;單元測試
在保證高質(zhì)、高效完成項目的前提下,需要提煉項目中重復且無需人工干預的任務交給計算機來完成??芍貜屯瓿傻娜蝿帐强苫貧w的??苫貧w性和敏捷性相輔相成,可回歸性是基礎,而敏捷性是提升可回歸能力的重要方面。為了使軟件研發(fā)過程的可回歸性和敏捷性達到最優(yōu),必須實施持續(xù)集成。持續(xù)集成可以最大化地體現(xiàn)可回歸性和敏捷性。本文是持續(xù)集成的一個具體實踐,主要包括持續(xù)集成工具、代碼存儲庫和自動化單元測試工具以及若干腳本文件。持續(xù)集成包括讀取源代碼、編譯、連接、測試等過程,整個創(chuàng)建過程都是自動完成。成功的構建都須通過測試才能完成。通過查看構建趨勢和測試結果趨勢,可以看出程序歷史版本的構建情況。
對于持續(xù)集成的工具,本文選擇的是Jenkins。它為開源項目,可免費獲得,并提供較多的插件支持,可方便使用第三方的應用功能。
本系統(tǒng)以最小的人機交互來完成軟件的自動化測試和持續(xù)構建,可以提高軟件測試的速度和效率,縮短軟件開發(fā)時間,降低測試成本。
1.1 系統(tǒng)組成
本系統(tǒng)主要基于VC的項目使用,構建并完成代碼的自動化單元測試??紤]項目人員不集中等情況,持續(xù)集成系統(tǒng)的方案有如下兩種:
?第一種方案:Jenkins + Mercurial + MSBuild + CppUnit + sourceMonitor + Cpplint;
?第二種方案:Jenkins + Mercurial + MSBuild + LDRA_Testbed(商業(yè)測試軟件)。
兩種方案比較:
(1) 第一種方案采用開源和免費的軟件,較易獲得,使用方便,便于普及;
(2) 第二種方案中的測試軟件為商業(yè)測試軟件LDRA_Testbed,在普及上有一定局限性;優(yōu)點是代碼的規(guī)則檢查時可以定制規(guī)則,并且該軟件集代碼規(guī)則檢查、代碼度量和代碼覆蓋率測試功能于一體。
本文的持續(xù)集成系統(tǒng)采用第一種方案,代碼存儲庫使用Mercurial,持續(xù)集成工具為Jenkins,測試工具使用CppUnit測試框架,靜態(tài)分析軟件為Cpplint,代碼度量工具為sourceMonitor。本系統(tǒng)組成如圖1。
圖1 持續(xù)集成系統(tǒng)組成
代碼存儲庫有兩種控制流,一種為分布式,另一種為集中式的。開發(fā)人員平時可以把代碼存儲庫視為分布式的,在本地管理自己的代碼,須將代碼上傳到持續(xù)集成服務器時再使用集中式控制流。
開發(fā)人員須在計算機上配置代碼存儲庫、開發(fā)工具以及測試工具。當開發(fā)人員在本地開發(fā)代碼時,編寫測試用例作單元測試,測試通過后上傳到持續(xù)集成服務器。
持續(xù)集成服務器需安裝代碼存儲庫、持續(xù)集成工具、MSBuild以及測試工具等,環(huán)境配置為持續(xù)集成環(huán)境。當項目組上傳代碼時,持續(xù)集成系統(tǒng)按照預先設置的環(huán)境參數(shù)完成自動集成并測試。
1.2 持續(xù)集成的流程
持續(xù)集成的流程圖如圖2所示,持續(xù)集成模塊的使用場景如下:
(1) 開發(fā)人員A負責開發(fā)工程模塊A,開發(fā)人員B負責開發(fā)該工程模塊B。開發(fā)人員分別在自己的電腦上開發(fā)完相應模塊并且通過單元測試;
(2) 項目負責人集成模塊A和模塊B,建立project,編譯并經(jīng)過單元測試后將project上傳代碼存儲庫;
(3) 項目負責人在本平臺新建job,并對該job的project源代碼位置以及自動化測試進行相關配置,設置構建時機(可以設置為源代碼庫里相關代碼變動了即開始構建);
(4) 開發(fā)人員修改代碼后上傳到代碼存儲庫,上傳成功后持續(xù)集成平臺自動執(zhí)行構建和測試的工作;
(5) 持續(xù)集成平臺將測試結果反饋給開發(fā)人員,開發(fā)人員修改代碼后再上傳到代碼存儲庫,即觸發(fā)新一次構建。
圖2 持續(xù)集成的流程圖
2.1 安裝和配置
持續(xù)集成軟件Jenkins選擇默認安裝,代碼存儲庫軟件選擇windows圖形界面tortoiseHg版本。持續(xù)集成系統(tǒng)需要安裝相應的若干插件,具體如下:
?Mercurial插件:使Jenkins能使用代碼存儲庫Mercurial;
?MSBuild插件:使Jenkins能使用MSBuild,這樣才能構建基于VC的項目;
?xUnit插件和CppUnit插件:使Jenkins能查看CppUnit測試結果,并作測試結果的趨勢統(tǒng)計。
Jenkins在正常工作前需要作如下的配置:
?代碼存儲庫的配置:設置代碼倉庫的路徑;
?MSBuild的配置:設置MSBuild的路徑;
?單元測試的配置:設置要查看的測試結果的路徑。
整個系統(tǒng)的使用部署情況如圖3所示。
圖3 持續(xù)集成系統(tǒng)的部署圖
2.2 持續(xù)構建
持續(xù)集成軟件基于web服務,訪問端口為8080。持續(xù)集成工具安裝配置成功后,在本地訪問的地址是http://localhost:8080/。首先須建立一個新任務,并完成該任務的設置,包括需要編譯的工程文件的路徑以及觸發(fā)構建的時機等。設置成功后系統(tǒng)就能自動地完成持續(xù)集成工作。
用戶可修改JENKINS_HOME的位置:在Jenkins的Jenkins.xml中找到JENKINS_HOME,默認value為%BASE%。用戶可根據(jù)實際需要更改路徑,并重啟Jenkins,使其生效。
Jenkins無須登陸即可直接使用。如果出于安全考慮而需進行登錄設置的,可在“系統(tǒng)管理”-“系統(tǒng)設置”中進行配置,也可以下載插件Role Strategy Plugin來進行用戶管理。
持續(xù)集成工具提供4種方式的構建時機,用戶可以根據(jù)需要自行設定。
如果項目有構建依賴,即A任務完成后B任務才可以運行,那么就需要配置兩個任務間的依賴關系,在設置持續(xù)集成任務時配置完成。
持續(xù)集成系統(tǒng)可以查看持續(xù)構建的趨勢,如圖4右下角的曲線圖,橫軸表示構建次數(shù),縱軸表示每次構建的時間。
查看測試結果趨勢如圖5所示,橫軸表示構建次數(shù),縱軸表示用例數(shù),兩條曲線分別表示用例總數(shù)和失敗用例數(shù)??梢圆榭床怀晒嫿ǖ脑蛞约笆〉臏y試用例等,如圖6所示。
圖4 持續(xù)集成工具的界面圖
圖5 測試結果趨勢圖
圖6 查看測試結果
2.3 單元測試
沒有測試是不完整的構建,只有通過測試的構建才算構建成功的版本。在本系統(tǒng)中采用xUnit測試框架CppUnit來作單元測試。該框架能夠輔助單元測試編寫測試用例、運行測試以及產(chǎn)生報告,是測試驅動開發(fā)測試方法的一個工具。利用該測試方法可先寫測試用例,再為測試代碼添加產(chǎn)品代碼。在進行自動化測試時,將數(shù)據(jù)、配置和功能分開,有利于提高測試的時間和維護測試腳本及測試用例。
單元測試包括靜態(tài)分析和覆蓋率分析。靜態(tài)分析包括代碼審查。自動化的代碼審查能解決80%的問題,讓開發(fā)者來處理20%的重要問題[1]。本系統(tǒng)采用Cpplint來作代碼規(guī)則檢查。該工具針對google c++ style規(guī)則,持續(xù)集成系統(tǒng)可查看代碼審查結果。Cpplint對審查結果給出一個置信度評分,分值在[1,5]之間,分數(shù)越高表示問題越肯定。
代碼審查還包括代碼度量,主要針對代碼的圈復雜度。可以根據(jù)復雜度隨時間的變化趨勢來決定測試的工作量。如果存在復雜度增加的趨勢,就需要增加測試用例來減少風險,或通過重構來降低復雜度從而解決潛在的風險。
持續(xù)集成系統(tǒng)也可作其他類型的測試,如單元測試、系統(tǒng)測試、負載/性能測試和安全測試等。
2.4 信息反饋
持續(xù)集成系統(tǒng)主要優(yōu)點是能快速向開發(fā)者和項目風險承擔者提供反饋信息。
使用持續(xù)集成系統(tǒng),可以隨時了解項目的狀態(tài)。該過程為無須人工干預的過程,機器自動執(zhí)行,確保隨時有可運行的版本。持續(xù)集成系統(tǒng)每次構建都會產(chǎn)生一個控制臺記錄文件,記錄構建過程。
反饋機制有三種:Email/IM/RSS(Really Simple Syndication)。每次構建結束后持續(xù)集成系統(tǒng)會通過用戶選擇的方式將結果通知相關人員。
持續(xù)集成系統(tǒng)可以幫助項目組成員將時間用在更重要、更有挑戰(zhàn)性的問題上,從而縮短項目的開發(fā)時間、提高軟件質(zhì)量。開發(fā)者可以將時間更多地用在軟件設計上,而把繁瑣、可重復的集成工作交給機器來完成。因持續(xù)集成快速反饋的信息,測試人員能更頻繁地進行測試,而每次測試范圍比較小,且是持續(xù)在測試,不必等到軟件全部完成后再測試。對于項目的管理者,通過持續(xù)集成,每次構建都能得到可執(zhí)行的軟件產(chǎn)品和真實的測試數(shù)據(jù)。這些決策信息能讓項目管理者集中精力來管理項目時間、費用和品質(zhì)。
[1] Paul M.Duvall,等. 持續(xù)集成軟件質(zhì)量改進和風險降低之道[M].王海鵬,等譯.北京:電子工業(yè)出版社,2012.6:126.
[2] 尹平,等.軟件測試與軟件質(zhì)量評價[M].北京:國防工業(yè)出版社,2008:184.
Continuous integration system based on Jenkins
LIN Xin-dang1, MU Jia-yan2
(1.Military Representatives Office of Radar System of the Chinese PLA Navy in Nanjing, Nanjing 210003; 2.No. 724 Research Institute of CSIC, Nanjing 211153)
According to the characteristics of agile development practices, the continuous integration system based on Jenkins is studied. With the project organization forms of the software development taken into consideration and the code repository that supports distributed workflow adopted, a test-driven development test method is used. The automated software unit test and continuous integration system are realized, and the conventional manual test is compared with the new test in time spending.
continuous integration system; automated test; unit test
2013-12-20
林新黨(1970-),男,工程師,碩士,研究方向:雷達總體技術;穆加艷(1980-),女,高級工程師,工程碩士,研究方向: 雷達總體及終端技術。
TP311.1
A
1009-0401(2014)01-0058-04