本文演示如何通過Jenkins創建CI/CD任務,部署一整套微服務體系結構,並運行在之前搭建的mini雲平台上。
如果是初始嘗試實踐,可能需要參考 快速搭建雲原生架構的實踐環境 和 Jhipster技術實踐 等相關文章。
1 整體規划
1.1 拓撲架構
1.2 基礎設置
編號 | IP | OS | 主機名 | 角色 | 環境 | 說明 |
---|---|---|---|---|---|---|
A | 192.168.1.101 | CentOS7.4 | ddc_node01 | Manager | Global | 運行UCP和Jenkins的節點 |
B | 192.168.1.102 | CentOS7.4 | ddc_node02 | Worker | Global | 運行DTR的節點 |
C | 192.168.1.103 | CentOS7.4 | ddc_node03 | Worker | Data | 運行有狀態服務容器的節點 |
D | 192.168.1.104 | CentOS7.4 | ddc_node04 | Worker | Dev | 運行無狀態服務容器和GFS Server的節點 |
E | 192.168.1.105 | CentOS7.4 | ddc_node05 | Worker | Dev | 運行無狀態服務容器和GFS Server的節點 |
1.3 名詞說明
名詞 | 說明 |
---|---|
Jenkins | DevOps工具。 |
任務視圖 | Jenkins任務的邏輯分組。 |
GitLab源碼庫 | 保存相關應用源碼的GitLab倉庫。 |
Docker Swarm | 基於docker引擎的容器集群編排工具。 |
應用服務 | 基於Jhipster標准化的微服務項目,通過Jenkins構建為Docker鏡像,並發布為Docker Swarm的Service。 |
數據庫服務 | 基於官方的Mysql容器鏡像,通過Jenkins發布為Docker Swarm的Service。 |
應用監控服務 | 基於Jihpster APM組件集合的容器鏡像,通過Jenkins發布為Docker Swarm的Service。 |
磁盤優化任務 | 基於Docker API,通過Jenkins任務定時清理節點上的無效鏡像和容器。 |
1.4 任務清單
一套基礎微服務體系結構,包含應用服務,數據庫服務,監控服務,磁盤優化服務等。
任務名 | 所屬任務視圖 | 說明 |
---|---|---|
microservice1-app | yourcompany-app | 持續部署名為microservice1-app的docker service |
microservice1-mysql | yourcompany-database | 持續部署名為microservice1-mysql的docker service |
gateway-app | yourcompany-app | 持續部署名為gateway-app的docker service |
gateway-mysql | yourcompany-database | 持續部署名為gateway-mysql的docker service |
jhipster-elasticsearch | yourcompany-monitor | 持續部署名為jhipster-elasticsearch的docker service |
jhipster-logstash | yourcompany-monitor | 持續部署名為jhipster-logstash的docker service |
jhipster-console | yourcompany-monitor | 持續部署名為jhipster-console的docker service |
jhipster-dashboard | yourcompany-monitor | 持續部署名為jhipster-dashboard的docker service |
jhipster-zipkin | yourcompany-monitor | 持續部署名為jhipster-zipkin的docker service |
jhipster-alerter | yourcompany-monitor | 持續部署名為jhipster-alerter的docker service |
jhipster-curator | yourcompany-monitor | 持續部署名為jhipster-alerter的docker service |
jhipster-registry | yourcompany-monitor | 持續部署名為jhipster-registry的docker service |
clean-disk-worker | yourcompany-cleanup | 清理worker節點的無效image和container |
clean-disk-manager | yourcompany-cleanup | 清理manager節點的無效image和container |
1.5 預先創建
下面任務配置中會用到的相關資源:
a, 在UCP中新建一個名為microservcie1-mysql-vol
的Docker存儲卷;
b, 在UCP中新建一個名為your-overlay
的Docker網絡;
c, 在UCP中為各個節點新增標簽node.type
,對應值有worker
和manager
;
d, 在UCP中為各個節點新增標簽node.env
,對應值有data
和dev
;
2 任務配置
2.1 持續部署數據庫服務的任務
任務內容是部署/更新一個mysql數據庫的容器,類似任務都在yourcompany-database
任務視圖下。
以microservcie1-mysql
為例:
a, 新建任務
任務名稱
輸入:microservcie1-mysql
;- 選擇
構建一個自由風格的軟件項目
; - 點擊
確定
。
b, General
- 勾選
丟棄舊的構建
; 策略 - 保持構建的天數
輸入:7
;策略 - 保持構建的最大個數
輸入:10
。
c, 源碼管理
選擇無
。
d, 構建
點擊增加構建步驟
,下拉框中選擇執行 shell
,輸入:
#!/bin/bash
if [ "$(docker service ls -f 'name=microservcie1-mysql' | grep microservcie1-mysql)" ];
then
docker service update --image dtr.yourdomain.com/common/mysql:5 microservcie1-mysql;
echo 'updated service for microservcie1-mysql.';
else
docker service create --name microservcie1-mysql --replicas 1 --network name=your-overlay,alias=microservcie1-mysql --constraint node.labels.node.type==worker --constraint node.labels.node.env==data --env
MYSQL_ROOT_PASSWORD=my-secret-pw --publish 32800:3306 --mount type=volume,source=microservcie1-mysql-vol,destination=/var/lib/mysql dtr.yourdomain.com/common/mysql:5
echo 'started service for microservcie1-mysql.';
fi
2.2 持續部署應用服務的任務
任務內容是部署/更新一個應用服務的容器,類似任務都在yourcompany-app任務視圖下。
以microservcie1-app為例:
a, 新建任務
任務名稱
輸入:microservcie1-app
;- 選擇
構建一個maven項目
; - 點擊
確定
。
b, General
- 勾選
丟棄舊的構建
; 策略 - 保持構建的天數
輸入:7
;策略 - 保持構建的最大個數
輸入:10
;策略 - 發布包保留天數
輸入:7
;策略 - 發布包最大保留#個構建
輸入:1
。
c, 源碼管理
- 選擇
Git
; Repositories - Repository URL
輸入:git@gitlab.yourdomain.com:repo/yourcompany-app.git
;Repositories - Credentials
選擇配置好的Jenkins憑據
;如果需要新建一個憑據,請參考這里Branches to build - Branch Specifier (blank for 'any')
輸入:refs/heads/dev
,這里表示dev分支;如果是主干,輸入*/master
。
d, 構建觸發器
- 勾選
Buidl Whenever a SNAPSHOP depentency is built
; Poll SCM
輸入:H/15 * * * *
,這表示每15分鍾觸發一次。
e, 構建環境
- 勾選
Delete workspace before build starts
; - 勾選
Do not build if only specified paths have changed
; - (可選)勾選
Invert ignore?
,如果是maven多模塊項目,可以通過設置忽略路徑,指定編譯某一個maven子模塊; - (可選)
Ignored paths
輸入:microservice1-app/**
。
f, 構建
Root POM
輸入:pom.xml
;Glals and options
輸入:clean -Pdev package -pl microservice1-app
;如果不是maven多模塊項目,不需要-pl
參數;- 取消勾選
Enable triggering of downstream projects
。
g, Post Steps
點擊Add post-build step
,下拉框中選擇執行 shell
,輸入:
#!/bin/bash
cd microservice1-app/;
mvn -Prd dockerfile:build;
docker tag microservice1-app:1.0 dtr.yourdomain.com/app/microservice1-app:1.0;
docker rmi microservice1-app:1.0;
docker login dtr.yourdomain.com --username admin --password dtrpassword;
docker push dtr.yourdomain.com/app/microservice1-app:1.0;
if [ "$(docker service ls -f 'name=microservice1-app' | grep microservice1-app)" ];
then
docker service update --image dtr.yourdomain.com/app/microservice1-app:1.0 microservice1-app;
echo 'updated service for microservice1-app.';
else
docker service create --name microservice1-app --replicas 1 --network your-overlay --constraint node.labels.node.type==worker --constraint node.labels.node.env==dev --env SPRING_PROFILES_ACTIVE=dev,zipkin,swagger --publish
8081:8081 dtr.yourdomain.com/app/microservice1-app:1.0;
echo 'created service for microservice1-app.';
fi
2.3 持續部署應用監控服務的任務
任務內容是部署/更新一個應用監控服務的容器,類似任務都在yourcompany-monitor
任務視圖下。
以jhipster-dashboard
為例:
a, 新建任務
任務名稱
輸入:jhipster-dashboard
;- 選擇
構建一個maven項目
; - 點擊
確定
。
b, General
- 勾選
丟棄舊的構建
; 策略 - 保持構建的天數
輸入:7
;策略 - 保持構建的最大個數
輸入:10
;策略 - 發布包保留天數
輸入:7
;策略 - 發布包最大保留#個構建
輸入:1
。
c, 源碼管理
- 選擇
Git
; Repositories - Repository URL
輸入:git@gitlab.yourdomain.com:repo/yourcompany-monitor.git
;Repositories - Credentials
選擇配置好的Jenkins憑據
;如果需要新建一個憑據,請參考這里Branches to build - Branch Specifier (blank for 'any')
輸入:refs/heads/dev
,這里表示dev分支;如果是主干,輸入*/master
。
d, 構建觸發器
- 勾選
Buidl Whenever a SNAPSHOP depentency is built
; Poll SCM
輸入:H/15 * * * *
,這表示每15分鍾觸發一次。
e, 構建環境
- 勾選
Delete workspace before build starts
; - 勾選
Do not build if only specified paths have changed
; - (可選)勾選
Invert ignore?
,如果是maven多模塊項目,可以通過設置忽略路徑,指定編譯某一個maven子模塊; - (可選)
Ignored paths
輸入:jhipster-dashboard/**
。
f, 構建
Root POM
輸入:pom.xml
;Glals and options
輸入:clean -Pdev package -pl jhipster-dashboard
;如果不是maven多模塊項目,不需要-pl
參數;- 取消勾選
Enable triggering of downstream projects
。
g, Post Steps
點擊Add post-build step
,下拉框中選擇執行 shell
,輸入:
#!/bin/bash
cd jhipster-dashboard/;
mvn -Prd dockerfile:build;
docker tag jhipster-dashboard:1.0 dtr.yourdomain.com/common/jhipster-dashboard:1.0;
docker rmi jhipster-dashboard:1.0;
docker login dtr.yourdomain.com --username admin --password dtrpassword;
docker push dtr.yourdomain.com/common/jhipster-dashboard:1.0;
if [ "$(docker service ls -f 'name=jhipster-dashboard' | grep jhipster-dashboard)" ];
then
docker service update --image dtr.yourdomain.com/common/jhipster-dashboard:1.0 jhipster-dashboard;
echo 'updated service for jhipster-dashboard.';
else
docker service create --name jhipster-dashboard --network your-overlay --constraint node.labels.node.type==worker --constraint node.labels.node.env==data --replicas 1 --env SPRING_PROFILES_ACTIVE=dev --publish 8762:8762 --mount type=bind,source=/etc/localtime,destination=/etc/localtime dtr.yourdomain.com/common/jhipster-dashboard:1.0;
echo 'created service for jhipster-dashboard.';
fi
2.4 定時執行磁盤優化的任務
任務內容是定時執行磁盤優化的腳本命令,類似任務都在yourcompany-cleanup
任務視圖下。因為使用了expect,需要先安裝,請參考這里
以clean-disk-worker
為例:
a, 新建任務
任務名稱
輸入:clean-disk-worker
;- 選擇
構建一個自由風格的軟件項目
; - 點擊
確定
。
b, General
- 勾選
丟棄舊的構建
; 策略 - 保持構建的天數
輸入:7
;策略 - 保持構建的最大個數
輸入:10
。
c, 源碼管理
選擇無
。
d, 構建觸發器
- 勾選
定時構建
; Poll SCM
輸入:H 5 * * *
,這表示每天凌晨5點觸發一次。
e, 構建
點擊增加構建步驟
,下拉框中選擇執行 shell
,輸入:
#!/usr/bin/expect
# 在192.168.1.102節點上執行
set ip 192.168.1.102
set pass yourpassword
set timeout 30
spawn ssh root@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@*" {send "docker rm \$(docker ps -aq --filter \"status=exited\")\r"}
expect "root@*" {send "docker rmi \$(docker images -f \"dangling=true\" -q)\r"}
expect "root@*" {send "exit\r"}
expect eof
# 在192.168.1.103節點上執行
set ip 192.168.1.103
set pass yourpassword
set timeout 30
spawn ssh root@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@*" {send "docker rm \$(docker ps -aq --filter \"status=exited\")\r"}
expect "root@*" {send "docker rmi \$(docker images -f \"dangling=true\" -q)\r"}
expect "root@*" {send "exit\r"}
expect eof
3 任務執行
- 數據庫任務通常初次執行后,不會定時執行,除非對數據庫鏡像有更新;
- 應用任務和應用監控任務,會在對應的GitLab源碼庫發生更新后觸發執行;
- 磁盤優化任務會在設定的時間定時執行。