王俊 牛亞運



摘? 要:DevOps是近年來興起的軟件開發理念,能夠有效提高開發效率與版本質量,持續集成與持續交付作為DevOps理念的最佳實踐,應用廣泛。本文結合流水線的理念,設計并實現了持續集成與持續交付平臺,通過觸發器匹配機制啟動流水線,自動執行流水線中各階段定義的任務,有效地支撐項目的快速迭代,提高了開發效率,保證軟件穩定、持續的構建和發布,實現了持續集成持續交付的全流程應用,為后續DevOps理念的研究及實踐提供了參考依據。
關鍵詞:DevOps;流水線;持續集成;持續交付
中圖分類號:TP31? ? ?文獻標識碼:A
Abstract:DevOps is a software development concept that has emerged in recent years.It can effectively improve development efficiency and version quality.Continuous integration and continuous delivery are the best practices of the DevOps concept,which are widely used.This paper combines the concept of the pipeline to design and implement continuous integration and continuous delivery platform.The trigger matching mechanism is used to start the pipeline and automatically execute the tasks defined in each stage of the pipeline.This design effectively supports the rapid iteration of the project,improves the development efficiency,ensures the stable and continuous construction and release of the software,and realizes the continuous integration and continuous delivery of the whole process application,which provides a reference for the research and practice of the subsequent DevOps concepts.
Keywords:DevOps;pipeline;continuous integration;continuous delivery
1? ?引言(Introduction)
DevOps是一組過程、方法與系統的統稱,用于促進軟件開發、技術運營和質量保障(QA)部門之間的溝通、協作與整合[1],其核心是持續集成與持續交付。在持續集成中,團隊成員頻繁集成工作成果,每人每天至少集成一次也可多次,每次集成經過自動構建的檢驗,以求在最短的時間內發現集成錯誤[2,3]。持續交付的核心思想則是通過創建可重復、可靠的操作過程,將軟件從概念變為現實[4]。持續交付流水線的搭建使得持續交付本身成為可能,將軟件交付的過程分成不同階段,每個階段旨在從不同的角度驗證新特性的質量以確認新功能,防止可能發生的失誤給用戶造成的不良影響[5]。持續集成與持續交付繼承了優秀的DevOps開發理念,成為未來軟件工程重要的組成部分。
2? 持續集成與持續交付平臺需求分析(Demand analysis of continuous integration and continuous delivery platform)
軟件項目的目標是開發出可運行、客戶滿意的軟件系統。傳統開發存在Bug總是在最后才出現、越到項目后期問題越難解決、軟件交付時機無法保障、程序經常需要變更等問題,影響項目的管理和開發效率,為解決上述問題,持續集成與持續交付平臺需要實現在開發人員提交代碼后,開發人員相互評審,評審通過后,服務器自動更新代碼,編譯,運行單元測試、功能測試、集成測試,進行部署。軟件開發人員通過觀察流水線,清楚的了解開發中每個階段的任務狀態,快速發現并解決問題(編譯失敗、測試失敗等),減小系統發生錯誤、不能在用戶環境中運行、系統集成時涌現大量問題的風險。從而使整個的項目進度完全掌握,提高項目質量,保證項目的持續穩定交付。
3? 持續集成與持續交付平臺設計概要(Design of continuous integration and continuous delivery platform)
3.1? ?持續集成持續交付平臺的核心功能設計
為構建需求分析中完整的軟件開發流水線,實現持續集成、自動化測試、包管理等流水線軟件產品的交付過程,持續集成與持續交付平臺設計包含四大模塊:(1)入口配置模塊;(2)流水線配置模塊;(3)觸發器匹配模塊;(4)流程編排模塊。圖1為觸發器的核心功能模塊示意圖。
3.2? ?持續集成與持續交付平臺運行過程
持續集成與持續交付平臺采用微服務的架構方式,包含三個服務,分別是主服務、流程處理服務和通知服務,其中主服務中包含入口配置模塊和流水線配置模塊,流程處理服務包含觸發器匹配模塊和流程編排模塊,服務之間采用集成RestTemplate的方式互相調用對外暴露的接口,通過集成RabblitMQ消息隊列的方式進行通信,保證了流水線運行期間各個階段中任務的有序執行;通知服務作為輔助服務實現了從流水線開始執行到結束執行各個階段執行狀態的通知功能。用戶首先根據入口配置規則填寫入口驗證信息,驗證是否能與第三平臺進行可靠對接,之后配置流水線信息,流水線配置信息完成后,點擊觸發按鈕,此時主服務通過postEvent(Event event)方法向流程處理服務發送啟動事件,流程處理服務接收到HTTP請求之后,對傳入的流水線配置信息進行數據轉換,轉換為流程編排模塊可以處理的數據格式,流程處理服務中的啟動流程監聽器監聽到啟動消息后,流程編排引擎開始執行流水線中定義的任務,最后任務執行結束后,結束流程監聽器監聽到消息后將會結束流水線執行。如圖2所示為持續集成與持續交付平臺運行時序圖。
4? 持續集成與持續交付平臺核心功能實現(Core function implementation)
4.1? ?入口配置模塊的實現
持續集成與持續交付平臺具備完成流水線完整功能的能力,必須要具備代碼管理與審閱功能、構建和測試功能,以及包管理等功能,因此平臺需要支持無縫對接第三方平臺,為此持續集成持續交付平臺設計了入口配置模塊。選用Gitlab作為代碼管理與評審平臺,GitLab是由GitLabInc.開發,使用MIT許可證的基于網絡的Git倉庫管理工具,使用Gitlab可以完美的實現不同操作人員協同開發、互相評審的功能。選用Jenkins作為包構建和測試工具,Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具,主要用于持續、自動的構建/測試軟件項目、監控外部任務的運行。具有易用性高、易配置支持插件等特點。選用Nexus作為包管理平臺,Nexus是一個強大的maven倉庫管理器,它極大地簡化了本地內部倉庫的維護和外部倉庫的訪問,利用私服代理外部倉庫,消除了對外的重復構件下載,降低帶寬的壓力,是一套開箱即用的系統,如表1所示,入口配置模塊中提供了對接GitLab、Jenkins、Nexus入口并進行驗證的方式。
以對接Nexus包管理平臺為例,用戶在前端頁面填寫入口配置信息后,信息被保存到了入口配置模型(Endpoint)中,后臺控制層接收到前端發送的POST請求后,調用NexusConnectTest(Endpoint endpoint)方法,方法內部利用Spring框架提供的RestTemplate將入口配置模型中保存的用戶名、密碼、Nexus倉庫地址等信息封裝成一個HTTP請求并發送到Nexus服務器,Nexus服務器接收到HTTP請求后進行解析驗證是否認證成功,根據認證結果返回不同的響應碼,進而根據響應碼來判斷對接Nexus包管理平臺是否成功。如下為對接驗證Nexus包管理平臺的部分代碼實現:
4.2? ?流水線配置模塊
持續集成持續交付平臺的流水線配置模塊中提供了定義完整流水線的功能,其定義的內容包括主要包含四部分:(1)流水線配置信息,包括流水線的名稱、階段、觸發器等。一條流水線相當于一次構建任務,里面可以包含多個流程,比如自動構建、自動進行單元測試、自動進行代碼檢查等流程等。(2)階段配置信息,包括每個階段的名稱、標識、階段的構建時間、執行時間、狀態等。階段就是上面提到的流程,可以在一條流水線中定義多個階段,所有階段會按照順序運行,即當一個階段完成后,下一個階段才會開始,只有當所有階段成功完成后,該構建任務(流水線)才算執行成功,如果任何一個階段失敗,后面的就不會執行,該構建任務(流水線)失敗。(3)任務配置信息,包括任務名稱、任務所屬的階段、執行時間、上下文環境等。任務表示某個階段里面執行的工作,一個階段里面可以定義多個任務,在相同階段中的任務可以并行執行也可以串行執行,執行相同階段中的任務都執行成功時,該階段才會成功,如果任何一個任務失敗,那么該階段就失敗,即該條流水線失敗。(4)觸發器相關信息,包括觸發器的類型和名稱。流水線中可以定義多個觸發器并且支持多種觸發類型,通過觸發匹配機制接收觸發消息啟動流水線。為了遵循數據庫設計的三范式要求,在保證三范式要求的前提下盡量保證松耦合,流水線配置模塊中定義的信息分為流水線配置信息表,如表2所示;階段配置信息表,如表3所示;任務配置信息表,如表4所示。
4.3? ?觸發器匹配模塊
持續集成與持續交付平臺支持手工觸發、定時觸發、事件驅動三種觸發方式,手工觸發通過點擊前端展示的觸發按鈕調用startPipeline(String id, PipelineTrigger trigger)方法啟動流水線;定時觸發通過定時任務線程輪詢觸發任務狀態并根據上下文信息啟動流水線;事件觸發包括Gitlab代碼變更消息觸發、Jenkins構建消息觸發、Nexus包管理平臺包更新觸發。不同的觸發方式設置了不同的觸發匹配機制。以事件觸發為例,Jenkins構建消息觸發流水線執行,當Jenkins服務器上發生一次構建的時候,持續集成與持續交付平臺主服務中的輪詢任務接收到構建信息后,通過rabbitMQ消息隊列將該消息發送到流水線處理服務中的指定隊列中,隊列接收消息后執行onJenkinsBuildComplete(String message)方法,該方法根據消息中包含的Endpoint入口信息和指定的job調用matchJenkinsTrigger(endPointID,jobName)方法匹配觸發器,最后進入流程編排模塊完成流水線中定義的各個階段任務。如下為接收Jenkins構建消息觸發的代碼實現:
4.4? ?流程編排模塊
流程編排模塊用于執行流水線階段中定義的各項任務,是持續集成持續交付流水線的核心所在,本文選用開源的Flowable流程引擎作為實現流程編排模塊的實現基礎,Flowable是一個使用Jave編寫的輕量級業務流程引擎,使用Apache V2 license協議開源,其以JAR形式發布使得Flowable可以輕易加入任何Java環境:Java SE、Tomcat、Jetty或Spring之類的servlet容器;JBoss或WebSphere之類的Java EE服務器等。默認情況下,Flowable引擎的執行文件是bpmn文件,文件中包含事件、順序流、網關、任務、子流程要素,在Flowable流程引擎執行流水線之前,需要預先將流水線配置模塊中定義的流水線信息轉換為bpmn文件。Flowable流程引擎對外提供了org.flowable.engine.delegate.JavaDelegate接口及其execute方法,持續集成與持續交付平臺通過實現JavaDelegate接口并且為不同任務重寫不同的execute方法完成流水線中定義的各種任務。如下所示為重寫execute方法執行Jenkins任務的部分代碼實現:
5? ?結論(Conclusion)
本文基于軟件開發的實際環境,設計并實現了持續集成持續交付平臺,提供了可視化、可定制、自動觸發的持續交付流水線,流水線中支持編譯構建、代碼檢查、自動化測試、部署、流水線控制等多種類型的任務,用戶可以根據需求定義各種任務,流水線階段中的任務支持串行執行與并行執行,支持了多種業務場景,流水線支持手工觸發和自動觸發,實現了流水線的自動化執行通過配置流水線的方式完成軟件開發集成與交付過程,極大地縮短了從開發、集成、測試、部署各個環節的時間,減少了重復性勞動,提高了產品質量,加快了開發效率。本文設計的持續集成與持續交付平臺,完整的支撐了生產環境中軟件開發的各種需求,為其他用戶或者研發團隊搭建持續集成與持續交付平臺提供了設計參考依據,推動了DevOps理念的落地與實踐。
參考文獻(References)
[1] Haiqin WU,Liangmin WANG,Tao JIANG.Secure and efficient k-nearest neighbor query for location-based services in outsourced environments[J].Science China(Information Sciences),2018,61(03):231-233.
[2] Mengual L,Marba?n O,Eibe S.Clustering-based location in wireless networks[J].Expert Systems with Applications,2010,37(9):6165-6175.
[3] Ying Hu.Study on the key algorithms and framework design of intelligent campus education platform based on big data technology[J].Technical Bulletin,2017(15):63-69.
[4] Jia Yanmei.Construction and application of intelligent campus in colleges and Uuniversities under the background of big data[C].Advances in Intelligent Systems and Computing,2019:866-872.
[5] 陳敏,楊陽.基于Docker下DevOps系統的設計與實現研究[J].信息與電腦(理論版),2019(11):97-98;101.
作者簡介:
王? 俊(1993-),男,碩士生.研究領域:智能制造,軟件開發.
牛亞運(1991-),男,碩士生.研究領域:軟件開發.