1. 使用Jenkins來實現微服務架構下的自動化部署!
在微服務架構中,隨著專案拆分越來越細,導致服務越來越多,服務的打包部署就會成為一個相當麻煩的事情。在我之前工作的公司都是本地打包好,上傳到伺服器上,再建立指令碼執行,這樣產生的問題就是服務累積越多,部署越耗大量的人力和時間,那有沒有什麼辦法讓我們部署一次之後,只要點選執行就可以自動部署呢?當然有!下面我們使用Jenkins來完成一個微服務架構中的自動化一體化部署工作。
1.1 環境準備
參考我上一篇部落格:Jenkins+Docker+Gitlab+Harbor部署環境搭建 本次使用到環境有:
軟體 | 版本 | 描述 |
---|---|---|
Docker | 19.03.8 | 最近熱火的容器技術,實現服務隔離 |
Docker-compose | latest | 容器編排工具 |
Harbor | 1.10.1 | 私有映象倉庫服務Harbor |
Jenkins | latest | Jenkins是開源CI&CD軟體領導者, 提供超過1000個外掛來支援構建、部署、自動化, 滿足任何專案的需要 |
Gitlab | latest | GitLab 是一個用於倉庫管理系統的開源專案,使用Git作為程式碼管理工具 |
1.2 部署架構圖

2 Jenkins自動化部署spring boot專案
2.1 程式碼上傳到Gitlab


上傳至程式碼倉庫之後,開始進行jenkins建立任務

2.2 構建jenkins任務
- 建立任務

- 新增gitlab專案

- 增加構建步驟,呼叫頂層maven目標

- 配置maven環境

注意,如果專案是聚合專案,構建專案中的依賴模組,否則當構建可執行的服務模組時會因為無法找到這些模組而構建失敗

# 只package admin,core,web三個模組
mvn clean package -pl core,web,admin -am
複製程式碼

- 使用額外指令碼檔案完成maven打包後的自動推送到harbor映象倉庫並啟動新容器釋出專案

#!/usr/bin/env bash
# 初始化核心引數
# jenkins任務名
task_name='test'
# jar包名稱
app_name='-test'
# 釋出版本
version='latest'
# harbor映象倉庫域名地址
harbor_registry='www.example.com'
# 映象倉庫
image_prefix='test'
# maven構建版本
maven_version='0.0.1-SNAPSHOT'
# 初始埠
INIT_EXPOSE=8086
# 對外服務埠
EXPOSE=8086
# jenkins任務構建原路徑
jenkins_jar_path='/usr/local/docker/jenkins/jenkins_home/workspace/'${task_name}
# 構建映象路徑
projects_path='/usr/local/projects/'
# 停止刪除容器
docker stop ${app_name}
echo 'stop container '${app_name}' success!'
docker rm ${app_name}
echo 'delete container '${app_name}' success!'
# 複製jar包到指定目錄
# 注意:單體maven不需要加${app_name},聚合專案需要加入${app_name}
cp ${jenkins_jar_path}${app_name}/target/${app_name}-${maven_version}.jar ${projects_path}${app_name}/
cp ${jenkins_jar_path}${app_name}/src/docker/Dockerfile ${projects_path}${app_name}/
# 構建推送映象
docker login --username=zhouxinlei --password=Zxl298828 https://${harbor_registry}
docker build -t ${image_prefix}/${app_name}:${maven_version} -f ${projects_path}${app_name}/Dockerfile ${projects_path}${app_name}/.
docker tag ${image_prefix}/${app_name}:${maven_version} ${harbor_registry}/${image_prefix}/${app_name}:${version}
docker push ${harbor_registry}/${image_prefix}/${app_name}:${version}
docker rmi `docker images|grep none | awk '{print $3}'`
docker rmi ${image_prefix}/${app_name}:${maven_version}
# 執行容器
docker run -p ${EXPOSE}:${INIT_EXPOSE} --name ${app_name} -v /etc/localtime:/etc/localtime -v ${projects_path}${app_name}/logs:/var/logs -d ${harbor_registry}/${image_prefix}/${app_name}:${version}
echo 'run container '${app_name}' success!'
複製程式碼
- 點選儲存,完成test 的執行任務建立。
2.3 執行jenkins任務

- 可以在控制檯檢視maven構建步驟

- 如下圖所示,表示構建釋出spring boot專案成功



- 檢視容器執行狀況

2.4 訪問專案介面

3 總結
我們通過在Jenkins中建立任務,完成了微服務架構中服務的打包部署工作,這樣當我們每次修改完程式碼後,只需點選啟動任務,就可以實現一鍵打包部署,省去了頻繁打包部署的麻煩。
部分參考:MacroZheng
我個人部落格網址,歡迎大家來觀看個人部落格
