Docker 之 Jenkins自動化部署

ZACSNZ發表於2018-07-15

Docker搭建微服務自動部署 <架構探險之路>,讓我們來看看如何實現基於Docker的Jenkins自動化部署。


Docker 之 Jenkins自動化部署

構建思路

  • Docker 安裝jenkins,用來拉取程式碼自動更新
  • Docker 安裝gitlab,用來區域網或本地管理程式碼
  • Docker 安裝本地映象倉庫registry、docker-register-web
  • Spring Boot 開發程式碼後編寫Dokcerfile檔案
  • Spring Boot 利用docker的mvn外掛測試映象的生成和推送
  • 測試映象執行

映象的自動構建分兩種情況:

jenkins所在容器中已部署docker服務

直接在構建中利用shell指令碼完成Dokcerfile檔案的複製和執行,進而在jenkins所在容器內完成映象的構建
複製程式碼

jenkins所在容器中未部署docker服務

- jenkins中利用Docker外掛實現映象構建
- jenkins 全域性工具配置中安裝docker[自動安裝]
- 將jenkins部署在宿主機上,重複上述關聯步驟。gitlab可切換為github、gitee
複製程式碼

為了提升映象的自動構建速度,最終採用本地部署jenkins的方式,因為宿主機是有docker執行環境的。

Jenkins部署

jenkins環境 [相對版本較低]

docker pull jenkins

docker run -d -p 8002:8080 -v ~/jenkins:/var/jenkins_home --name jenkins --restart=always jenkins

檢視容器日誌

docker logs -f jenkins

檢視容器執行

docker ps
複製程式碼

輸入圖片說明
螢幕截圖.png

介面訪問`127.0.0.1:8080`,自動跳轉至登入介面
複製程式碼

輸入圖片說明
螢幕截圖.png

觀察日誌獲取初始密碼
複製程式碼

輸入圖片說明
螢幕截圖.png

jenkins安裝
複製程式碼

輸入圖片說明
螢幕截圖.png

訪問
admin:jenkins
複製程式碼

jenkinsci/jenkins [最新版本]

  • 映象

    docker pull jenkinsci/jenkins

  • 啟動

    docker run -d -p 8002:8080 -m 1024m -v ~/jenkins:/var/jenkins_home --name jenkins --restart=always jenkinsci/jenkins

  • 日誌

    docker logs -f jenkins

  • jenkis 繫結gitlab

    docker run -d -p 8002:8080 -m 1024m -v ~/jenkins:/var/jenkins_home --name jenkins --restart=always --link gitlab:gitlab.yiyuery.com jenkinsci/jenkins

  • maven構建專案

    gitlab's project 配置

    輸入圖片說明
    螢幕截圖.png

    此處ssh鑑權失敗需要生成key新增到gitlab中,和github一樣,例外,不能使用ssh,只能用http 點選Add,輸入賬戶root,密碼Abc23++,此為gitlab管理員賬號和訪問gitlab時設定的密碼

    構建後的maven命令配置

    輸入圖片說明
    螢幕截圖.png

    下方的為構建後的需要存檔的檔案配置 [Ant風格] pom.xml檔案對應工程目錄msa-api-hello/pom.xml

    構建結果

    輸入圖片說明
    螢幕截圖.png

    本地對映jenkins工作空間

輸入圖片說明
螢幕截圖.png

> 定時構建
複製程式碼

輸入圖片說明
螢幕截圖.png
表示每10分鐘執行一次,用H不用*,是為了降低同一時間執行多個構建所帶來的效能開銷,使用H可以將具體的構建時間進行Hash

  • shell指令碼自動化構建Docker映象

    可用環境變數

    輸入圖片說明
    螢幕截圖.png

# 定義變數
API_NAME="msa-api-hello"
API_VERSION="0.0.1"
API_PORT="8101"
IMAGE_NAME="127.0.0.1:5000/com.msa/$API_NAME:$BUILD_NUMBER"
CONTAINER_NAME=$API_NAME-$API_VERSION

# 進入target目錄並複製Dockerfile檔案
cd $WORKSPACE/target
cp classes/Dockerfile .

# 構建Docker映象
docker build -t $IMAGE_NAME .

# 推送Docker映象
docker push $IMAGE_NAME

# 刪除Docker容器
cid=$(docker ps | grep $CONTAINER_NAME |awk '{print $1}')
if [ x"$cid" != x ]
	then
   	docker rm -f $cid
fi

# 啟動Docker容器
docker run -d -p $API_PORT:8080 --name $CONTAINER_NAME $IMAGE_NAME

# 刪除Dockerfile檔案
rm -f Dockerfile

複製程式碼

輸入圖片說明
螢幕截圖.png

提升maven構建速度

maven clean install -Dmaven.test.skip=true 跨過測試類的執行

jenkins 無法通過shell指令碼進行docker映象的構建

輸入圖片說明
螢幕截圖.png

解決方案:

- 不使用任何Jenkins映象,宿主機安裝Jenkins [宿主機有Docker服務]
- 不使用官方Jenkins映象,自己構造帶有Docker服務的Jenkins映象
- Docker-in-Docker [DinD]
- Docker-outside-of-Docker [DooD]
- 使用Jenkins的Docker外掛
複製程式碼

自動構建併發布

考慮到本地筆記本開發環境,多個dokcer的執行效率本來就低,因此,為提高構建速度,下載war包後在本地tomcat中執行,需要對jenkins進行構建的話,啟動tomcat即可。

tomcat 部署專案

直接放在tomcat的webapp目錄下後在bin目錄下直接啟動也是可以的。此處主要是因為idea中開發演示專案,直接放在一起,方便管理。

輸入圖片說明
螢幕截圖.png

安裝maven外掛

不安裝外掛則無法構建maven專案,jenkins預設是不支援maven的

輸入圖片說明
螢幕截圖.png
輸入圖片說明
螢幕截圖.png

配置後拉取專案程式碼進行構建

輸入圖片說明
螢幕截圖.png

輸入圖片說明
螢幕截圖.png

tag使用的是構建次數作為版本標記

自動釋出

輸入圖片說明
螢幕截圖.png

  • 倉庫

輸入圖片說明
螢幕截圖.png

  • 執行

輸入圖片說明
螢幕截圖.png

備註:

  • 初次構建速度比較慢,後面由於映象快取、maven依賴的下載完成,構件速度會變快很多。
  • shell指令碼遇到問題請自行學習相關知識
  • 輕量級微服務的自動化釋出平臺,主要實現思路:Jenkins從GitLab中獲取原始碼,構建後生成docker映象,以Docker容器的方式進行釋出,此外,我還將生成的Docker映象推送到本地的Docker Registry,以供生產環境使用。如此,我們交付的不再是原始碼,而是Docker映象,這種方式更加簡單高效。

REFRENCES

  1. Jenkins Wiki
  2. Jenkins 安裝教程
  3. Jenkins 利用maven、git管理專案
  4. Jenkins與Docker相關的Plugin使用
  5. 宿主機安裝jenkins方案
  6. Shell菜鳥教程

相關文章