唐松強(qiáng) 蔡永健 唐海濤 朱夏良 何栓康
摘? 要: 隨著信息技術(shù)的飛速發(fā)展和軟件研發(fā)框架的不斷升級(jí),傳統(tǒng)研發(fā)中開發(fā)、運(yùn)維、QA之間的溝通協(xié)作愈加困難。DevOps作為新軟件研發(fā)管理理念,其通過促進(jìn)開發(fā)、運(yùn)維、QA協(xié)同工作的模式,得到了越來越多IT企業(yè)的關(guān)注和使用。文章基于DevOps理念,對(duì)其在需求管理、研發(fā)過程、運(yùn)維管理三個(gè)階段的技術(shù)路線進(jìn)行研究,并通過JIRA、Jenkins、Zabbix等工具將DevOps系統(tǒng)落地。在具體項(xiàng)目實(shí)踐中,保障了項(xiàng)目研發(fā)進(jìn)度,提升了系統(tǒng)健壯性,實(shí)現(xiàn)公司產(chǎn)品研發(fā)的提質(zhì)增效。
關(guān)鍵詞: DevOps; 持續(xù)交付; 持續(xù)監(jiān)控; 自動(dòng)化部署; 研發(fā)管理
中圖分類號(hào):TP399? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ?文章編號(hào):1006-8228(2021)04-13-05
Abstract: With the rapid development of information technology and the continuous upgrading of software R&D frameworks, the communication and cooperation between development, operation and maintenance and QA in traditional R&D becomes more and more difficult. DevOps, as a new concept for software R&D management, its mode of promoting development, operation and QA collaborative work has been paid attention to and been used by more and more IT companies. Based on the concept of DevOps, this paper studies the technical route of DevOps in the three stages of demand management, R&D process and operation and maintenance management, and put it into effect by using JIRA, Jenkins, ZABBIX and other tools, which ensures the progress of project research and development, improves the robustness of the system, and improves the R&D quality and efficiency of company's product in the specific project practice.
Key words: DevOps; continuous delivery; continuous monitoring; automated deployment; research and development management
0 引言
為提高企業(yè)產(chǎn)品快速交付能力,軟件行業(yè)提出DevOps的理念。DevOps[1]通過促進(jìn)開發(fā)、運(yùn)維和QA之間的溝通、協(xié)作和整合,實(shí)現(xiàn)軟件產(chǎn)品持續(xù)部署和交付,幫助企業(yè)提質(zhì)增效。中國(guó)電建集團(tuán)華東勘測(cè)設(shè)計(jì)研究院有限公司近幾年不斷地對(duì)DevOps進(jìn)行探索優(yōu)化,目前已有大量項(xiàng)目使用DevOps進(jìn)行軟件研發(fā),為公司的持續(xù)發(fā)展提供了強(qiáng)有力的支撐。
1 DevOps簡(jiǎn)介
1.1 DevOps概念
DevOps是一個(gè)體系,是一組過程、方法與系統(tǒng)的統(tǒng)稱,用于促進(jìn)開發(fā)、技術(shù)運(yùn)營(yíng)和質(zhì)量保障部門之間的溝通、協(xié)作與整合,其示意圖如圖1所示。
1.2 DevOps優(yōu)勢(shì)
⑴ 加強(qiáng)部門合作
DevOps強(qiáng)調(diào)開發(fā)、運(yùn)維的溝通合作,通過自動(dòng)化的流程來使得構(gòu)建、測(cè)試、發(fā)布軟件能夠更加地快捷、頻繁和可靠。
⑵ 縮短產(chǎn)品上市時(shí)間
DevOps可以在產(chǎn)品規(guī)劃到實(shí)現(xiàn)的整個(gè)過程中具有更好的質(zhì)量保障,確保產(chǎn)品和公司業(yè)務(wù)目標(biāo)的一致性,從而縮短產(chǎn)品上市周期。
⑶ 產(chǎn)品迭代時(shí)間更短
DevOps使用持續(xù)部署和交付[2]的方式進(jìn)行軟件交付,可盡早地識(shí)別并消除瓶頸,從而保障企業(yè)實(shí)現(xiàn)每天多次交付而不是每年多次發(fā)布軟件版本。
⑷ 提升自動(dòng)化能力
DevOps具有明確定義的工作流,將大量重復(fù)性任務(wù)通過自動(dòng)化的方式實(shí)現(xiàn),減少了人為錯(cuò)誤的幾率,這使得產(chǎn)品的安全性和合規(guī)性要求更加容易得到保障。
⑸ 減少資源浪費(fèi)
DevOps持續(xù)集成和交付的方式,讓企業(yè)可以更有效地利用資源,并削減企業(yè)成本。
2 DevOps技術(shù)路線
2.1 研發(fā)流程技術(shù)路線
研發(fā)流程技術(shù)路線,主要通過JIRA[3]實(shí)現(xiàn)對(duì)需求和研發(fā)任務(wù)的可視化管理。例如對(duì)于同一個(gè)需求而言,其研發(fā)測(cè)試任務(wù)之間普遍存在相互依賴關(guān)系,采用父子任務(wù)以及任務(wù)狀態(tài)的強(qiáng)校驗(yàn)形式對(duì)此類任務(wù)進(jìn)行管理,在前期需求分析時(shí)創(chuàng)建任務(wù),若子任務(wù)沒有完成,作為父任務(wù)的需求工單將無法提交發(fā)布,從而避免因模塊間依賴關(guān)系而導(dǎo)致的發(fā)布質(zhì)量問題。
對(duì)于不同項(xiàng)目的不同情況,JIRA的工作流和界面制定都是靈活的。項(xiàng)目經(jīng)理可以在JIRA中定制出適合本公司或者本項(xiàng)目的流程,各實(shí)施人也可以在切身使用過程中提出優(yōu)化建議,實(shí)現(xiàn)流程的不斷改進(jìn)。
2.2 自動(dòng)化部署技術(shù)路線
基于Jenkins+GitLab+Docker+Harbor+SonarQube+Kubernetes[4]實(shí)現(xiàn)軟件自動(dòng)化集成和部署,如圖2所示。
在該技術(shù)路線下,Java開發(fā)工程師在完成某個(gè)功能編碼后,將代碼推送到源代碼倉庫GitLab,通過Webhook觸發(fā)Jenkins自動(dòng)化地拉取最新代碼,然后觸發(fā)SonarQube靜態(tài)代碼掃描[5],掃描通過后執(zhí)行相應(yīng)的編譯命令,比如java的maven命令或者是python的pip命令下載依賴后編譯打包,通過Dockerfile封裝成Docker鏡像并上傳到Harbor鏡像倉庫,最后執(zhí)行腳本自動(dòng)更新到開發(fā)環(huán)境的Kubernetes集群。
2.3 自動(dòng)化運(yùn)維技術(shù)路線
基于Zabbix[6]+Prometheus[7]+Email的方式實(shí)現(xiàn)服務(wù)的監(jiān)控和反饋,如圖3所示。基于Zabbix集群實(shí)現(xiàn)服務(wù)器集群的CPU負(fù)載、內(nèi)存占用、磁盤I/O、網(wǎng)絡(luò)狀態(tài)、端口、日志等監(jiān)控,并預(yù)設(shè)好閾值,當(dāng)資源使用達(dá)到了臨界值時(shí)會(huì)通過Email發(fā)送告警郵件,通知相關(guān)責(zé)任人及時(shí)處理問題?;赑rometheus實(shí)現(xiàn)對(duì)服務(wù)的監(jiān)控,當(dāng)系統(tǒng)服務(wù)出現(xiàn)或者即將出現(xiàn)故障時(shí),通過Email將告警信息反饋給管理員,實(shí)現(xiàn)對(duì)問題的快速處理,避免對(duì)業(yè)務(wù)造成影響。當(dāng)問題發(fā)生后需要對(duì)問題進(jìn)行調(diào)查和處理時(shí),通過對(duì)監(jiān)控歷史數(shù)據(jù)進(jìn)行分析,可以找到并解決問題的根源。結(jié)合Grafana可直觀地顯示系統(tǒng)運(yùn)行狀態(tài)、資源使用情況,以及服務(wù)運(yùn)行狀態(tài)等信息。
3 DevOps實(shí)踐
3.1 項(xiàng)目描述
工程數(shù)據(jù)中心軟件開發(fā)項(xiàng)目的目標(biāo)是圍繞工程數(shù)據(jù)管理標(biāo)準(zhǔn)體系,實(shí)現(xiàn)工程數(shù)據(jù)全生命周期的信息化管理,并能基于系統(tǒng)中保存的海量數(shù)據(jù)開展工程數(shù)據(jù)的挖掘分析工作,提煉數(shù)據(jù)價(jià)值,用數(shù)據(jù)驅(qū)動(dòng)項(xiàng)目建設(shè)和公司業(yè)務(wù)發(fā)展,從一個(gè)全新維度為工程企業(yè)決策提供支撐。
該項(xiàng)目使用SpringCloud微服務(wù)框架[6]編寫,技術(shù)架構(gòu)分為5層,如圖4所示,分別是:
⑴ 基礎(chǔ)設(shè)施層,該層以虛擬化、云計(jì)算、容器平臺(tái)等技術(shù)提供按需獲取、按需調(diào)度的計(jì)算、存儲(chǔ)及網(wǎng)絡(luò)資源;
⑵ 數(shù)據(jù)層,該層主要包括Redis分布式緩存、Minio等對(duì)象存儲(chǔ)、Mysql關(guān)系型數(shù)據(jù)庫、ArangoDB圖數(shù)據(jù)庫以及PostgreSQL+PostGIS空間數(shù)據(jù)庫;
⑶ 服務(wù)層,該層基于微服務(wù)架構(gòu),根據(jù)功能需要設(shè)計(jì)分為多個(gè)微服務(wù)并應(yīng)用不同類型的數(shù)據(jù)庫,利用Nacos進(jìn)行統(tǒng)一的服務(wù)注冊(cè)和發(fā)現(xiàn);
⑷ 網(wǎng)關(guān)層,用APIGateway進(jìn)行通信的管理,將內(nèi)部或外部請(qǐng)求分發(fā)至對(duì)應(yīng)服務(wù);
⑸ 應(yīng)用層,提供標(biāo)準(zhǔn)的RESTful API,支持桌面應(yīng)用、瀏覽器等多終端。
3.2 研發(fā)流程管理實(shí)踐
工程數(shù)據(jù)中心項(xiàng)目創(chuàng)新性高,理論體系未完善,導(dǎo)致局部需求定義欠佳,在執(zhí)行過程中,需求不斷變化,有時(shí)還會(huì)添加額外的需求。項(xiàng)目組借助于JIRA實(shí)現(xiàn)了需求和研發(fā)任務(wù)的可視化管理,如圖5所示。得益于Sprint,使得項(xiàng)目團(tuán)隊(duì)可以在短周期內(nèi)將離散和潛在可交付的應(yīng)用程序進(jìn)行沖刺上線,可及時(shí)解決項(xiàng)目臨時(shí)的或緊急的需求。
3.3 自動(dòng)化部署實(shí)踐
借助于Jenkins+GitLab+Docker+Harbor+SonarQube[7]+Kubernetes的技術(shù)路線,工程數(shù)據(jù)中心項(xiàng)目組實(shí)現(xiàn)了自動(dòng)化部署。開發(fā)人員在編碼結(jié)束后將最新代碼推送到部署的分支,通過Gitlab中的webhook觸發(fā)任務(wù),將最新commit的代碼推送到Jenkins中。Jenkins首先會(huì)對(duì)最近c(diǎn)ommit的源代碼進(jìn)行靜態(tài)掃描,掃描結(jié)果如圖6所示。掃描沒有問題之后調(diào)用預(yù)先設(shè)置好的腳本編譯打包,根據(jù)Dockerfile封裝生成Docker鏡像。最后調(diào)用遠(yuǎn)程腳本部署到Kubernetes平臺(tái)。
3.4 自動(dòng)化運(yùn)維實(shí)踐
工程數(shù)據(jù)中心上線運(yùn)行后,由于用戶數(shù)量增漲、文件數(shù)據(jù)量增加、代碼迭代頻率增快等原因,系統(tǒng)時(shí)常出現(xiàn)各種報(bào)錯(cuò)。項(xiàng)目組借助Zabbix集群的Agent完美地解決了多服務(wù)器集群底層運(yùn)維監(jiān)控的問題,實(shí)現(xiàn)磁盤、CPU、內(nèi)存的實(shí)時(shí)使用監(jiān)控,當(dāng)?shù)竭_(dá)預(yù)設(shè)的臨界值之后會(huì)觸發(fā)告警,其在Web頁面的監(jiān)視圖如圖7所示。
另外,工程數(shù)據(jù)中心采用微服務(wù)架構(gòu)編寫,各微服務(wù)的健康檢查以及網(wǎng)絡(luò)連通性都需要監(jiān)控,借助于Prometheus和Grafana可以實(shí)現(xiàn)對(duì)服務(wù)、數(shù)據(jù)庫的監(jiān)控和告警,其可視化頁面如圖8所示,Email告警通知如圖9所示。
4 結(jié)束語
本文重點(diǎn)介紹了DevOps概念、優(yōu)勢(shì)以及實(shí)現(xiàn)的技術(shù)路線,最后結(jié)合工程數(shù)據(jù)中心項(xiàng)目描述DevOps落地應(yīng)用情況。可以看到,DevOps不僅極大的提高了需求管理的準(zhǔn)確性,減少了開發(fā)和運(yùn)維的溝通成本,提升了軟件系統(tǒng)的健壯性,實(shí)現(xiàn)了研發(fā)過程管理提質(zhì)增效,最終從多個(gè)方面完善了公司的研發(fā)體系。
參考文獻(xiàn)(References):
[1] 榮國(guó)平,白曉穎,岳濤.面向DevOps的軟件工程新技術(shù)專題前言[J].軟件學(xué)報(bào),2019.10.
[2] 張文林.持續(xù)交付及其在大型項(xiàng)目中的應(yīng)用[J].軟件導(dǎo)刊,2017.10.
[3] 王敏,賈百強(qiáng),李翔,李小軍.基于JIRA的全生命周期軟件開發(fā)管理平臺(tái)[J].上海船舶運(yùn)輸科學(xué)研究所學(xué)報(bào),2017.2.
[4] 蔡永健,路云菲,鄔遠(yuǎn)祥,唐海濤.基于Jenkins和Docker容器技術(shù)在數(shù)字化電站項(xiàng)目自動(dòng)化部署的研究和應(yīng)用[J].計(jì)算機(jī)時(shí)代,2020.2.
[5] 付金瑩,蔣云,王金倫,申宗杰.基于靜態(tài)分析的應(yīng)用代碼質(zhì)量管理體系研究及應(yīng)用[J].中國(guó)新通信,2013.21.
[6] 石宇婷.基于Zabbix平臺(tái)的私有云監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].東華大學(xué),2017.
[7] 馬永,吳躍,何李囡,程航.基于Prometheus的基礎(chǔ)軟硬件全鏈路監(jiān)控設(shè)計(jì)和實(shí)現(xiàn)[J].電子技術(shù)與軟件工程,2020.1.