1. 程式人生 > >基於Jenkins+docker實現一鍵式部署

基於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:企業服務管理系統,包含容器的部署,執行,監控。

主體流程圖:

640?wx_fmt=png

用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任務總圖:

640?wx_fmt=png

如下是基於生產環境jenkins的任務總圖:

640?wx_fmt=png

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的程式碼路徑

640?wx_fmt=png

3) 設定-工作流-環境,設定雲CI路徑

640?wx_fmt=png

4)點選新增工作流,設計新的流水線工作

640?wx_fmt=png

實踐中可以分為測試環境的流水線 和 正式環境的流水線。

如下圖為測試環境的流水線:

640?wx_fmt=png

這裡分為兩個流水線,上面並行的為個人構建,通過程式碼提交構建,另外是定時部署。

效果評價

本實踐講述了目前IT應用在自動化構建部署中出現的問題,描述了在基於Jenkins 和 docker容器技術下,如何搭建自動化構建環境的步驟。解決了在搭建過程中出現的若干常見問題,將為各專案組的DevOps自動化提供指導和參考意義。

正式環境的結果:

640?wx_fmt=png