本文演示如何經過Jenkins建立CI/CD任務,部署一整套微服務體系結構,並運行在以前搭建的mini雲平臺上。
若是是初始嘗試實踐,可能須要參考 快速搭建雲原生架構的實踐環境 和 Jhipster技術實踐 等相關文章。html
編號 | 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的節點 |
名詞 | 說明 |
---|---|
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任務定時清理節點上的無效鏡像和容器。 |
一套基礎微服務體系結構,包含應用服務,數據庫服務,監控服務,磁盤優化服務等。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 |
下面任務配置中會用到的相關資源:mysql
microservcie1-mysql-vol
的Docker存儲卷;your-overlay
的Docker網絡;node.type
,對應值有worker
和manager
;node.env
,對應值有data
和dev
;任務內容是部署/更新一個mysql數據庫的容器,相似任務都在yourcompany-database
任務視圖下。
以microservcie1-mysql
爲例:git
任務名稱
輸入:microservcie1-mysql
;構建一個自由風格的軟件項目
;肯定
。丟棄舊的構建
;策略 - 保持構建的天數
輸入:7
;策略 - 保持構建的最大個數
輸入:10
。選擇無
。sql
點擊增長構建步驟
,下拉框中選擇執行 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
任務內容是部署/更新一個應用服務的容器,相似任務都在yourcompany-app任務視圖下。
以microservcie1-app爲例:shell
任務名稱
輸入:microservcie1-app
;構建一個maven項目
;肯定
。丟棄舊的構建
;策略 - 保持構建的天數
輸入:7
;策略 - 保持構建的最大個數
輸入:10
;策略 - 發佈包保留天數
輸入:7
;策略 - 發佈包最大保留#個構建
輸入:1
。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
。Buidl Whenever a SNAPSHOP depentency is built
;Poll SCM
輸入:H/15 * * * *
,這表示每15分鐘觸發一次。Delete workspace before build starts
;Do not build if only specified paths have changed
;Invert ignore?
,若是是maven多模塊項目,能夠經過設置忽略路徑,指定編譯某一個maven子模塊;Ignored paths
輸入:microservice1-app/**
。Root POM
輸入:pom.xml
;Glals and options
輸入:clean -Pdev package -pl microservice1-app
;若是不是maven多模塊項目,不須要-pl
參數;Enable triggering of downstream projects
。點擊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
任務內容是部署/更新一個應用監控服務的容器,相似任務都在yourcompany-monitor
任務視圖下。
以jhipster-dashboard
爲例:bash
任務名稱
輸入:jhipster-dashboard
;構建一個maven項目
;肯定
。丟棄舊的構建
;策略 - 保持構建的天數
輸入:7
;策略 - 保持構建的最大個數
輸入:10
;策略 - 發佈包保留天數
輸入:7
;策略 - 發佈包最大保留#個構建
輸入:1
。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
。Buidl Whenever a SNAPSHOP depentency is built
;Poll SCM
輸入:H/15 * * * *
,這表示每15分鐘觸發一次。Delete workspace before build starts
;Do not build if only specified paths have changed
;Invert ignore?
,若是是maven多模塊項目,能夠經過設置忽略路徑,指定編譯某一個maven子模塊;Ignored paths
輸入:jhipster-dashboard/**
。Root POM
輸入:pom.xml
;Glals and options
輸入:clean -Pdev package -pl jhipster-dashboard
;若是不是maven多模塊項目,不須要-pl
參數;Enable triggering of downstream projects
。點擊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
任務內容是定時執行磁盤優化的腳本命令,相似任務都在yourcompany-cleanup
任務視圖下。由於使用了expect,須要先安裝,請參考這裏
以clean-disk-worker
爲例:
任務名稱
輸入:clean-disk-worker
;構建一個自由風格的軟件項目
;肯定
。丟棄舊的構建
;策略 - 保持構建的天數
輸入:7
;策略 - 保持構建的最大個數
輸入:10
。選擇無
。
定時構建
;Poll SCM
輸入:H 5 * * *
,這表示天天凌晨5點觸發一次。點擊增長構建步驟
,下拉框中選擇執行 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