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
複製程式碼
介面訪問`127.0.0.1:8080`,自動跳轉至登入介面
複製程式碼
觀察日誌獲取初始密碼
複製程式碼
jenkins安裝
複製程式碼
訪問
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 配置
此處ssh鑑權失敗需要生成key新增到gitlab中,和github一樣,例外,不能使用ssh,只能用http 點選Add,輸入賬戶
root
,密碼Abc23++,此為gitlab管理員賬號和訪問gitlab時設定的密碼構建後的maven命令配置
下方的為構建後的需要存檔的檔案配置 [Ant風格]
pom.xml
檔案對應工程目錄msa-api-hello/pom.xml
構建結果
本地對映jenkins工作空間
> 定時構建
複製程式碼
表示每10分鐘執行一次,用H不用*,是為了降低同一時間執行多個構建所帶來的效能開銷,使用H可以將具體的構建時間進行Hash
-
shell指令碼自動化構建Docker映象
可用環境變數
# 定義變數
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
複製程式碼
提升maven構建速度
maven clean install -Dmaven.test.skip=true 跨過測試類的執行
jenkins 無法通過shell指令碼進行docker映象的構建
解決方案:
- 不使用任何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中開發演示專案,直接放在一起,方便管理。
安裝maven外掛
不安裝外掛則無法構建maven專案,jenkins預設是不支援maven的
配置後拉取專案程式碼進行構建
tag使用的是構建次數作為版本標記
自動釋出
- 倉庫
- 執行
備註:
- 初次構建速度比較慢,後面由於映象快取、maven依賴的下載完成,構件速度會變快很多。
- shell指令碼遇到問題請自行學習相關知識
- 輕量級微服務的自動化釋出平臺,主要實現思路:Jenkins從GitLab中獲取原始碼,構建後生成docker映象,以Docker容器的方式進行釋出,此外,我還將生成的Docker映象推送到本地的Docker Registry,以供生產環境使用。如此,我們交付的不再是原始碼,而是Docker映象,這種方式更加簡單高效。