摘要:本文介紹了在敏捷軟件開發(fā)過程中使用的一種軟件持續(xù)集成平臺的技術(shù)方案。該方案利用開源軟件Hudson和SVN構(gòu)建平臺,在改進軟件質(zhì)量和降低風(fēng)險,縮短缺陷引入、發(fā)現(xiàn)和修復(fù)之間的時間間隔方面取得了顯著效果。
關(guān)鍵詞:持續(xù)集成;軟件項目;敏捷
中圖分類號:TP311.52
持續(xù)集成(Continuous Integration,簡稱CI)是敏捷軟件開發(fā)中的一種非常重要的實踐。持續(xù)集成對軟件質(zhì)量改進和風(fēng)險降低有著非常重要的作用,是所有敏捷實踐中應(yīng)用最廣泛的一種。持續(xù)集成的核心價值是縮短缺陷的引入、發(fā)現(xiàn)和修復(fù)之間的時間間隔。本文介紹一種搭建持續(xù)集成平臺的技術(shù)方案,并以軟件研發(fā)活動實際運行的情況為例介紹其效果。
1 持續(xù)集成概述
“集成”是指把一些能夠單獨工作的模塊組裝在一起構(gòu)成一個系統(tǒng)的過程。這個過程很困難,集成后的系統(tǒng)往往不可用,并且很難找到失敗的原因。為有效解決這個問題,很多學(xué)者提出應(yīng)該更早且更頻繁地進行集成,于是就有了持續(xù)集成這一技術(shù)。
持續(xù)集成的關(guān)鍵是快速和不斷重復(fù)。持續(xù)集成平臺應(yīng)具備如下四種特征:(1)與版本控制系統(tǒng)連接;(2)構(gòu)建腳本;(3)反饋機制;(4)集成源代碼變更的過程。持續(xù)集成是一個不斷循環(huán)的過程,一個循環(huán)的內(nèi)部流程描述如下:首先是程序員編寫代碼,經(jīng)過審查后,向版本控制庫提交代碼;持續(xù)集成服務(wù)器對版本控制庫進行輪詢,一旦發(fā)現(xiàn)有新的提交,就從版本控制庫獲取更新,進行代碼審查和產(chǎn)品集成構(gòu)建,并發(fā)布構(gòu)建結(jié)果、部署并自動化測試;代碼審查和測試的問題自動向程序員反饋,以便程序快速解決問題。圖1顯示了持續(xù)集成系統(tǒng)的基本構(gòu)成。
圖1 持續(xù)集成系統(tǒng)的基本構(gòu)成
作者在從事軟件研發(fā)工作期間,與團隊一起經(jīng)過反復(fù)地論證和設(shè)計,并通過多個項目的實踐,最終完成了適合實際應(yīng)用的持續(xù)集成平臺的技術(shù)方案,并取得了不錯的效果。
2 技術(shù)路線選擇
持續(xù)集成平臺的方案,可以選擇開源的Hudson作為基礎(chǔ)平臺軟件。Hudson是一個可擴展的持續(xù)集成引擎,能夠持續(xù)、自動地構(gòu)建和測試軟件項目,并監(jiān)控一些定時執(zhí)行的任務(wù);具有易用性高、易配置、WEB化、支持多種插件、分布式管理等特點。版本控制庫是持續(xù)集成平臺中的重要一環(huán),我們采用SVN軟件作為版本控制庫的平臺軟件。SVN提供命令行管理接口以及Web管理接口Submin,可以非常方便地與Hudson進行對接。通過Hudson調(diào)用SVN的管理接口,可以實現(xiàn)對代碼變更提交的周期性監(jiān)控。Hudson支持Ant腳本語言,可以用于實現(xiàn)靈活的構(gòu)建過程。
3 構(gòu)建過程設(shè)計
持續(xù)集成的一個完整過程,稱為一次構(gòu)建。在我們的實踐中,對于一個大型復(fù)雜軟件而言,執(zhí)行完一個完整的構(gòu)建過程需要大約幾個小時的時間,這對于日常開發(fā)中問題的反饋效率明顯不足,因此需要對構(gòu)建的過程進行分類管理。構(gòu)建類型分為三種:私有構(gòu)建、集成構(gòu)建和發(fā)布構(gòu)建。其中集成構(gòu)建又分為提交構(gòu)建和次級構(gòu)建。提交構(gòu)建是最快速的構(gòu)建,只包含編譯和單元測試,日常開發(fā)過程中,主要依靠“提交構(gòu)建”來實現(xiàn)快速反饋。次級構(gòu)建,與提交構(gòu)建相比執(zhí)行較多的測試,包含組件集成測試、系統(tǒng)測試、性能測試等,并且還需要執(zhí)行自動代碼審查,其運行的周期也比較長。發(fā)布構(gòu)建比次級構(gòu)建執(zhí)行更多的內(nèi)容,包括:創(chuàng)建安裝媒質(zhì),部署軟件,執(zhí)行全面的測試。
構(gòu)建觸發(fā)機制分為四種:(1)用戶驅(qū)動;(2)定期執(zhí)行;(3)輪詢變更;(4)事件驅(qū)動。用戶驅(qū)動是指,用戶根據(jù)實際需要手工啟動一次構(gòu)建;定期執(zhí)行是指設(shè)定固定的周期來執(zhí)行構(gòu)建,一般用于進行“日構(gòu)建”;輪詢變更方式則是由代碼提交變更驅(qū)動的構(gòu)建,沒有變更就不會執(zhí)行。表1中顯示了每種構(gòu)建類型與觸發(fā)機制的關(guān)系。
構(gòu)建腳本的基本行為包括如下過程:
(1)編譯源代碼:從版本控制庫獲取代碼副本,進行編譯。這個步驟還應(yīng)該包括安裝腳本的編譯,即持續(xù)集成平臺可以自動生成安裝包,而不僅僅是編譯出二進制文件而已。需要注意的是,在編譯之前需要先進行環(huán)境清理,以消除上一次構(gòu)建對本次構(gòu)建產(chǎn)生的影響;(2)執(zhí)行測試:一般是自動化的測試,包含單元測試、組件測試、系統(tǒng)測試、功能測試。真正意義上的單元測試是不涉及數(shù)據(jù)和其他依賴關(guān)系的快速測試,一般是“提交構(gòu)建”時唯一執(zhí)行的測試。而其他類型的測試,相比單元測試會更多地依賴環(huán)境,需要完整地部署軟件才能確保自動執(zhí)行測試。測試中發(fā)現(xiàn)的問題自動錄入缺陷庫,我們使用HP Quality Center平臺,該平臺提供缺陷錄入的API接口,可以方便地實現(xiàn)自動缺陷錄入;(3)執(zhí)行代碼審查:代碼動靜態(tài)測試,代碼規(guī)范審查,可利用C++Test等工具進行,通過收集和分析數(shù)據(jù)得到代碼質(zhì)量的評估結(jié)果。例如:可利用Source Moniter等工具進行代碼復(fù)雜度評估。一般而言,復(fù)雜度大于10的函數(shù)屬于高風(fēng)險。復(fù)雜度與測試用例數(shù)之間有一個經(jīng)驗公式,就是一個函數(shù)的測試用例數(shù)(檢查點)應(yīng)該至少與復(fù)雜度相等,這是檢驗測試充分性的一個視角。配合SVN版本管理庫,我們可以使用StatSVN工具來實現(xiàn)代碼修改量的自動統(tǒng)計;(4)部署軟件:把軟件部署到測試所用的計算機上,持續(xù)集成的平臺應(yīng)該具備為多臺計算機自動部署軟件的能力。對于大型C/S模式的軟件而言,在軟件部署環(huán)節(jié)會需要以來大量的計算機構(gòu)成的計算機平臺,這個平臺必須被持續(xù)集成環(huán)境長期占用,不能挪作其他用途,計算機本身的計算能力大部分時候是閑置的,因此可采用虛擬機方案以節(jié)約固定資產(chǎn)投入。
4 結(jié)束語
持續(xù)集成作為敏捷軟件開發(fā)的典型實踐之一,應(yīng)用已經(jīng)非常廣泛,但是具體的技術(shù)方案并沒有統(tǒng)一的標(biāo)準(zhǔn),各個企業(yè)可以根據(jù)自身的實際情況進行設(shè)計和實施。本文所介紹的方案經(jīng)濟實用,實施簡便,應(yīng)用效果良好。在中控ECS-700系統(tǒng)監(jiān)控軟件開發(fā)過程中,依靠持續(xù)集成平臺,使開發(fā)過程中重大缺陷從產(chǎn)生到消除的平均時間,從原來的23天縮短到了8天時間,缺陷從產(chǎn)生到被發(fā)現(xiàn)的過程時間大大縮短了。持續(xù)集成平臺對中控提升軟件開發(fā)效率,及早發(fā)現(xiàn)產(chǎn)品問題,保障軟件產(chǎn)品質(zhì)量起到了重要作用。
參考文獻:
[1]Paul M.Duvall.持續(xù)集成——軟件質(zhì)量改進和風(fēng)險降低之道[M].北京:機械工業(yè)出版社,2007.
[2]吳志福.基于持續(xù)集成環(huán)境的軟件過程管理[J].福建電腦,2011(05):85-86.
[3]劉巧玲,范冰冰,黃興平.基于Hudson的持續(xù)集成研究和應(yīng)用[J].計算機系統(tǒng)應(yīng)用,2010(12):151-154.
[4]喬梁.持續(xù)集成與配置管理策略[J].程序員,2010(01):118-119.
作者單位:浙江中控技術(shù)股份有限公司,杭州 310053