docker-swarm+jenkins+git+harbor+spring-boot实现CI/CD

版权声明:未经许可不得转载 https://blog.csdn.net/qq_35299863/article/details/83620164

今天给大家带来一篇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
在这里插入图片描述
这个时候就可以更新我们的服务了,当然服务也可以不存在,脚本检测到没有服务会自动创建的。基础镜像需要大家自己琢磨了
展示下效果图以及镜像大小:
在这里插入图片描述
在这里插入图片描述
基础镜像不会做的,可以留言交流哦,有哪里可以改进的,也希望大家能够指出来

猜你喜欢

转载自blog.csdn.net/qq_35299863/article/details/83620164