毛小樂
(陜西工業(yè)職業(yè)技術(shù)學(xué)院 陜西省咸陽市 712000)
信息化產(chǎn)業(yè)在近幾十年來一直呈現(xiàn)快速增長的趨勢,隨著軟件產(chǎn)品的日趨復(fù)雜化,使得開發(fā)規(guī)模逐漸擴(kuò)大,軟件的開發(fā)、測試到產(chǎn)品上線的周期一直在延長。在傳統(tǒng)的開發(fā)模式中,一個成熟的產(chǎn)品一定是經(jīng)過若干版本的迭代,并且無論新增加的功能是否影響別的模塊,都是將整個產(chǎn)品再次進(jìn)行功能、性能等所有的測試,才能發(fā)布新的版本,且測試環(huán)節(jié)是在所有開發(fā)人員完成各自模塊之后才能夠進(jìn)行。目前這種傳統(tǒng)的集成方式已經(jīng)不能滿足當(dāng)今企業(yè)的發(fā)展模式,隨之敏捷開發(fā)的概念出現(xiàn)了,同時伴隨著持續(xù)集成實(shí)踐在業(yè)內(nèi)的流行。持續(xù)集成的應(yīng)用不僅可以降低軟件開發(fā)的集成風(fēng)險,還可以通過逐步改進(jìn)開發(fā)過程來階梯式地提高軟件質(zhì)量,因此對它的研究具有重要的價值和意義。
由于持續(xù)集成的思想對于改善軟件開發(fā)過程,提高軟件產(chǎn)品質(zhì)量有著重要的意義,越來越多的開發(fā)團(tuán)隊已在他們的開發(fā)過程中采用持續(xù)集成,而且很多商業(yè)與開源的工具都支持持續(xù)集成,目前流行的CI 工具有CruiseControl、Jenkins、Travis CI、Circle CI、Codeship、CloudBuild等,通過分析這幾種工具或系統(tǒng)發(fā)現(xiàn)持續(xù)集成系統(tǒng)的發(fā)展趨勢是構(gòu)建資源的虛擬化、代碼化,即可以通過腳本靈活定義構(gòu)建依賴的資源,在構(gòu)建過程中動態(tài)的分配所需資源,提高資源復(fù)用的靈活性,減少資源配置的復(fù)雜度,從而實(shí)現(xiàn)基礎(chǔ)設(shè)施即代碼。
通過對上述持續(xù)化集成工具的分析,本文提出了一種基于容器技術(shù)的多語言異構(gòu)環(huán)境的持續(xù)集成系統(tǒng),旨在通過對大型軟件的持續(xù)集成過程進(jìn)行研究,設(shè)計出大型軟件持續(xù)集成系統(tǒng),能夠?qū)崿F(xiàn)構(gòu)建環(huán)境的高效部署,構(gòu)建資源具備分布式部署、異地容災(zāi)、動態(tài)調(diào)度、自愈能力。構(gòu)建工程代碼化、可回滾、可追溯。代碼的靜態(tài)檢查,安全漏洞掃描和自動化測試與軟件的編譯構(gòu)建高度集成,以及自動化部署到測試環(huán)境和生產(chǎn)環(huán)境。最終軟件開發(fā)人員只需關(guān)注代碼編寫,代碼提交后自動觸發(fā)編譯,版本集成,打包,靜態(tài)檢查,安全掃描,測試環(huán)境部署,自動化測試等,實(shí)現(xiàn)大型復(fù)雜軟件的快速迭代,節(jié)省集成時間。
基于容器技術(shù)的多語言異構(gòu)環(huán)境的持續(xù)集成系統(tǒng)包含配置庫、構(gòu)建環(huán)境管理模塊、構(gòu)建工程管理模塊、資源管理和調(diào)度模塊、資源監(jiān)控模塊、數(shù)據(jù)庫模塊,如圖1 所示。
圖1: 持續(xù)集成系統(tǒng)架構(gòu)圖
系統(tǒng)配置庫用來承擔(dān)源碼管理、構(gòu)建環(huán)境的配置代碼管理、構(gòu)建工程配置代碼管理等功能。構(gòu)建環(huán)境管理模塊負(fù)責(zé)自動分析構(gòu)建環(huán)境的配置代碼,并生效構(gòu)建環(huán)境實(shí)例,提供編譯構(gòu)建任務(wù)執(zhí)行環(huán)境。構(gòu)建工程管理模塊負(fù)責(zé)自動解析工程配置代碼,解析各個編譯任務(wù)、靜態(tài)檢查任務(wù)的依賴關(guān)系、串并行關(guān)系,分析構(gòu)建所需環(huán)境類型,下發(fā)任務(wù)給構(gòu)建資源管理模塊準(zhǔn)備構(gòu)建資源,同時自動在構(gòu)建系統(tǒng)上面創(chuàng)建對應(yīng)Project。資源管理模塊:負(fù)責(zé)構(gòu)建基礎(chǔ)設(shè)施的管理,統(tǒng)一管理底層的虛擬機(jī)、物理機(jī)、容器以對上層調(diào)用服務(wù)屏蔽細(xì)節(jié),資源管理模塊根據(jù)環(huán)境管理模塊定義的構(gòu)建環(huán)境屬性,包括OS 類型、構(gòu)建工具信息、靜態(tài)檢查工具信息以及其他配置信息,自動制作所需的構(gòu)建鏡像,并生成資源實(shí)例,然后構(gòu)建工程根據(jù)資源標(biāo)簽調(diào)度構(gòu)建資源,參與系統(tǒng)構(gòu)建。
資源監(jiān)控模塊負(fù)責(zé)構(gòu)建資源的指標(biāo)監(jiān)控,對異常資源及時發(fā)出告警通知,并進(jìn)行自愈或者重啟服務(wù),智能分析資源負(fù)載,動態(tài)擴(kuò)容。數(shù)據(jù)庫模塊負(fù)責(zé)構(gòu)建元數(shù)據(jù)的存儲,為后續(xù)的數(shù)據(jù)分析提供基礎(chǔ),以及為構(gòu)建環(huán)境和構(gòu)建工程恢復(fù)提供依據(jù)。
該多語言異構(gòu)環(huán)境持續(xù)集成系統(tǒng)整體工作流程如圖2所示。本DSLCI 系統(tǒng)的構(gòu)建環(huán)境使用代碼定義,實(shí)現(xiàn)基礎(chǔ)設(shè)施即代碼。構(gòu)建環(huán)境管理模塊主要包含Environment DSL Template、DSLEngine。
圖2: 環(huán)境DSL 建模和調(diào)度工作流程
系統(tǒng)中基于DSL 環(huán)境代碼化模型描述具備異構(gòu)資源的代碼化和動態(tài)調(diào)度、編排能力,可通過腳本靈活定義構(gòu)建依賴的資源,在構(gòu)建過程中動態(tài)的分配所需資源,提高資源復(fù)用的靈活性,減小資源配置的復(fù)雜度,從而實(shí)現(xiàn)基礎(chǔ)設(shè)施即代碼。構(gòu)建資源具備分布式部署、異地容災(zāi)、動態(tài)調(diào)度、自愈能力。同時構(gòu)建執(zhí)行環(huán)境容器化,實(shí)現(xiàn)構(gòu)建環(huán)境的高效部署。
使用Dockerfile 定義最小執(zhí)行環(huán)境的配置并生成鏡像,然后使用Environment DSL Template 定義異構(gòu)資源的編排依賴和鏡像的對應(yīng)關(guān)系,然后在Project DSL Template 中定義不同Stage 的不同Task 構(gòu)建任務(wù)的依賴執(zhí)行器Label,最終在多級流水線中各個Task 自適應(yīng)調(diào)度所需資源,自動擴(kuò)容自動銷毀。Environment DSL Template 負(fù)責(zé)對底層代碼化定義的執(zhí)行器進(jìn)行編排,并通過DSLEngine實(shí)例化構(gòu)建執(zhí)行器,執(zhí)行器主要包含Pipeline Master 和Slave Executor。Pipeline Master 負(fù)責(zé)整個任務(wù)的執(zhí)行調(diào)度和執(zhí)行器的動態(tài)調(diào)度,Master 也使用Dockerfile 定義,Master 對資源的硬件架構(gòu)無特殊要求,因?yàn)槠渲回?fù)責(zé)調(diào)度,并不執(zhí)行任何產(chǎn)品或者服務(wù)特性相關(guān)的編譯構(gòu)建。Slave Executor 是在構(gòu)建階段具體執(zhí)行編譯任務(wù)的實(shí)體環(huán)境,根據(jù)不同編譯Task 的需求匹配不同OS 和Hardware Architecture,因此需要定義的Dockerfile擴(kuò)展為Dockerfile-{OS}-{Hardware Architecture}。
如圖3 所示,通過代碼化定義整個構(gòu)建過程,保證構(gòu)建過程自動化執(zhí)行、構(gòu)建過程可追溯可回滾,同時工程代碼定義了軟件架構(gòu)層級的各個服務(wù)和模塊依賴關(guān)系,為構(gòu)建系統(tǒng)分布式執(zhí)行構(gòu)建任務(wù)提供了基本的能力。Project DSL Template 定義整體Pipeline 的各個Stage 的任務(wù)編排和執(zhí)行過程。
圖3: 代碼化定義構(gòu)建過程
圖4: 軟件模塊實(shí)現(xiàn)
DSLEngine 根 據(jù)Project DSL Template 的 定 義,生 成目標(biāo)構(gòu)建系統(tǒng)的DSL 描述文件。Dependency Analysis 負(fù)責(zé)各個服務(wù)或者組件的DAG 精準(zhǔn)依賴圖分析,并聯(lián)合MultilingualBuildEngine 生成目標(biāo)系統(tǒng)的分布式調(diào)度配置文件,同時為目標(biāo)系統(tǒng)提供多語言構(gòu)建框架調(diào)用入口。MultiCache 負(fù)責(zé)多語言多級緩存能力提供,實(shí)現(xiàn)構(gòu)建加速,提升整體系統(tǒng)運(yùn)行效率。
如4 所示,為持續(xù)集成系統(tǒng)軟件模塊實(shí)現(xiàn)圖。
ContinuousIntegrationSystem 定義了系統(tǒng)基本框架(DSLEngine)和實(shí)現(xiàn)代碼(Action),同時定義了一套可擴(kuò)展接口標(biāo)準(zhǔn)(API Standard Protocol),為用戶自定義擴(kuò)展提供了統(tǒng)一的接入標(biāo)準(zhǔn)。
ProjDSLExpand 是用戶自定義的工程代碼和DSL 模型,且滿足系統(tǒng)擴(kuò)展接口,可無縫接入持續(xù)集成系統(tǒng),擴(kuò)展系統(tǒng)標(biāo)準(zhǔn)功能,從而滿足不同用戶的構(gòu)建工程的定制化要求。
EnvDSLExpand 是用戶自定義的環(huán)境代碼和DSL 模型,且滿足系統(tǒng)擴(kuò)展接口,可無縫接入持續(xù)集成系統(tǒng),擴(kuò)展系統(tǒng)標(biāo)準(zhǔn)功能,從而滿足不同用戶的構(gòu)建環(huán)境的定制化要求。
openAPI 提供了外部系統(tǒng)調(diào)用DSLCI 的標(biāo)準(zhǔn)接口,實(shí)現(xiàn)系統(tǒng)的對外開放能力。
如圖5 所示,通過代碼化的描述,本系統(tǒng)可以自動實(shí)例化構(gòu)建執(zhí)行環(huán)境。Dockerfile 中定義了執(zhí)行器的基礎(chǔ)OS、構(gòu)建工具的安裝過程和軟件包選擇、輔助工具的安裝過程和安裝包選擇、環(huán)境變量和參數(shù)配置。EnvDSLTemplate 中定義了不同場景的異構(gòu)資源的代碼化編排。DSLEngine 根據(jù)EnvDSLTemplate 的異構(gòu)資源定義,自動路由選擇所需的Dockerfile,然后評估物理資源的配額和當(dāng)前資源利用率,資源配額不足或者利用率超過設(shè)定閾值,DSLEngine 自動觸發(fā)動態(tài)擴(kuò)容引擎,新的Node 自動掛載到構(gòu)建資源池中,并自動化部署Docker 依賴,為后續(xù)的DSLEngine 調(diào)度做好準(zhǔn)備。
圖5: 資源動態(tài)調(diào)度和擴(kuò)展算法
DSLEngine 評估資源充足時,自動拉取本地或者遠(yuǎn)端倉庫Docker image,本地和遠(yuǎn)端均不存在image 時,DSLEngine 自動觸發(fā)ImageBuildEngine 根據(jù)EnvDSLTemplate匹配的Dockerfile 構(gòu)建Docker 鏡像,并推送遠(yuǎn)端鏡像倉庫。Docker 鏡像就緒后,DSLEngine 觸發(fā)構(gòu)建執(zhí)行器實(shí)例批量生成。EnvEngine 負(fù)責(zé)整個構(gòu)建系統(tǒng)環(huán)境的代碼化定義、動態(tài)擴(kuò)容、鏡像管理、執(zhí)行器實(shí)例化。
該多語言異構(gòu)環(huán)境持續(xù)集成系統(tǒng)通過DynamicScheduler在Pipeline 執(zhí)行過程中的構(gòu)建環(huán)境的動態(tài)匹配和調(diào)度,在Task 啟動時分配資源,Task 結(jié)束時銷毀資源,在保障構(gòu)建任務(wù)順利執(zhí)行的前提下,實(shí)現(xiàn)了構(gòu)建資源的動態(tài)使用和銷毀,系統(tǒng)資源利用率提高。通過代碼化、配置化的環(huán)境、工程管理,使得異常情況工程和環(huán)境恢復(fù)效率提升。
通過資源的動態(tài)調(diào)度和基于組件邏輯的分布式構(gòu)建,軟件系統(tǒng)構(gòu)建過程的效率極大的提高。如圖6 所示的復(fù)雜軟件系統(tǒng)構(gòu)建邏輯圖,通過DynamicScheduler 優(yōu)化調(diào)度前后的資源利用率對比如圖7 所示,構(gòu)建時長從2.58 小時縮短到1.08小時,效率提升了138.5%,資源利用率從7.69%提升到了17.94%,利用率提高了133.3%。
圖6: 復(fù)雜軟件系統(tǒng)構(gòu)建邏輯
圖7: 復(fù)雜軟件系統(tǒng)構(gòu)建性能分析
本文提出的基于容器技術(shù)的持續(xù)化集成系統(tǒng)能夠應(yīng)對未來軟件開發(fā)的集成問題,實(shí)現(xiàn)編譯構(gòu)建環(huán)境代碼化、自動化部署。融合虛擬機(jī)、物理機(jī)、容器等多種構(gòu)建資源的能力,解決目前人為部署環(huán)境帶來的效率低、易出錯、不可重復(fù)、異常情況恢復(fù)時間長、系統(tǒng)可追溯能力差等缺點(diǎn)。同時該系統(tǒng)支持構(gòu)建工程代碼化,保證了構(gòu)建工程的版本化管理;支持構(gòu)建工程DSL 描述,保證了構(gòu)建工程的版本化管理、可追溯、免人工配置;支持研發(fā)人員云端分布式構(gòu)建,同時也支持本地快速構(gòu)建能力,提高軟件團(tuán)隊開發(fā)效率。