楊文遠,黃 衛,趙 鑫
(南昌航空大學 科技學院,江西 共青城 332020)
軟件開發實踐中由于單組件設計不科學、組件間交互機制不完善、機器運行環境存在差異等原因,導致集成、部署無法取得成功,致使軟件開發項目難以按時完成。為此,軟件開發時可采取持續集成機制,在多集成、常集成的基礎上,實施自動集成及回歸測試,以便及時發現與修正集成部署問題,得到質量更佳的代碼,做到項目完成狀態的準確標記,從而開發出更加穩定、優質的軟件產品。
持續集成系統應用時,系統開發人員要在持續集成活動最終報告中體現溝通結果,在滿足溝通要求的基礎上合理設計持續集成系統(見圖1)。本設計方案由5個關鍵系統構成:(1)源碼管理系統;(2)持續集成服務器系統;(3)自動化構建腳本系統;(4)報告生成與處理中心系統;(5)靜態代碼檢測服務系統[1]。系統開發時,開發人員應先展開本地測試,代碼自測通過后,再向源碼管理系統提交源碼。之后,源碼管理系統會自動檢測代碼變化,而后創建項目,系統會自主構建腳本執行調用項目清理、編譯、單元測試、測試用例覆蓋率檢測、靜態代碼檢測、性能測試以及軟件部署7個任務。
1.1.1 選擇源碼管理系統
(1)SVN系統。
此系統主要用于開源軟件的開發,能夠跨時空管理文件及目錄,可在中心版本庫存儲文件,且能詳細記錄各次文件及目錄的修改,可為數據恢復提供支持,并能實時了解數據修改情況。選擇源碼管理系統支持多個用戶同時修改與管理同一數據,具備團隊協作管理功能,因此軟件開速度相對較快,且幾乎不會因更改出錯而導致軟件質量受影響。SVN系統屬于通用系統,可管理所有類型的文件,具備目標版本化、混合追蹤、文件鎖、獨立進程模式、只讀存儲鏡像、可執行標簽、復制刪除及重命名等多項功能。SVN系統管理流程如圖2所示。

圖2 SVN系統管理流程
(2)Git系統。
此源碼管理系統屬于開源分布式版本控制系統,能處理各種規模的項目,能將代碼、版本數據克隆到本地,并能夠在本地創建分支,還具備完成代碼提交、分支合并、沖突快捷快解等功能[2]。此系統與分布式開發模式之間的契合度更高,并將個體開發作為重點,能削減公共服務器壓力、降低數據體量,且Git運行速度極快,可實現代碼的離線提交。然而開發者可通過項目克隆獲取整個代碼及版本信息,因而源碼存在一定的安全隱患。實踐應用時,系統開發人員需要結合具體需求確定是否選用Git系統。Git系統管理流程如圖3所示。

圖3 Git系統管理流程
1.1.2 自動化構建
面向移動平臺軟件開發的持續集成系統構建時,系統開發人員需要完成5個方面的自動化設計。一是自動化編碼鏈接,可采用的鏈接編譯工具有2種,分別是Ant與Maven。二是自動化測試,開發人員要實施白盒與黑盒兩類測試排查代碼運行邏輯錯誤,測試工具為UXnit,并需利用JMeter工具測試軟件性能完整性。三是靜態代碼檢查,系統開發人員要進行桌面檢查或代碼審查,檢測工具為SonarQube以及Clang Ttatic Analyze。四是自動化部署,開發人員需要分別向各個平臺上傳軟件。五是報告反饋,系統能夠自動采用傳送郵件、文件或發送短信等方式向項目相關人傳送反饋報告。
1.1.3 持續集成服務器
持續集成服務器具有多種類別,對比分析各個服務器的平臺支持方式、構建工具支持模式以及各自特點發現(見表1),基于移動平臺軟件開發的持續集成系統設計最好選用Jenkin服務器。此服務器由JVM進程、Web管理界面2部分構成,前者屬于命令調用模塊及構建過程監視模塊,后者則是項目構建狀態的動態反饋模塊。系統開發人員完成代碼提交后,hook函數自動觸發集成活動,Jenkin服務器會自動從源碼管理系統中提取新代碼,再依次進行垃圾清理、鏈接編譯、結果報告測試及結果傳送。Jenkins服務器的系統控制權高、系統兼容性強、功能更新速度快、反饋功能佳,項目構建過程、構建結果均可利用Web頁面實時展示。

表1 幾種常見的持續集成服務器對比
插件設計時,系統開發人員可選用基于Jenkins的插件系統,此插件系統具有插件種類多、更新速度快的特征,具備兼容性強、用戶界面友好、業務流程自動化程度高、報告反饋及時等優勢,與持續集成系統插件的設計要求相符。此插件系統適用于SVN、Git 2個源碼管理系統,只要為Jenkins提供一個的統一接口,插件系統便可完成源碼數據的獲取。Jenkins應用的是Web管理的用戶界面,插件開發難度不大,對用戶的吸引力較強。利用此插件系統還可以降低業務流程的用戶交互頻次和出錯率,且利于提升用戶的體驗感受。此外,基于Jenkins的插件系統能夠實時反饋報告,并具備HTML格式、XML多格式文件展示以及多元化通知服務功能。
2.1.1 自動觸發集成的實現方法
持續集成活動具有2個觸發條件,一是版本管理系統提交更新后需要對變化后的系統進行影響需求分析。二是項目版本未發生變化但需定期進行自動化構建[3]。2種觸發條件下,持續集成系統均可采用hook函數自動觸發集成活動。應先安裝hook程序,將之存儲在代碼庫中的hooks子目錄之下,系統開發人員要以事件名作為hook命令名,而后再創建代碼庫,由SVN系統構建事件hook模板并修改名稱及內容,而后hook程序便可運行。編寫hook程序時,持續集成系統的腳本及相關語言應分別選用Windows與C語言,利用perl作為腳本語言,系統開發人員提交更新此版本管理系統的申請后,持續集成系統會通過自動調用觸發集成活動。之后系統會再利用相關語言、采取相同調用方式再次觸發集成活動。hook編寫實例如表2所示。

表2 基于Windows的pre-commit hook編寫實例
2.1.2 自動化集成的實現方法
以安卓軟件平臺為例,持續集成系統自動化集成時,應在源碼修改之后先觸發hook程序,程序會將集成啟動命令傳送給Jenkins中REST風格的API,此系統會利用Ant工具執行工程清理、鏈接編譯、自動化單元與性能測試以及自動化部署等各項任務[4]。自動化集成時,Ant工具應先讀取項目中的build、xml配置文件,再構建涵蓋所有目標及任務的安卓項目,定義配置文件列表,確定各文件自定義屬性值。靜態檢查涵蓋編譯、鏈接、測試3個環節,以Sonar Qube作為檢查工具,此工具完成部署后會在build、xml中定義代碼檢查任務。至此項目靜態代碼檢查任務便已完成,之后持續集成系統還需利用JMeter工具測試軟件產品的性能。
基于Jenkins的插件系統實現時,系統開發人員需要先利用框架生成器新建插件,在了解maven的前提下,輸入新建命令,在完成項目maven中包名以及項目名交互后,再輸入插件框架創建命令,便可完成框架開發。然后,開發人員還要輸入運行命令,在Jenkins上部署命令運行后所生成的文件。插件開發時,開發人員應以Eclipse進行軟件生產環境配置,輸入環境配置命令后此軟件會生成Eclipse項目文件,之后再導入工程。該軟件以PluginImpl類作為插件入口,插件類檢測后,針對性構建插件實例并選用適合的插件構建方法。代碼開發后,系統開發人員可針對插件創建具備發布功能的虛擬鏡像文件,以便生成target/*.hpi文件,其他用戶可利用Jenkins系統中的Web界面向Jenkins傳送插件。之后,開發人員需要通過@Extension注解完成Build Step Descriptor 擴展點的選擇,再利用Command Interpreter接口開發業務邏輯[5]。
根據敏捷開發與持續集成理論以及持續集成構建自動化及系統測試的實現原理,本文提出了面向移動平臺軟件開發的持續集成系統設計與實現方案,從整體方案設計、插件系統設計2方面闡述了持續集成系統的設計思路,并分析了持續集成系統自動觸發集成實現、自動化集成實現以及系統插件實現的具體方法,旨在為持續集成系統的科學開發應用提供指導,并結合實際業務流程針對性地進行持續集成系統的更新優化,從而使之更加契合移動平臺軟件的開發要求。