1. 程式人生 > >docker-swarm+jenkins+git+harbor+spring-boot實現CI/CD

docker-swarm+jenkins+git+harbor+spring-boot實現CI/CD

今天給大家帶來一篇CI/CD的文章,我是使用swarm做的docker叢集,Harbor作為映象倉庫,git作為程式碼、配置倉庫,jenkins就是釋出啦,由於之前寫過jenkins在swarm叢集下搭建過程,這裡不做說明了,Harbor需要自己事先安裝好(或者公有云,還免費)
開始吧:(centos7以上系統,我是7.4)
1:所有叢集節點安裝docker,並登陸Harbor(映象倉庫)
yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum-config-manager --enable docker-ce-edge //選擇版本,我是用的18.03

yum install -y docker-ce-18.03.1.ce

sed -i ‘s/ExecStart=.*/ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -D -H tcp://0.0.0.0:2375/g’ /lib/systemd/system/docker.service

systemctl enable docker

systemctl start docker

docker login --usernamer=xxx Harbor-url地址

2:建立swarm叢集(關閉防火牆、selinux)
docker swarm init --advertise-addr 10.59.1.172 #本機內部ip地址,選擇一個節點作為初始leader
docker network create -d overlay cdel --attachable # cdel 可以隨便改為,為內部網路名稱
完成後檢視docker-swarm節點情況:
docker node ls
docker network ls
開始加入節點:
docker swarm join-token --help //新增manager 或者 work
如果你想加入manager:
docker swarm join-token manager //下面就會出現對應的命令,然後複製,到其他主機執行
如果你想加入worker:
docker swarm join-token worker //下面就會出現對應的命令,然後複製,到其他主機執行
3:接下來是根據業務做映象並且實現自動釋出
3.1:我是java專案,生成jar包的,所以大致步驟jenkins–拉取程式碼–構建生成jar–Dockerfile把jar包封裝在映象裡–push映象–遠端到叢集,執行更新
jenkins配置:在這裡插入圖片描述


名字最好是swarm下的服務名
具體配置如下:
在這裡插入圖片描述
在這裡插入圖片描述
憑證不知道如何加的,可以看我之前的jenkins文章
在這裡插入圖片描述
在這裡插入圖片描述
service.sh內容:
#!/bin/bash
set -xe
num=docker service ls|awk '{print $2}'|grep $1$|wc -l
if [ $num -eq 0 ];then
echo “服務未找到,開始建立服務,如果叢集有變動,記得加入ansible的swarm組下,建立日誌目錄使用”
if [[ $3 != ‘17000’ ]];then
docker service create --name $1 --network cdel --health-cmd=“curl --silent --fail localhost:17000$3 || exit 1” --health-retries=3 --health-interval=5s --health-timeout=2s --health-start-period=100s --update-delay 10s --endpoint-mode=dnsrr --replicas 1 --update-failure-action rollback harbor.XXX.com/swarm/$1:$2
else
docker service create --name $1 --network cdel --health-cmd=“netstat -nlp | grep 17000 && exit 0 || exit 1” --health-retries=3 --health-interval=5s --health-timeout=2s --health-start-period=100s --update-delay 10s --endpoint-mode=dnsrr --replicas 1 --update-failure-action rollback harbor.XXX.com/swarm/$1:$2
fi
else
echo “服務已找到,開始更新服務”
docker service update --image harbor.XXX.com/swarm/$1:$2 $1
fi
註釋:由於我全部定義了啟動埠為17000,所以健康監測有時需要驗證,我就直接用埠驗證了,正常情況下都是傳健康監測的url,否則就是傳17000。沒有找到服務就會建立,找到就會更新

註釋:有些人搞不懂為啥–endpoint-mode=dnsrr,這是由於註冊中心的問題,預設是一個VIP,當更新服務的時候會出現不能訪問的情況,所以改為dnsrr就會註冊多個,更新的時候就不會有問題了(有人說VIP一直提供服務,為啥註冊中心會檢測不到,我也想問為啥?反正是個坑,改為dnsrr就遇到動態解析的問題,所以我就放棄了nginx,用了tengine作為代理,加上動態解析)
3.2:接下來看看git倉庫下Dockerfile以及配置檔名稱(不是程式碼倉庫):
在這裡插入圖片描述
看看我們的Dockerfile
在這裡插入圖片描述
這個時候就可以更新我們的服務了,當然服務也可以不存在,指令碼檢測到沒有服務會自動建立的。基礎映象需要大家自己琢磨了
展示下效果圖以及映象大小:
在這裡插入圖片描述
在這裡插入圖片描述
基礎映象不會做的,可以留言交流哦,有哪裡可以改進的,也希望大家能夠指出來