夏蕓
(卡斯柯信號有限公司上海測試部 上海市 200070)
持續(xù)交付(Continuous delivery,縮寫為 CD),是一種軟件工程手法,讓軟件產(chǎn)品的產(chǎn)出過程在一個短周期內(nèi)完成,以保證軟件可以穩(wěn)定、持續(xù)的保持在隨時可以發(fā)布的狀況。它的目標在于讓軟件的構(gòu)建、測試與發(fā)布變得更快以及更頻繁。這種方式可以減少軟件開發(fā)的成本與時間,減少風險。[1]
城市軌道交通的列車自動監(jiān)控(ATS, Automatic Train Supervision)子系統(tǒng),是城市軌道交通信號系統(tǒng)的重要組成,ATS 通過對列車運行監(jiān)視、自動排列進路、自動列車調(diào)整、自動生成時刻表、自動記錄和統(tǒng)計運行數(shù)據(jù)并生產(chǎn)報表、自動檢測設備運行狀態(tài)等實現(xiàn)對列車運行的監(jiān)視和控制,輔助調(diào)度員對全線列車進行管理。[2]隨著軌道交通行業(yè)的不斷發(fā)展,ATS 軟件的功能越來越多,越來越復雜,同時為了更快的響應用戶需求,ATS 軟件快速迭代更新的難度也越來越大,因此,為了更好的應對市場和用戶需求,迫切的需求構(gòu)建快速、持續(xù)、高效的ATS 軟件持續(xù)交付系統(tǒng)。
本文介紹了ATS 軟件持續(xù)交付系統(tǒng)的設計,以及系統(tǒng)的實現(xiàn),最后介紹了持續(xù)交付系統(tǒng)的應用情況。
軟件從開發(fā)到交付用戶,要進過一系列的流程,包括代碼提交到配置庫,代碼編譯、測試(單元測試、集成測試、功能測試),當室內(nèi)測試通過后,將軟件部署到現(xiàn)場。在當前階段,ATS 持續(xù)交付系統(tǒng)的目標是實現(xiàn)“準交付版本”交付流程的高效和自動化?!皽式桓栋姹尽奔词强山桓队脩羰褂玫陌姹?。
持續(xù)交付指軟件從版本控制庫到用戶手中這一過程的自動化表現(xiàn)形式。[3]為了實現(xiàn)上述流程的自動化和高效,持續(xù)交付系統(tǒng)的設計原則包括如下幾點:
(1)實現(xiàn)軟件交付流程的自動化,尤其是構(gòu)建、部署、測試流程的自動化;
(2)將交付流程腳本化,并由配置庫進行版本管理,包括構(gòu)建、部署、測試;
(3)交付流程的可視化,同時某個步驟的失敗能及時的反饋。
持續(xù)交付系統(tǒng)的核心流水線如圖1 所示,流水線的這幾個核心階段即為持續(xù)交付系統(tǒng)的主要功能,另外持續(xù)交付系統(tǒng)還需實現(xiàn)流水線管理功能,完整的系統(tǒng)功能如下:
(1)流水線管理,實現(xiàn)流水線的創(chuàng)建、配置、可視化、度量反饋,以及將其它系統(tǒng)統(tǒng)計集成到流水線;
(2)版本控制,實現(xiàn)ATS 源代碼、測試平臺代碼、流水線腳本、文檔等的版本管理;
(3)自動部署,實現(xiàn)ATS 軟件和測試平臺的自動部署,以及測試環(huán)境所需虛擬機的創(chuàng)建,網(wǎng)絡配置等;
(4)自動化測試,實現(xiàn)ATS 軟件的自動化測試,包括接口測試、功能測試和性能測試;
(5)版本發(fā)布,實現(xiàn)“準發(fā)布版本”的打包,包括軟件和配置、以及生成發(fā)布單。
DevOps 通常是指軟件行業(yè)新興的專業(yè)化運動,是一組文化、流程與工具整合后的統(tǒng)。DevOps 通過自動化流程來使得軟件構(gòu)建、測試、發(fā)布更加快捷、頻繁和可靠。[4]持續(xù)交付是 DevOps 的核心工程實踐,貫穿軟件開發(fā)全生命周期。實現(xiàn)了健全的版本控制系統(tǒng)、基于主干開發(fā)、自動化構(gòu)建、自動化測試、自動化部署、每天多次集成和組織級度量等能力,都對軟件開發(fā)產(chǎn)生正面的影響。[5]
因此,在ATS 持續(xù)交付系統(tǒng)的實現(xiàn)策略上,采取了DevOps 生態(tài)工具、商用工具、以及自研工具相結(jié)合的方式。
在本文的持續(xù)交付系統(tǒng)的實現(xiàn)中,采用Jenkins 作為持續(xù)集成服務器,采取Gitlab 作為版本控制系統(tǒng),采用Coverity 進行代碼度量和檢查,基于Ansible 實現(xiàn)自動部署,采用自研的測試平臺實現(xiàn)自動化測試和手工測試,系統(tǒng)架構(gòu)如圖2 所示。
圖1:持續(xù)交付系統(tǒng)核心流水線
表1
圖2:系統(tǒng)架構(gòu)圖
圖3:持續(xù)交付工作流
Docker 是一個開源的應用容器引擎,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux 機器或Windows 機器上,也可以實現(xiàn)虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。[6]基于Docker 容器技術,實現(xiàn)本持續(xù)交付系統(tǒng)的優(yōu)勢在于以下幾點:
(2)易于快速的自動部署,持續(xù)交付工具鏈中的一系列工具如Jenkins、Gitlab、g++/gcc 等,均可已標準鏡像的方式直接存儲在容器倉庫中。
(3)快速且節(jié)省硬件資源,與傳統(tǒng)的虛擬機相比,輕量容器技術Docke 是系統(tǒng)級的虛擬化而不是傳統(tǒng)的硬件虛擬化,因此具有更快的運行速度,啟動速度達到了秒級,另外也能極大的節(jié)省服務器的硬件資源,在一臺普通的服務器上同時運行成百上千個Docker容器。
Jenkins 是一個開源的持續(xù)集成工具,并支持分布式的部署,Jenkins 在整個持續(xù)交付系統(tǒng)的實現(xiàn)中,起到了至關重要的作用。當源代碼發(fā)生變更,并提交到Gitlab 版本庫,Jenkins 將自動觸發(fā)核心流水線(圖1 所示),并在此過程中Jenkins 通過插件集成編譯工具鏈、靜態(tài)代碼掃描工具完成準發(fā)布版本的構(gòu)建。若準發(fā)布版本構(gòu)建成功,Jenkins 會自動觸發(fā)自動部署流水線,進行ATS 軟件,測試環(huán)境的部署,此時會根據(jù)測試需求,同時部署多套測試環(huán)境,同步進行自動化的接口測試、功能測試、性能測試,若上述測試通過,則進入手工測試階段,若手工測試也通過,則自動生成發(fā)布單,以及將“準發(fā)布版本”打版本標簽。
對于本文的ATS 持續(xù)系統(tǒng)而言,測試環(huán)節(jié)是實現(xiàn)快速、高效交付的主要障礙,其原因在于:
(1)測試環(huán)境部署,基于現(xiàn)場實際設備和運營數(shù)據(jù),自動部署整個仿真測試環(huán)境,包括:ATS 被測系統(tǒng)和軟件,聯(lián)鎖CI 仿真,線路控制器LC 仿真、區(qū)域控制器ZC 仿真、車載控制器CC 仿真、軌道線路和信號設備仿真、測試平臺和測試數(shù)據(jù),以及整個網(wǎng)絡環(huán)境的配置。
(2)自動化測試,自動化測試的一般思路為,在測試用例中描述測試數(shù)據(jù)和輸入條件,各種仿真設備的操作,獲取被測對象的輸出后與預期結(jié)果進行對比,獲得測試結(jié)果。由于ATS 測試中涉及到眾多的仿真設備和復雜的操作序列,大量需分析的ATS 輸出日志,故其自動化測試存在一定的難度。
本文持續(xù)交付系統(tǒng)針對上述難點,采取自研的方式,開發(fā)了ATS 自動化測試平臺,基于Jenkins 的插件來實現(xiàn)與持續(xù)交付系統(tǒng)集成,其主要功能如下:
(1)模擬ATS 運行所需的各個外部模擬器(如ZC,CI 等模擬設備),并根據(jù)測試人員設計的測試腳本模擬出相應的場景運行,模擬圖形工作站(GPC)實現(xiàn)ATS 的界面操作的腳本化。
(2)全程記錄ATS 界面上的所有控件的狀態(tài)以及ATS 與外部設備的所有接口消息內(nèi)容。
其時的士人對山水的迷戀可以說到了癡迷的地步,竹林七賢“登山臨水,竟日忘歸”,宗炳“每游山水,往輒忘歸”,袁崧欣賞“山水之美也……流連往宿,不覺忘返”。類似于這樣的記錄還有很多。在這種社會思潮背景下,只有山水和游山水的人使人感興趣,其他諸如節(jié)操倫常、忠臣義士等不為人所重。宗炳“眷戀廬衡,契闊荊巫”,當“老疾俱至”時,唯恐“名山恐難遍游”,于是“凡所游歷,皆圖之于壁,坐臥向之”。這反映出人們不僅喜愛山水,更欲將山水畫于紙上,以便能時時賞之。至此,繪畫的主題也隨之從先前的人物向山水轉(zhuǎn)移。
(3)根據(jù)測試人員編寫出分析腳本,分析記錄數(shù)據(jù),實現(xiàn)結(jié)果的自動判定,并生成響應的測試報告。
本文的持續(xù)交付系統(tǒng)基于Jenkins 為核心,實現(xiàn)的持續(xù)交付工作流如圖3 所示。開發(fā)人員提交代碼后,Jenkins 自動觸發(fā)后續(xù)的流程,并將每一步驟執(zhí)行的狀態(tài)反饋給開發(fā)和測試人員。另外,測試平臺的代碼也維護在Gitlab 代碼庫中,同樣也配置了持續(xù)集成流水線,完成測試平臺的構(gòu)建和測試平臺自身的測試工作。
本文的持續(xù)交付系統(tǒng)經(jīng)過了3 個多月的試用,從實踐的效果看,在以下幾方面有所提升。
表1 是近期平均一次完整的“準發(fā)布版本”交付流程的周期和成本的對比情況。交付周期縮短了27%,人力成本減少了29%。開發(fā)效率的提升主要在于,當前具有一致的開發(fā)和測試環(huán)境,且開發(fā)和測試環(huán)境可以快速的多套部署,大大減少了環(huán)境不一致和環(huán)境緊張而產(chǎn)生的時間成本。測試效率的提升主要在于,自動化測試的投入,縮短了周期且降低了人工成本。
持續(xù)交付的理念是內(nèi)建質(zhì)量,軟件質(zhì)量由整個團隊負責,盡早的發(fā)現(xiàn)缺陷并盡早修復。本文的持續(xù)交付系統(tǒng),通過標準化和自動化的手段,針對每一次代碼的變更,進行驗證和缺陷的快速反饋。從近期的使用效果看,代碼質(zhì)量有了一定程度的提升。
本文將DevOps 生態(tài)工具鏈和自研自動化測試平臺相結(jié)合,實現(xiàn)了適用于ATS 軟件的持續(xù)交付系統(tǒng)。該系統(tǒng)能有效的提升開發(fā)、測試團隊之間的協(xié)作效率,提升代碼質(zhì)量,降低開發(fā)成本。在下一步的研究中,計劃將本持續(xù)交付系統(tǒng)與公司私有云結(jié)合,構(gòu)建“端到端” 交付流水線,貫穿從用戶需求到最終的版本發(fā)布,實現(xiàn)持續(xù)交付全流程的可視化管理,持續(xù)度量改進交付流程。