單雅輝 劉青凱 楊章 田鴻運(yùn) 鄒勇剛
摘要: 隨著軟件復(fù)雜度的增加和交付需求的變化,快速集成和自動部署成為高性能數(shù)值模擬軟件推廣應(yīng)用的瓶頸。為滿足軟件構(gòu)建和發(fā)布的差異化需求,簡化從用戶需求到軟件發(fā)布的工作流程,基于Jenkins設(shè)計持續(xù)集成平臺,實(shí)現(xiàn)軟件靜態(tài)審查、編譯、測試和發(fā)布流程的自動化,全面記錄軟件構(gòu)建日志和測試結(jié)果。利用Docker技術(shù)將構(gòu)建環(huán)境容器化,實(shí)現(xiàn)環(huán)境的快速搭建和配置管理,滿足多樣化目標(biāo)環(huán)境需求。該平臺的實(shí)際應(yīng)用效果顯示,基于該平臺的產(chǎn)品發(fā)布周期相比之前縮短約75%,可極大簡化軟件安裝和部署難度。
關(guān)鍵詞: 持續(xù)集成; 軟件測試; 軟件發(fā)布; 自動部署
中圖分類號: TP311.56 ? 文獻(xiàn)標(biāo)志碼: B
Abstract: With the software complexity increasing and the delivery requirements changing, rapid integration and automatic deployment become the bottleneck in the application of high-performance numerical simulation software. In order to meet the differentiated requirements of software construction and release, the workflow from user requirements to software distribution is simplified, and then the continuous integration platform based on Jenkins is designed to realize the automation of software static review, compilation, testing and release process, in which the software build logs and test results can be recorded comprehensively. The Docker technology is used to containerize the environment, and then the rapid construction and configuration management of the environment can be realized to meet the needs of diversified target environment. The application effect of the platform shows that the product distribution cycle based on this platform is about 75% shorter than before, which can greatly simplify the difficulty of software installation and deployment.
Key words: continuous integration; software testing; software release; automatic deployment
0 引 言
數(shù)值模擬軟件是一類特殊的計算機(jī)應(yīng)用軟件,其服務(wù)于科學(xué)計算,以再現(xiàn)、發(fā)現(xiàn)和預(yù)測真實(shí)客觀系統(tǒng)運(yùn)行規(guī)律和演化特征的數(shù)值模擬為主要目標(biāo)。[1]目前,數(shù)值模擬軟件已廣泛應(yīng)用于國家重大領(lǐng)域,包括全球氣候預(yù)測、地球資源環(huán)境檢測、核能開發(fā)利用、電磁環(huán)境和信息安全等。
隨著數(shù)值模擬軟件應(yīng)用范圍不斷擴(kuò)大,數(shù)值模擬軟件的研發(fā)呈現(xiàn)以下3個方面特征[2]:(1)應(yīng)用需求日趨復(fù)雜,軟件規(guī)模不斷增加,代碼行數(shù)由過去的幾千行發(fā)展到數(shù)萬行甚至數(shù)十萬行;(2)高效能計算共性技術(shù)不斷發(fā)展,基于編程框架與離散中臺的研發(fā)模式日益普及,使得軟件架構(gòu)趨于層次化和模塊化,軟件集成復(fù)雜度隨之增加;(3)軟件運(yùn)行環(huán)境多樣、交付部署頻繁,為保證求解問題的規(guī)模,數(shù)值模擬軟件在計算實(shí)際應(yīng)用問題時需要高性能計算機(jī)支撐,但是不同高性能計算機(jī)在硬件架構(gòu)、編譯器、MPI、作業(yè)調(diào)度等方面存在較大差別,這種運(yùn)行環(huán)境差異會對數(shù)值模擬軟件的計算結(jié)果精度、性能表現(xiàn)等產(chǎn)生干擾,嚴(yán)重情況下甚至導(dǎo)致程序無法正常運(yùn)行,這對軟件的可移植性、部署靈活性提出更高的要求。
因此,在數(shù)值模擬軟件研發(fā)過程中,如何降低集成和部署難度、滿足產(chǎn)品化和應(yīng)用推廣需求,成為急需解決的問題。
本文結(jié)合高性能數(shù)值模擬軟件研發(fā)過程中的實(shí)際需求,設(shè)計并實(shí)現(xiàn)一種適用于高性能數(shù)值模擬軟件研發(fā)的持續(xù)集成平臺;介紹數(shù)值模擬軟件交付過程中面臨的實(shí)際問題,對比分析幾款典型的軟件構(gòu)建工具;介紹持續(xù)集成平臺的操作流程和設(shè)計方案,闡述實(shí)施過程中的關(guān)鍵技術(shù)點(diǎn)和具體實(shí)施過程。
1 數(shù)值模擬軟件交付過程面臨的問題和挑戰(zhàn) ?數(shù)值模擬軟件的交付過程涉及環(huán)境構(gòu)建、依賴管理解析、軟件編譯、測試和部署等內(nèi)容,如果僅涉及依賴關(guān)系處理和編譯,業(yè)內(nèi)一些構(gòu)建工具(如CMake)可以有效支撐,但對于整個交付過程來說,業(yè)內(nèi)流行的構(gòu)建工具暫時不能滿足需求。數(shù)值模擬軟件交付過程具有以下幾個方面的需求特征。
(1)生產(chǎn)環(huán)境的有效配置管理。數(shù)值模擬軟件的研發(fā)和使用大多在Linux系統(tǒng)環(huán)境下進(jìn)行。為保證軟件安裝包的可用性,生產(chǎn)環(huán)境需要與用戶環(huán)境保持一致,通常采用搭建虛擬機(jī)的方式模擬用戶環(huán)境。生產(chǎn)環(huán)境搭建過程中需完成操作系統(tǒng)安裝、網(wǎng)絡(luò)配置、軟件驅(qū)動、編譯器安裝和環(huán)境配置等工作。該過程往往無法被記錄,配置人員的某個錯誤操作極可能造成軟件編譯部署失敗,并且難以定位錯誤的位置。因此,生產(chǎn)環(huán)境最好能夠自動創(chuàng)建,并且每次環(huán)境配置的變更都能夠被記錄下來。
(2)編譯語言與目標(biāo)存在差異。在層次化研發(fā)模式中,按照軟件的不同功能定位,數(shù)值模擬軟件分為編程框架、離散中臺和應(yīng)用軟件3類。數(shù)值模擬軟件趨于模塊化,各模塊研發(fā)相對獨(dú)立,模塊或軟件之間依賴關(guān)系復(fù)雜。不同類型的軟件依賴關(guān)系不同,編譯目標(biāo)也會不同。此外,數(shù)值模擬軟件大多基于C、C+ +、Fortran等編程語言混合編寫,程序的編譯方式也會存在一定的差異。因此,需要構(gòu)建一套不僅能夠支持不同程序語言、編譯方式,而且能夠自動解析、有效處理依賴關(guān)系的工具。
(3)跨平臺兼容性測試。在通常情況下,軟件集成、開發(fā)和測試等過程是在開發(fā)環(huán)境下完成的,之后才會向生產(chǎn)環(huán)境部署。對于數(shù)值模擬軟件來說,程序?qū)幾g和運(yùn)行時的環(huán)境依賴較為敏感。當(dāng)生產(chǎn)環(huán)境與開發(fā)環(huán)境不一致時,經(jīng)常引起依賴庫版本不匹配、接口不兼容等問題,導(dǎo)致程序出現(xiàn)編譯或運(yùn)行錯誤。解決這類問題一般需要對程序進(jìn)行適配性修改,然后重新提請測試和部署,但是這種方式?jīng)]有在目標(biāo)環(huán)境中進(jìn)行充分測試,無法保證程序的正確性。解決方案是將生產(chǎn)環(huán)境下的測試、部署和發(fā)布活動納入到數(shù)值模擬軟件研發(fā)過程中,在開發(fā)的同時完成生產(chǎn)環(huán)境的測試,及時發(fā)現(xiàn)軟件在生產(chǎn)環(huán)境中遇到的問題或存在的缺陷。
(4)一鍵式軟件安裝部署。完成軟件構(gòu)建后,將編譯生成的二進(jìn)制可執(zhí)行程序、用戶文檔及其依賴的第三方庫打包后供用戶使用。由于用戶環(huán)境配置不同,需要手工修改配置文件中的目錄結(jié)構(gòu)和環(huán)境配置信息,解析依賴關(guān)系與可執(zhí)行程序鏈接庫,并通過執(zhí)行程序檢查可用性。軟件越復(fù)雜,依賴關(guān)系越復(fù)雜,安裝部署所需時間越長,而且越容易出現(xiàn)錯誤。這對用戶來說并不友好,影響程序的推廣應(yīng)用。因此,構(gòu)建工具應(yīng)該可以支持用戶環(huán)境下依賴關(guān)系、安裝與配置環(huán)境變量的自動處理,簡化用戶部署難度。
(5)全面記錄構(gòu)建日志和測試結(jié)果。數(shù)值模擬軟件開發(fā)涉及數(shù)學(xué)、物理、計算機(jī)等多學(xué)科領(lǐng)域,開發(fā)人員之間的知識背景不同,對軟件的理解差別很大。在軟件構(gòu)建和測試過程中發(fā)生錯誤時,無法快速定位錯誤是由環(huán)境配置、程序自身還是第三方依賴關(guān)系所引入,聯(lián)合調(diào)試難度大。因此,持續(xù)集成平臺需要將環(huán)境配置信息、編譯日志和測試結(jié)果全面記錄下來,并保存錯誤現(xiàn)場,便于開發(fā)人員分析和定位錯誤。
為解決以上問題,調(diào)研幾款業(yè)內(nèi)知名的軟件構(gòu)建和部署工具,其功能對比見表1。
Make是經(jīng)典的構(gòu)建工具之一,目前仍然活躍在軟件開發(fā)領(lǐng)域,但是當(dāng)應(yīng)用程序復(fù)雜程度和軟件依賴關(guān)系增加時,Makefile維護(hù)成本提升,導(dǎo)致Make更加難以調(diào)試。CMake是開源跨平臺構(gòu)建工具,能夠處理混合語言編譯,但暫不支持構(gòu)建環(huán)境和自動解析依賴等功能。MSBuild、Ant、Maven和Gradle的應(yīng)用領(lǐng)域主要針對Java或.NET語言,其中Gradle功能最為完善,可支持依賴解析、生命周期管理和構(gòu)建環(huán)境管理等功能[3-8],但其支持語言受限,無法滿足數(shù)值模擬領(lǐng)域多種編程語言混合編譯的需求。
目前,尚未發(fā)現(xiàn)單一的工具軟件可以完全符合上述高性能數(shù)值模擬軟件構(gòu)建和部署的需求,因此,針對數(shù)值模擬軟件交付過程中存在的問題,借鑒DevOps思路[9],設(shè)計并實(shí)現(xiàn)一套面向數(shù)值模擬軟件的持續(xù)集成平臺。
2 持續(xù)集成與測試平臺
為解決前文提出的數(shù)值模擬軟件構(gòu)建和部署過程中存在的問題,設(shè)計實(shí)現(xiàn)一種面向高性能數(shù)值模擬軟件的持續(xù)集成平臺。持續(xù)集成是一種軟件開發(fā) ? 實(shí)踐活動,通過單元測試和集成測試,將本地開發(fā)創(chuàng)建的代碼更改提交到代碼倉庫中,觸發(fā)自動化的軟件構(gòu)建操作,包括代碼編譯、靜態(tài)代碼審查、測試覆蓋率檢查、自動化驗(yàn)收測試和軟件安裝包發(fā)布等,驗(yàn)證更改是否滿足質(zhì)量和正確性的要求,從而盡早地發(fā)現(xiàn)集成錯誤。[10]該平臺主要解決以下關(guān)鍵問題:(1)簡化從用戶需求到軟件產(chǎn)品發(fā)布的工作流程,盡早發(fā)現(xiàn)程序缺陷;(2)滿足多樣化目標(biāo)環(huán)境需求,實(shí)現(xiàn)環(huán)境的快速搭建與配置管理;(3)有效管理軟件依賴關(guān)系,增強(qiáng)軟件構(gòu)建部署能力。
2.1 關(guān)鍵技術(shù)點(diǎn)和系統(tǒng)特色
2.1.1 自動化通用流程設(shè)計
針對傳統(tǒng)工具系統(tǒng)構(gòu)建流程繁瑣、用戶需求響應(yīng)不及時的問題,設(shè)計一套自動化軟件持續(xù)集成流程,盡量減少人工干預(yù)。該流程涉及產(chǎn)品發(fā)布的整個工作流,支持代碼靜態(tài)分析、編譯部署、驗(yàn)收測試、測試覆蓋率檢測和產(chǎn)品發(fā)布等過程的自動化,其工作流程見圖1。
該流程的輸入是軟件源代碼,輸出是二進(jìn)制安裝包。該流程的基礎(chǔ)是通過版本控制工具統(tǒng)一管理源代碼,制定規(guī)范進(jìn)行分支、目錄和權(quán)限管理。當(dāng)研發(fā)人員收到用戶的需求或缺陷反饋后,對本地代碼進(jìn)行修改,并完成本地單元級、模塊級測試驗(yàn)證后,將源代碼提交到版本管理系統(tǒng)。當(dāng)版本管理系統(tǒng)檢查到源代碼倉庫的狀態(tài)發(fā)生變化后,自動或定時觸發(fā)集成服務(wù)器進(jìn)入構(gòu)建過程。持續(xù)集成系統(tǒng)通過任務(wù)形式將源代碼分發(fā)到指定從節(jié)點(diǎn)(按環(huán)境需求)進(jìn)行系統(tǒng)構(gòu)建和測試,具體包括代碼靜態(tài)審查、自動化測試、覆蓋率測試等。測試通過后將軟件編譯成二進(jìn)制安裝包,并將安裝包通過文件傳輸工具上傳至產(chǎn)品發(fā)布平臺或部署到目標(biāo)機(jī),通知用戶下載、安裝軟件產(chǎn)品。如果系統(tǒng)構(gòu)建失敗,則通過網(wǎng)頁的形式將報錯日志反饋到控制臺輸出界面,供研發(fā)人員快速跟蹤定位錯誤。
2.1.2 基于模板快速配置構(gòu)建環(huán)境
滿足多樣化目標(biāo)環(huán)境需求的關(guān)鍵是實(shí)現(xiàn)構(gòu)建環(huán)境的自動化搭建,并對環(huán)境進(jìn)行有效的版本控制。對虛擬化技術(shù)的前期調(diào)研發(fā)現(xiàn),應(yīng)用容器引擎技術(shù)能夠?qū)?gòu)建環(huán)境搭建的工作量最小化。
應(yīng)用容器引擎將所需軟件及其依賴關(guān)系包進(jìn)一個可移植的容器中,支持向任何現(xiàn)有的Linux機(jī)器部署和遷移。容器是一組能夠隨處運(yùn)行的單元,對應(yīng)用程序及其關(guān)聯(lián)性進(jìn)行隔離,運(yùn)行時相互之間不影響。根據(jù)特定的用戶環(huán)境需求,容器引擎可通過環(huán)境構(gòu)建腳本快速創(chuàng)建容器環(huán)境。構(gòu)建腳本將全部環(huán)境配置命令組合形成文件模板,通過一條簡單的環(huán)境構(gòu)建命令即可實(shí)現(xiàn)容器化構(gòu)建環(huán)境的快速生成和批量創(chuàng)建。
與虛擬機(jī)相比,容器化環(huán)境更加輕量化。當(dāng)出現(xiàn)新的構(gòu)建環(huán)境需求時,只需要簡單修改模板文件,即可實(shí)現(xiàn)快速定制,環(huán)境搭建時間由原來的幾小時縮短為幾分鐘。此外,這種方式便于開發(fā)人員與測試人員之間溝通迭代,通過交換環(huán)境構(gòu)建腳本可保證軟件執(zhí)行環(huán)境的一致性。
2.1.3 聯(lián)動構(gòu)建機(jī)制管理依賴關(guān)系
在數(shù)值模擬軟件研制過程中,存在2種較為常見的依賴關(guān)系,即庫依賴和組件依賴。庫依賴是指程序開發(fā)過程中所依賴的第三方軟件包,例如編譯器、MPI和數(shù)學(xué)庫等,這些軟件一般很少更新。組件依賴應(yīng)用程序所依賴的部分程序塊通常是自主研發(fā)的,需要頻繁更新。[10]
對于庫依賴來說,由于不同軟件所用的第三方軟件包有所差異,在集成或部署時經(jīng)常遇到版本沖突、接口不兼容等問題。通過對所有產(chǎn)品庫依賴關(guān)系進(jìn)行梳理,基于軟件包管理工具建立統(tǒng)一的庫管理模式,可形成一套根據(jù)構(gòu)建環(huán)境分類的內(nèi)部發(fā)布平臺(軟件源)。開發(fā)人員只需要在原有構(gòu)建工具的基礎(chǔ)上進(jìn)行封裝,簡單編寫配置文件,明確構(gòu)建步驟和依賴關(guān)系,即可從內(nèi)部發(fā)布平臺(軟件源)自動解析獲取依賴,完成編譯和軟件打包等操作,具體產(chǎn)品構(gòu)建工作流程見圖2。
對于組件依賴來說,當(dāng)某個組件被修改時,僅獨(dú)立編譯該組件,在集成時會影響相關(guān)組件的使用。針對這一問題,基于持續(xù)集成系統(tǒng)配置聯(lián)動構(gòu)建機(jī)制,即建立任務(wù)之間的前后順序管理,當(dāng)前一組件構(gòu)建成功即可自動觸發(fā)下一組件構(gòu)建,通過集成測試后,再將該應(yīng)用程序依賴的框架或庫整理打包并發(fā)布。
統(tǒng)一的依賴庫管理模式與聯(lián)動構(gòu)建機(jī)制相結(jié)合,一方面可提供統(tǒng)一的第三方庫管理機(jī)制,有效管理庫版本,實(shí)現(xiàn)第三方庫依賴關(guān)系的自動解析;另一方面可有效管理組件之間的依賴關(guān)系和持續(xù)集成與測試組件之間的接口,避免組件版本不兼容引入的問題。
2.2 持續(xù)集成方案設(shè)計
按照第2.1節(jié)中的流程設(shè)計思路,基于持續(xù)集成服務(wù)器與版本控制系統(tǒng)之間的觸發(fā)機(jī)制,當(dāng)系統(tǒng)檢測到代碼更新時,持續(xù)集成服務(wù)器選擇指定的從節(jié)點(diǎn)作為構(gòu)建環(huán)境,在從節(jié)點(diǎn)上執(zhí)行持續(xù)集成配置腳本。配置腳本調(diào)用代碼檢測與軟件構(gòu)建相關(guān)的工具,實(shí)現(xiàn)環(huán)境清理、代碼靜態(tài)審查、軟件編譯、自動化測試、代碼覆蓋率檢測和軟件發(fā)布等操作。腳本執(zhí)行完成后,將構(gòu)建結(jié)果輸出到指定目錄,供持續(xù)集成服務(wù)器讀取和分析。持續(xù)集成服務(wù)器通過配置插件、讀取構(gòu)建和測試日志,將結(jié)果可視化輸出到web端界面。整個過程的實(shí)現(xiàn)主要依賴于配置腳本,通過修改配置腳本可以實(shí)現(xiàn)自定義流程裁剪和定制。持續(xù)集成平臺設(shè)計方案見圖3。
2.3 持續(xù)集成和測試方案的實(shí)施
選用Jenkins作為基礎(chǔ)持續(xù)集成服務(wù)器。與其他持續(xù)集成工具相比,Jenkins主要有2個優(yōu)點(diǎn):一是易于安裝配置,提供直觀靈活的web用戶界面,便于配置管理;二是具有強(qiáng)大的插件機(jī)制,可以顯示測試結(jié)果和構(gòu)建日志等反饋信息。[11-12]版本控制工具使用Subversion,用于存儲、追蹤目錄和文件的修改
歷史。軟件包管理工具使用Conda,用于管理軟件依賴關(guān)系,可有效處理軟件產(chǎn)品之間的沖突。自動化測試工具使用自主研發(fā)的AutoBenchTest(簡寫為ABTest),適用于數(shù)值模擬軟件測試算例的串行和并行執(zhí)行,能夠自動生成測試報告和結(jié)果統(tǒng)計報表。
基于以上設(shè)計方案和支撐工具,該平臺具體實(shí)現(xiàn)過程如下。
2.3.1 基于Docker容器技術(shù)配置構(gòu)建環(huán)境
采用Docker容器技術(shù)為持續(xù)集成服務(wù)器提供構(gòu)建環(huán)境。在Docker中構(gòu)建容器時,通過編寫Dockerfile腳本實(shí)現(xiàn)容器的快速生成。該Dockerfile包含創(chuàng)建鏡像所需要的全部指令,實(shí)現(xiàn)對網(wǎng)絡(luò)、訪問端口、編譯器、構(gòu)建環(huán)境、版本控制服務(wù)和其他依賴軟件的安裝配置?;谠揇ockerfile文件,僅執(zhí)行docker build命令即可一鍵式創(chuàng)建鏡像,同時自底向上打包軟件及其構(gòu)建環(huán)境。[13]這種方式能夠減少鏡像和容器的創(chuàng)建過程,簡化部署、方便系統(tǒng)升級。
容器搭建完成后,持續(xù)集成服務(wù)器可以通過任務(wù)配置的方式選取相應(yīng)的Docker容器作為構(gòu)建環(huán)境執(zhí)行軟件編譯與測試。[14]當(dāng)任務(wù)執(zhí)行完成后,持續(xù)集成服務(wù)器生成容器并保存至Docker鏡像倉庫,便于后期環(huán)境恢復(fù)和錯誤定位?;贒ocker的環(huán)境配置方案見圖4。
2.3.2 基于Conda工具實(shí)現(xiàn)自動化構(gòu)建
Conda工具的實(shí)現(xiàn)機(jī)制主要包括遠(yuǎn)程服務(wù)器端和本地端2部分。對于遠(yuǎn)程服務(wù)器端來說,產(chǎn)品發(fā)布平臺主要用于統(tǒng)一管理所有軟件構(gòu)建所依賴的公共庫、第三方軟件和工具軟件等,以減少重復(fù)構(gòu)建的操作。對于本地端來說,面向數(shù)值模擬軟件的構(gòu)建和打包需求,可支撐軟件完成依賴解析和軟件編譯,最終生成二進(jìn)制安裝包。
本地端的構(gòu)建自動化通過編寫Conda配置文件meta.yaml和build.sh腳本實(shí)現(xiàn)。build.sh是自動化編譯腳本,用于記錄軟件編譯步驟、需要設(shè)置的環(huán)境變量信息等內(nèi)容。該腳本是在程序原有的CMakelist/ Makefile上進(jìn)行一層封裝,不會對程序原有編譯方式造成影響。對用戶來說,該工具的使用和維護(hù)成本較小。meta.yaml提供指定遠(yuǎn)程源路徑、安裝包名稱、版本、源碼目錄、編譯/運(yùn)行時所依賴的軟件和版本等內(nèi)容。明確以上關(guān)鍵信息后,Conda工具通過讀取配置文件解析軟件依賴關(guān)系,從遠(yuǎn)程軟件源獲取安裝包并配置構(gòu)建環(huán)境,完成編譯并生成二進(jìn)制安裝包。
2.3.3 編寫持續(xù)集成配置腳本
持續(xù)集成配置腳本基于shell語言與Jenkins Pipeline語法編寫,主要包括版本檢出、代碼靜態(tài)檢查、軟件編譯、驗(yàn)收測試、覆蓋率檢測等5個部分。該腳本按照流程分階段組織,每個階段完成相應(yīng)的環(huán)境清理、工具調(diào)用、測試數(shù)據(jù)輸出、輸出數(shù)據(jù)處理和可視化等操作。
此外,腳本盡可能地使用特定變量和相對目錄,規(guī)避不同軟件之間的個性化差異,從而形成持續(xù)集成配置腳本模板,可支持構(gòu)建任務(wù)的快速創(chuàng)建。
2.3.4 基于Jenkins插件反饋構(gòu)建結(jié)果
Jenkins提供豐富的二次開發(fā)接口和插件機(jī)制[15],能夠支持靜態(tài)審查、代碼量統(tǒng)計、自動化測試和測試覆蓋率結(jié)果可視化等操作,可直觀地向測試人員反饋評測結(jié)果。
在插件管理界面安裝Cppcheck和Sloc插件,在配置界面填寫輸出文件目錄和文件格式等關(guān)鍵信息,讀取并分析XML形式的輸出文件,對結(jié)果進(jìn)行統(tǒng)計、分類并輸出詳細(xì)日志,完成靜態(tài)檢查和代碼量統(tǒng)計。以代碼靜態(tài)審查為例,其不僅能夠簡明扼要地反饋錯誤統(tǒng)計結(jié)果,而且能夠顯示錯誤詳細(xì)信息,包括靜態(tài)審查錯誤文件、行數(shù)、錯誤類型和日志等信息,便于研發(fā)人員及時解決程序中潛在的數(shù)組越界、內(nèi)存泄漏等問題。靜態(tài)審查錯誤日志實(shí)例見圖5。
在軟件測試和覆蓋率統(tǒng)計方面,基于持續(xù)集成服務(wù)器提供的Publish Html插件,在配置界面明確測試報告生成目錄、網(wǎng)頁文件名稱和標(biāo)題等,Jenkins可將任務(wù)與工具生成的Html界面關(guān)聯(lián),并在任務(wù)主界面顯示測試算例執(zhí)行報表、測試覆蓋率檢測結(jié)果等。自動化測試報告實(shí)例見圖6。報告中明確給出測試環(huán)境信息、測試算例執(zhí)行狀態(tài)和統(tǒng)計信息,提供具體算例的執(zhí)行日志,便于定位錯誤。測試覆蓋率檢測報告實(shí)例見圖7。報告中不僅統(tǒng)計本次軟件測試中整體代碼行數(shù)與函數(shù)覆蓋率情況,而且能夠通過顏色明確標(biāo)識具體代碼行的執(zhí)行信息,便于研發(fā)人員進(jìn)一步完善測試算例。
3 應(yīng)用效果
該持續(xù)集成平臺用于支撐中物院高性能數(shù)值模擬軟件中心的產(chǎn)品化和應(yīng)用推廣工作。該平臺可實(shí)現(xiàn)產(chǎn)品構(gòu)建、測試和發(fā)布工作的自動化,已應(yīng)用于35款數(shù)值模擬軟件,完成2 100余例測試算例自動化測試,發(fā)布軟件產(chǎn)品3 000余次,產(chǎn)品交付周期相比之前縮短約75%,大幅提升產(chǎn)品構(gòu)建與交付效率。
基于Dockerfile容器模板,該平臺可支持構(gòu)建環(huán)境的快速生成。目前,構(gòu)建環(huán)境覆蓋Centos、Redhat、Fedora和Suse等多種操作系統(tǒng)、編譯器和MPI版本,能夠滿足銀河、天河2號等典型高性能計算環(huán)境的產(chǎn)品部署需求。在產(chǎn)品發(fā)布后,用戶可一鍵式安裝部署,平臺自動解析軟件依賴和安裝與環(huán)境變量配置,降低軟件產(chǎn)品部署難度和使用成本。
此外,針對軟件研發(fā)過程中的問題記錄和反饋需求,該平臺可實(shí)現(xiàn)構(gòu)建和測試日志全面輸出。對于單個軟件的構(gòu)建來說:一方面,該平臺能夠直觀地反饋階段執(zhí)行情況,記錄整個構(gòu)建任務(wù)中的操作步驟和報錯日志,并可視化輸出各個工具生成的數(shù)據(jù)文件;另一方面,該平臺能夠?qū)y試結(jié)果進(jìn)行統(tǒng)計分析,生成構(gòu)建過程趨勢圖(見圖8),有效監(jiān)控軟件開發(fā)過程數(shù)據(jù),促進(jìn)產(chǎn)品質(zhì)量持續(xù)提升。
4 結(jié)束語
基于Docker與Jenkins技術(shù)設(shè)計并實(shí)現(xiàn)面向數(shù)值模擬軟件的持續(xù)集成平臺。該平臺從數(shù)值模擬軟件面臨的實(shí)際應(yīng)用需求出發(fā),建立代碼靜態(tài)分析、依賴關(guān)系解析、軟件編譯、測試和部署等自動化工作流程,實(shí)現(xiàn)構(gòu)建環(huán)境的快速搭建和配置管理,詳細(xì)記錄軟件構(gòu)建日志和測試結(jié)果,便于研發(fā)團(tuán)隊及時發(fā)現(xiàn)軟件缺陷、快速分析定位問題。
該平臺可大幅度縮短產(chǎn)品構(gòu)建、發(fā)布和交付周期,有效保障數(shù)值模擬軟件的產(chǎn)品化和推廣應(yīng)用。但是,該持續(xù)集成平臺未采用數(shù)據(jù)庫技術(shù)對測試數(shù)據(jù)統(tǒng)一管理。在下一步工作中,將深入開展測試數(shù)據(jù)管理和分析工作,記錄產(chǎn)品質(zhì)量變化趨勢,及時發(fā)現(xiàn)軟件中潛在的缺陷。
參考文獻(xiàn):
[1] 莫則堯, 裴文兵. 科學(xué)計算應(yīng)用程序探討[J]. 物理, 2009, 38(8): 552-558. DOI: 10.3321/j.issn:0379-4148.2009.08.004.
[2] 田鴻運(yùn), 劉青凱, 成杰, 等. 一種面向高性能數(shù)值模擬軟件的自動化測試平臺[J]. 計算機(jī)工程與科學(xué), 2017, 39(11): 1980-1985. DOI: 10.3969/j.issn.1007-130X.2017.11.002.
[3] 蔣祥剛. Make與Makefile初探[J]. 中文信息, 2002(8): 62-65.
[4] HOFFMAN B, COLE D, VINES J. Software process for rapid development of HPC software using CMake[C]// Proceedings of 2009 DoD High Performance Computing Modernization Program Users Group Conference. San Diego: IEEE Press, 2009: 11873937. DOI: 10.1109/HPCMP-UGC.2009.62.
[5] KAWALEROWICZ M, BERNTSON C. Continuous integration in .Net[M]. New York: Manning, 2011.
[6] HATCHER E, LOUGHRAN S. 使用Ant進(jìn)行Java開發(fā)[M]. 北京: 電子工業(yè)出版社, 2005.
[7] 董曉光, 喻濤. 使用Maven構(gòu)建Java項目[J]. 電子技術(shù)與軟件工程, 2014(10): 105.
[8] BERGLUND T, MCCULLOUGH M. Building and testing with Gradle[M]. Boston: O′Reilly Media, 2011.
[9] 陳能技, 付勇, 等. 大規(guī)模組織DevOps實(shí)踐[M]. 北京: 電子工業(yè)出版社, 2018.
[10] 成奮華, 金敏. 基于敏捷過程的IT項目范圍管理的研究與應(yīng)用[J]. 計算機(jī)技術(shù)與發(fā)展, 2010, 20(10): 232-236. DOI: 10.3969/j.issn.1673-629X.2010.10.056.
[11] HUMBLE J, FARLEY D. Continuous delivery: Reliable software releases through build, test, and deployment automation[M]. Alaska: Addison-Wesley Professional, 2010.
[12] DUVALL P M, MATYAS S, Glover A. 持續(xù)集成軟件質(zhì)量改進(jìn)和風(fēng)險降低之道[M]. 北京: 電子工業(yè)出版社, 2012.
[13] MERKEL D. Docker: Lightweight Linux containers for consistent development and deployment[J]. Linux Journal, 2014, 2014(239): 2.
[14] 張兆晨, 羅鐵堅. CCI: 一種基于容器化的持續(xù)集成系統(tǒng)[J]. 中國科學(xué)院大學(xué)學(xué)報, 2018, 35(4): 569-575. DOI: 10.7523/j.issn.2095-6134.2018.04.021.
[15] 劉巧玲, 范冰冰, 黃興平. 基于Hudson的持續(xù)集成研究和應(yīng)用[J]. 計算機(jī)系統(tǒng)應(yīng)用, 2010, 19(12): 151-154.
(編輯 武曉英)