Jenkins 配置CI/CD任務

本文演示如何經過Jenkins建立CI/CD任務,部署一整套微服務體系結構,並運行在以前搭建的mini雲平臺上。
若是是初始嘗試實踐,可能須要參考 快速搭建雲原生架構的實踐環境Jhipster技術實踐 等相關文章。html

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 任務清單

一套基礎微服務體系結構,包含應用服務,數據庫服務,監控服務,磁盤優化服務等。node

任務名 所屬任務視圖 說明
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 預先建立

下面任務配置中會用到的相關資源:mysql

a, 在UCP中新建一個名爲microservcie1-mysql-vol的Docker存儲卷;
b, 在UCP中新建一個名爲your-overlay的Docker網絡;
c, 在UCP中爲各個節點新增標籤node.type,對應值有workermanager
d, 在UCP中爲各個節點新增標籤node.env,對應值有datadev

2 任務配置

2.1 持續部署數據庫服務的任務

任務內容是部署/更新一個mysql數據庫的容器,相似任務都在yourcompany-database任務視圖下。
microservcie1-mysql爲例:git

a, 新建任務
  • 任務名稱輸入:microservcie1-mysql
  • 選擇構建一個自由風格的軟件項目
  • 點擊肯定
b, General
  • 勾選丟棄舊的構建
  • 策略 - 保持構建的天數輸入:7
  • 策略 - 保持構建的最大個數輸入:10
c, 源碼管理

選擇sql

d, 構建

點擊增長構建步驟,下拉框中選擇執行 shell,輸入:docker

#!/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爲例:shell

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爲例:bash

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源碼庫發生更新後觸發執行;
  • 磁盤優化任務會在設定的時間定時執行。
相關文章
相關標籤/搜索