Docker 之 Jenkins自動化部署


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


Docker 之 Jenkins自動化部署

構建思路linux

  • Docker 安裝jenkins,用來拉取代碼自動更新
  • Docker 安裝gitlab,用來局域網或本地管理代碼
  • Docker 安裝本地鏡像倉庫registry、docker-register-web
  • Spring Boot 開發代碼後編寫Dokcerfile文件
  • Spring Boot 利用docker的mvn插件測試鏡像的生成和推送
  • 測試鏡像運行

鏡像的自動構建分兩種狀況:git

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

直接在構建中利用shell腳本完成Dokcerfile文件的複製和執行,進而在jenkins所在容器內完成鏡像的構建
複製代碼

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

- jenkins中利用Docker插件實現鏡像構建
- jenkins 全局工具配置中安裝docker[自動安裝]
- 將jenkins部署在宿主機上,重複上述關聯步驟。gitlab可切換爲github、gitee
複製代碼

爲了提高鏡像的自動構建速度,最終採用本地部署jenkins的方式,由於宿主機是有docker運行環境的。docker

Jenkins部署

jenkins環境 [相對版本較低]shell

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 [最新版本]api

  • 鏡像緩存

    docker pull jenkinsci/jenkinstomcat

  • 啓動

    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菜鳥教程
相關文章
相關標籤/搜索