蔡永健 路云菲 鄔遠(yuǎn)祥 唐海濤
摘? 要: 隨著信息技術(shù)飛速發(fā)展,工程項(xiàng)目發(fā)展多元化,工程數(shù)字化管理系統(tǒng)日趨復(fù)雜,系統(tǒng)軟件更新迭代日益頻繁,而傳統(tǒng)人工手動部署軟件會耗費(fèi)大量人力成本。為了提高軟件研發(fā)及交付效率,文章基于持續(xù)集成引擎Jenkins和容器引擎Docker提出一種自動化部署的解決方案,并在數(shù)字化智能電站系統(tǒng)上應(yīng)用,在其系統(tǒng)軟件研發(fā)交付過程中實(shí)現(xiàn)開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境的快速自動化部署,對于提高軟件研發(fā)效率和項(xiàng)目按時(shí)履約具有重要的推進(jìn)作用。
關(guān)鍵詞: Jenkins; Docker; 容器化; 自動化部署
中圖分類號:TP399? ? ? ? ? 文獻(xiàn)標(biāo)識碼:A? ? 文章編號:1006-8228(2020)02-77-04
Research and application of technologies of Jenkins and Docker container in
automatic deployment of digital power station
Cai Yongjian1,2, Lu Yunfei1,2, Wu Yuanxiang1,2,3,4, Tang Haitao1,2,3
(1.Powerchina Huadong Engineering Corporation Limited, Hangzhou, Zhejiang 311122, China;
2.Zhejiang Huadong Engineering Digital Technology Co., Ltd.;
3.Digital City CIM Technology Zhejiang Engineering Research Center; 4.Zhejiang Engineering Digital Research Center)
Abstract: With the rapid development of information technology, diversified engineering projects, engineering digital management systems are becoming more and more complex, and system software update iterations are becoming more frequent. Traditional manual deployment of software will take up a lot of labor costs. In order to improve software R&D and delivery efficiency, this paper uses continuous integration engine Jenkins and container engine Docker to propose an automated deployment solution and apply it on the digital intelligent power plant system to realize rapid and automatic deployment of the development environment, test environment and production environment during the system software development and delivery process, which plays an important role in promoting software R&D efficiency and guaranteeing project performance on time.
Key words: Jenkins; Docker; containerization; automatic deployment
0 引言
隨著軟件系統(tǒng)功能邏輯復(fù)雜化、更新頻繁化的發(fā)展進(jìn)程,手動部署的方式可能導(dǎo)致交付滯后的問題,自動化部署技術(shù)應(yīng)運(yùn)而生,并已經(jīng)成為絕大多數(shù)公司軟件研發(fā)的標(biāo)準(zhǔn)配置。我們公司的主要產(chǎn)品為工程數(shù)字化管理軟件,采用Jenkins和Docker技術(shù)完成自動化部署任務(wù)。Docker容器化技術(shù)[1]具有輕量化、跨平臺、消除線上線下環(huán)境差異等特性;持續(xù)集成引擎Jenkins[2]具備開源、易上手、插件豐富等優(yōu)勢,這兩者結(jié)合提供了一種高效的自動化部署解決方案。
數(shù)字化抽水蓄能電站是水電工程運(yùn)維期管理系統(tǒng),由于水電站建設(shè)周期長、參與單位多等特點(diǎn),其管理系統(tǒng)具有功能高度復(fù)雜化、開發(fā)迭代頻率高的特征,基于Jenkins+Docker容器技術(shù)的自動化[3]部署方案在很大程度上提高了其研發(fā)的效率,為項(xiàng)目履約提供了技術(shù)保障,同時(shí),也為公司能夠快速搶占市場份額提供了重要的技術(shù)支撐。
1 Docker 簡介
1.1 Docker的概念
Docker使用Google公司推出的Go語言開發(fā)實(shí)現(xiàn),基于Linux內(nèi)核的Cgroup和Namespace,以及AUFS類的UnionFS等技術(shù),對進(jìn)程做封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進(jìn)程獨(dú)立于宿主和其它進(jìn)程,因此稱為容器[4]。Docker在容器的基礎(chǔ)上進(jìn)一步封裝,從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離,極大地簡化了容器的創(chuàng)建和維護(hù),使得Docker技術(shù)比虛擬機(jī)技術(shù)更為輕便和快捷。
1.2 Docker的優(yōu)勢
⑴ 更高效的利用系統(tǒng)資源
相比于傳統(tǒng)虛擬化技術(shù),由于Docker容器不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開銷,Docker對系統(tǒng)資源的利用率更高,無論是應(yīng)用執(zhí)行速度、內(nèi)存損耗或者文件存儲速度,都要比傳統(tǒng)虛擬機(jī)技術(shù)更高效。因此,一個(gè)相同配置的主機(jī),往往可以運(yùn)行更多數(shù)量的應(yīng)用。
⑵ 更快速的啟動速度
傳統(tǒng)虛擬機(jī)技術(shù)啟動服務(wù)往往需要數(shù)分鐘,而Docker容器直接運(yùn)行于宿主機(jī)內(nèi)核,無需啟動完整的操作系統(tǒng),因此可以做到秒級甚至是毫秒級的啟動速度,可以達(dá)到用戶無感知的平滑升級。大大地節(jié)約了開發(fā)、測試、部署的時(shí)間。
⑶ 一致的運(yùn)行環(huán)境
軟件開發(fā)過程中一個(gè)常見的問題是環(huán)境一致性問題。由于開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境的不一致,導(dǎo)致有些bug并未在開發(fā)過程中被發(fā)現(xiàn)。而Docker的鏡像提供了除內(nèi)核外完整的運(yùn)行時(shí)環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境的一致性,從而不會再出現(xiàn)“這段代碼在我機(jī)器上沒有問題”此類問題。
⑷ 遷移更高效
由于Docker確保了執(zhí)行環(huán)境的一致性,使得應(yīng)用的遷移更加容易。Docker可以在很多平臺上運(yùn)行,無論是物理機(jī)、虛擬機(jī)、公有云、私有云,其運(yùn)行結(jié)果是一致的。因此用戶可以很輕易的將一個(gè)平臺運(yùn)行的服務(wù),遷移到另一個(gè)平臺上,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運(yùn)行的情況發(fā)生。
⑸ 維護(hù)和擴(kuò)展更輕松
Docker的分層存儲技術(shù),使得鏡像重復(fù)部分的復(fù)用更為容易,也使得鏡像的維護(hù)更新更加簡單,基于基礎(chǔ)鏡像進(jìn)一步擴(kuò)展也變得更加容易。此外,Docker團(tuán)隊(duì)同各個(gè)開源項(xiàng)目團(tuán)隊(duì)一起維護(hù)了一大批高質(zhì)量的官方鏡像,既可以在生產(chǎn)環(huán)境使用,又可以作為基礎(chǔ)進(jìn)一步定制,大大地降低了應(yīng)用服務(wù)的鏡像制作成本[5]。
2 Jenkins簡介
2.1 Jenkins的概念
Jenkins是基于Java開發(fā)的一種可擴(kuò)展的開源持續(xù)集成引擎,用于監(jiān)控持續(xù)重復(fù)的工作,是業(yè)內(nèi)比較常用的軟件自動化工具之一。
持續(xù)集成是在開發(fā)階段對項(xiàng)目進(jìn)行持續(xù)性自動化編譯、測試,以達(dá)到控制代碼質(zhì)量的目的。其具備即時(shí)發(fā)現(xiàn)問題,追蹤問題、修復(fù)問題的機(jī)制,改變了在所有代碼編寫完成后才提交給QA部門的傳統(tǒng)方法。每次集成都通過自動化的構(gòu)建來驗(yàn)證,及早發(fā)現(xiàn)集成錯(cuò)誤,在研發(fā)過程中可極大減少集成導(dǎo)致的問題。
2.2 Jenkins的優(yōu)勢
⑴ 跨平臺
支持幾乎所有的平臺,可在Windows,Ubuntu/Debian,RedHat/Fedora/CentOS,MacOSX等常見的操作系統(tǒng)下運(yùn)行。
⑵ 易于配置
Jenkins可以通過友好的webGUI輕松設(shè)置和配置,其中包括即時(shí)錯(cuò)誤檢查和內(nèi)置幫助。不需要手動編輯xml配置文件,雖然Jenkins也支持手動修改xml配置文件。
⑶ 插件豐富
Jenkins擁有數(shù)以千計(jì)的插件,幾乎集成了所有自動化相關(guān)的工具,由于Jenkins可以通過插件架構(gòu)進(jìn)行擴(kuò)展,為其提供了無限可能。在項(xiàng)目構(gòu)建后,Jenkins也提供了郵件反饋形式,可以將構(gòu)建結(jié)果及時(shí)告知相關(guān)人員。
3 自動化部署方案
3.1 環(huán)境搭建
自動化部署硬件環(huán)境包含一臺Jenkins持續(xù)集成服務(wù)器、一臺DockerRegistry 私有鏡像倉庫服務(wù)器、一臺GitLab代碼倉庫服務(wù)器和多臺應(yīng)用服務(wù)器,應(yīng)確保在整個(gè)網(wǎng)絡(luò)中Jenkins服務(wù)器可以訪問其他服務(wù)器,應(yīng)用服務(wù)器能直接訪問Docker Registry服務(wù)器。其次,Jenkins服務(wù)器需要安裝Docker容器引擎軟件并實(shí)現(xiàn)登錄Docker Registry認(rèn)證。
3.2 工作原理
開發(fā)人員在Gitlab服務(wù)器創(chuàng)建一個(gè)Project,確定各部署環(huán)境對應(yīng)分支并將Jenkins服務(wù)器的SSH key加入到GitLab的SSHKey管理中心,確保Jenkins有權(quán)限訪問GitLab并可獲取代碼。在Jenkins中配置相關(guān)的參數(shù):如BuildTriggers中輪詢GitLab分支的間隔時(shí)間、SSH remote hosts中的SSH sites遠(yuǎn)程服務(wù)器登錄配置、Extended E-mail Notification 中的參數(shù)等,保證自動化部署流程的實(shí)現(xiàn)。
Jenkins服務(wù)器每個(gè)任務(wù)都會根據(jù)Build Triggers中的配置定時(shí)輪詢GitLab代碼分支,當(dāng)檢測到GitLab分支上有代碼變動時(shí)就會觸發(fā)一系列的動作:自動拉取代碼、編譯代碼、構(gòu)建鏡像、上傳鏡像至鏡像倉庫。構(gòu)建完成后再調(diào)用遠(yuǎn)程服務(wù)器的腳本完成軟件更新,最后調(diào)用郵件功能,將結(jié)果發(fā)送給研發(fā)人員和項(xiàng)目負(fù)責(zé)人,主流程如下圖1所示。
4 自動化部署實(shí)踐
4.1 項(xiàng)目描述
數(shù)字化抽水蓄能電站管理系統(tǒng)是水電站全生命周期的項(xiàng)目管理系統(tǒng),通過收集實(shí)體電站全過程管理數(shù)據(jù),采用三維可視化技術(shù),實(shí)現(xiàn)物理電站和虛擬電站在全過程管理數(shù)據(jù)的一一對應(yīng),實(shí)現(xiàn)“一站式”電站的工程管理、資產(chǎn)管理、生產(chǎn)管理、安全管理、運(yùn)檢管理、資料管理等功能,為管理層的決策提供技術(shù)支持,保證電站的安全、優(yōu)質(zhì)、經(jīng)濟(jì)運(yùn)行,提高企業(yè)效益[6]。
4.2 項(xiàng)目實(shí)踐
項(xiàng)目采用前后端分離的方式開發(fā),前端采用Facebook和Instagram開源的React框架,后端使用微服務(wù)架構(gòu),采用Java和Python兩種語言,前后端采用Restful API接口進(jìn)行數(shù)據(jù)交互。
對于Python應(yīng)用,在Jenkins中配置shell腳本,利用自定義的Dockerfile文件將代碼及其運(yùn)行所需環(huán)境封裝到Docker鏡像中,上傳至Docker Registry,調(diào)用SSH插件功能執(zhí)行遠(yuǎn)程服務(wù)器上的更新腳本,下載最新鏡像,利用docker-compose容器編排工具完成迭代。
對于Java應(yīng)用,Jenkins會調(diào)用Maven工具將代碼編譯打包成Jar包,通過SCP命令上傳至應(yīng)用服務(wù)器,調(diào)用Java鏡像啟動容器執(zhí)行java-jar命令完成軟件更新。
前端代碼使用Nodejs編譯成靜態(tài)的文件,采用Nginx托管,Jenkins將源代碼下載到本地并通過Node鏡像啟動容器將代碼編譯成可部署的靜態(tài)文件,將編譯后的代碼推送到遠(yuǎn)端Nginx服務(wù)器完成部署。最后將構(gòu)建結(jié)果通過E-mail發(fā)送至開發(fā)人員和研發(fā)負(fù)責(zé)人。在更新的過程中,Jenkins也會根據(jù)配置執(zhí)行代碼掃描和單元測試,執(zhí)行結(jié)果如圖2和圖3所示。
軟件研發(fā)過程中使用不同的分支管理不同環(huán)境的源代碼,開發(fā)人員將代碼提交到dev分支上,Jenkins輪詢機(jī)制會檢測到COMMITID變更而觸發(fā)構(gòu)建,執(zhí)行特定的腳本完成軟件更新,期間自動執(zhí)行單元測試并反饋運(yùn)行結(jié)果。自測通過后合并代碼到test分支,jenkins完成自動化部署到測試環(huán)境,QA團(tuán)隊(duì)開始測試工作。
數(shù)字化抽水蓄能電站系統(tǒng)一共有15個(gè)功能模塊,每個(gè)模塊平均構(gòu)建300次,人工部署時(shí),更新一次需要大概5-10分鐘,如果操作錯(cuò)誤則花費(fèi)更長時(shí)間。而自動化部署每次構(gòu)建平均只耗時(shí)1分30秒,并保證每次更新的一致性,減少了因人為失誤導(dǎo)致的更新滯后問題,部署結(jié)果如圖4所示。根據(jù)以上數(shù)據(jù)粗略估算,自動化部署技術(shù)為該項(xiàng)目運(yùn)維節(jié)省時(shí)長可達(dá)600小時(shí),而且,Docker鏡像也保證了各服務(wù)器上運(yùn)行環(huán)境的一致性,加快項(xiàng)目研發(fā)進(jìn)度,節(jié)約人力資源。
5 結(jié)束語
本文重點(diǎn)介紹了基于Jenkins和Docker容器技術(shù)在軟件研發(fā)過程中自動化部署的實(shí)現(xiàn)方案,并概述了在數(shù)字化抽水蓄能電站項(xiàng)目上的實(shí)踐情況?;谝陨险撌隹煽闯觯摷夹g(shù)對項(xiàng)目持續(xù)集成、持續(xù)交付方面有很大的提升作用,在很大程度上減少了開發(fā)、測試、運(yùn)維部門由于系統(tǒng)環(huán)境差異引起的矛盾,為項(xiàng)目履約提供了技術(shù)保障。同時(shí),也可以為公司DevOps[7]發(fā)展提供理論依據(jù)和實(shí)踐成果,能在一定程度上為微服務(wù)架構(gòu)[8]項(xiàng)目在私有云、公有云自動化部署積累寶貴的經(jīng)驗(yàn);更為公司今后實(shí)現(xiàn)自動化運(yùn)維計(jì)劃提供了寶貴的經(jīng)驗(yàn)。
參考文獻(xiàn)(References):
[1] James Turnbull.《第一本Docker書》.人民郵電出版社 2014-12[1-15]
[2] 周瑩,歐中紅,李俊.基于Jenkins的持續(xù)集成自動部署研究[J].計(jì)算機(jī)與數(shù)字工程,2016.2.
[3] 楊洪嬌.基于Docker的高校網(wǎng)站自動部署應(yīng)用[J].無線互聯(lián)科技,2017.
[4] 蔡志強(qiáng).基于Docker技術(shù)的容器隔離性分析[J].電子世界,2017.
[5] 劉國樂,余彥峰.淺析Docker容器技術(shù)[J].保密科學(xué)技術(shù),2017.10.
[6] 錢玉蓮,王金峰,王國光,鄧新星.數(shù)字化設(shè)計(jì)在仙居抽水蓄能電站中的應(yīng)用[J].2018.2.
[7] 黃璜,張賀,邵棟.自動化工具對中國DevOps實(shí)踐的影響[J].軟件學(xué)報(bào).
[8] 王方旭.基于Spring Cloud和Docker的微服務(wù)架構(gòu)設(shè)計(jì)[J].中國信息化,2018.3.