基於Jenkins+docker實現一鍵式部署
摘要】
本實踐介紹了利用Jenkins 和docker技術,如何實現CI/CD的各環節的步驟,包括環境準備,程式碼提交,編譯程式,構建映象,部署,測試。
一套完整的流程,和今日元宵佳節的圓月甚是應景,希望大家能有所收穫。
【關鍵詞】
Docker、映象、Jenkins、持續整合、自動化部署、CI、CD、ESM
【類別】
軟體的小分類:架構相關
研發支援的小分類:軟體設計
技術背景
術語介紹:
ESM: 企業服務管理系統
Rancher: 容器管理和服務編排工具
Compose: 服務編排
問題提出
一個全新的系統,開發測試所需要處理的事情大概有:申請測試機器、編碼實現、部署測試、整合等,而其中申請測試機器和部署測試是兩個最耗時且低技術含量的操作。那如何簡化整個流程,使開發人員一提交程式碼後,就能快速將應用部署到一臺伺服器上,以提高專案的開發效率?
測試環境和正式環境,由於兩者環境的不同,比如作業系統、中介軟體版本、環境變數、安裝路徑等等,導致洩露到正式環境的bug通常是由於這種原因引起,那如何儘可能保證這兩個環境的一致性,以提高專案的質量?
解決思路
基於docker容器技術的自動化部署就是福音。
不需要申請測試機器,可以在雲端自動生成構建機,在構建機裡自動生成應用包,再在docker主機上將生成的應用包構建成映象,然後在雲平臺中啟動容器即可。
整個流程需要用到如下的工具:
git:原始碼版本管理工具
DevOps:提供的pipline工具,通過pipline規範整個構建和部署的各個階段
Jenkins:自動構建任務,通過任務生成對應的映象檔案和war包
製品庫:儲存對應的製品,如war包,jar等
映象庫:存放映象的倉庫
Esm:企業服務管理系統,包含容器的部署,執行,監控。
主體流程圖:
用Jenkins來做節點控制、版本管理、流程設定、觸發Job,用Docker容器來搭建編譯部署環境。把這一切連線起來的就是流程指令碼和Dockerfile。
實踐情況
1. 環境準備
1) 申請如下環境所需的賬號和許可權
雲CI環境
製品庫環境
程式碼評審環境
Devops環境
用來構建war包的映象庫
2) 搭建構建應用映象的主機環境(各專案組自己提供)
生成應用映象的docker主機
必須滿足如下條件:
redhat-7.2; 安裝docker1.9.1以上;安裝git;安裝 Jenkins slave端(後面會介紹此節)。搭建用來執行容器的docker主機(各專案組自己提供)
環境要求: redhat 7.2; 安裝docker1.9.1以上;
此主機用來掛在 esm環境上。 專案組將此主機的ip地址等資訊發給 XXX專案組,以便將此主機新增到esm的環境中。
3) 本實踐還涉及到的其它環境
ESM測試環境
ESM 正式環境
應用映象庫環境
Gitlab正式環境
Gitlab測試環境
2. 在docker主機上製作構建基礎映象
編寫dockerfile
由於各個專案組的構建的環境都不一樣,因此需要由專案組製作一個自己的構建基礎映象。其中,xx專案中構建的基礎映象為xxbuildmodel:v2.0
生成構建映象
Push映象到docker映象庫
3. jenkins任務配置
總體分為a”開發環境的任務” 和 b”生產環境環境”的任務。
1) 開發環境將按步驟新建如下的jenkins任務:
個人構建
程式碼評審
專案構建
專案部署
自動化測試
2) 生產環境將按如下步驟建立jenkins任務:
生成映象
停止服務
專案部署
如下為以xx為例的基於開發環境的jenkins任務總圖:
如下是基於生產環境的jenkins的任務總圖:
a. 開發環境
個人構建:
通過程式碼提交觸發(程式碼提交比較頻繁的程式碼流,可以採用定時觸發的方式進行),目的是確定構建的成功性,在jenkins上配置個人構建任務需要注意如下幾點:
任務執行機器,由於是雲CI,這裡需要限制任務只在mesos上執行,mesos是預設的掛載在jenkins的節點,mesos上有對應的docker環境,能夠建立映象、上傳映象和上傳製品庫。
Git依賴庫,程式碼在git上對應的ssh地址,以及認證
執行構建指令碼
程式碼評審:程式碼提交後,程式碼經過評審,評審通過後才能併入主分支。包含如下:
程式碼提交: 程式碼通過開發人員提交到git
程式碼評審:登入gerrit,my->changes,檢視產生的評審單,然後進行打分。
專案構建:
整體邏輯與個人構建相似,區別在於專案構建有產出,會輸出對應的構建war包。
定時觸發或者是程式碼評審通過後觸發,拉取最新主分支的程式碼,實現主分支上的編譯打包,應用包再上傳到對應制品庫。
任務執行機器:同個人構建
Git庫:個人構建對比,構建的流改成master
構建環境:需要申請對應的製品庫空間,對應的申請流程可以訪問wiki,填寫申請資訊,提交即可
執行構建指令碼:同個人構建執行構建指令碼
專案部署:
從製品庫中拉取對應的war包,執行dockerfile檔案生成對應的映象包,並且部署到esm系統,具體分為測試環境專案部署 和 正式環境專案部署。
任務執行機器:xx專案自己對應的docker主機,為環境準備 e) 中所對應的主機。
此主機可以在jenkins-->nodes路徑,如下介面進行新增(在docker主機上安裝jenkins slave端)(補充說明:如以後映象庫使用中開社的映象庫,則此docker主機也可以使用雲CI中的主機)
Git庫:和原始碼的git是區分出來的,這裡只配置配置項的git庫。
執行shell指令碼
自動化測試:
根據專案部署的esm環境,獲取系統的url,執行測試指令碼,實現自動化測試獲取測試結果,大概的部署過程同上面的各個過程,需要注意的是由於現在雲測試資源的問題,無法申請到對應資源,當前都是通過掛載節點的形式來執行測試指令碼,測試部署在esm上的服務。
b. 生產環境
生產環境比測試環境簡單得多,主要是對映象重新打標籤,然後部署到ESM的生產環境。
生成映象:
主要是生成生產環境的配置檔案映象,對在開發環境生成的應用映象重新打標籤。
停止服務:
停止部署在esm裡面容器的服務。
專案部署:
將應用部署到生產環境。
4. 搭建pipline流水線
1) 登入http://dxx.xxx.com.cn/devops/ 建立專案
注意:pipeline建立了專案目前必須通知pipeline專案組重啟服務,否則無法觸發流水線,後續修復。
2) 設定-功能設定 設定gerrit的程式碼路徑
3) 設定-工作流-環境,設定雲CI路徑
4)點選新增工作流,設計新的流水線工作
實踐中可以分為測試環境的流水線 和 正式環境的流水線。
如下圖為測試環境的流水線:
這裡分為兩個流水線,上面並行的為個人構建,通過程式碼提交構建,另外是定時部署。
效果評價
本實踐講述了目前IT應用在自動化構建部署中出現的問題,描述了在基於Jenkins 和 docker容器技術下,如何搭建自動化構建環境的步驟。解決了在搭建過程中出現的若干常見問題,將為各專案組的DevOps自動化提供指導和參考意義。
正式環境的結果: