背景,为了避免程序员每次提交代码都要登陆jenkins上去点击构建布署,太麻烦了,本博文是实现全自动CICD,通过jenkins,当git一提交代码jenkins就自动打包、构建docker、推送到harbor、发布测试环境,无需人员中间干预操作。
一、前提条件:
1、你已经安装好jenkins环境(jenkins不推荐docker安装,请使用原生安装,因为后面在构建jar、maven等,docker容器里面没有基础内容,很难安装)
2、我是centos9版本,我jenkins当前我的版本是2.514 , 通过 jenkins安装参考: https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos
3、git仓库,我用的gogs,gitlab太重了,使用不安适,gogs轻量化,使用简单,全中文
4、为了实现服务布署到docker环境,管理docker容器,使用的是docker swarm,docker swarm真的很好用,只要你装了docker,docker swarm就自带安装好了,环境干净,自行组件集群(就几个命令单),docker swarm还是通过service做docker容器的负载均衡,真的不要太爽了,再加上Dpanel,界面管理,轻量化管理docker集群,真的很爽,不要听网上一些喷子,上来就推Kubernetes,Kubernetes是牛,但k8s设计、使用、配置太复杂,安装环境占用资源多,运维成本大,对中小型企业并不友好,所以中小型企业推荐我这种方案
5、docker仓库使用的是harbor
6、我的docker版本是安装的28版本
7、jenkins、docker(包含docker swarm在同一台服务器),harbor随便安装在哪台服务器均可,通过hostname来访问的
本博文主讲jenkins配置创建构建流程,其它环境自行百度搭建,如果需帮助安装,可以联系
二、重点开始
1、jenkins安装两个插件 :
【Maven Integration plugin】:java打包使用的maven插件,如果你不是java项目,此插件不需要
【Generic Webhook Trigger Plugin】:此插件是开发人员将代码提交到Gogs仓库(gitlab仓库一样的),自动使用webhook触发jenkins开始构建
2、需要建4个环境变量
(1)WORK_PATH = xxx
mave拉下来的代码路径,到Dockerfile文件路径(如果是其它非maven项目,路径到Dockerfile路径)
(2)HARBOR_URL= xxx
harbor访问的URL地址,如server01:8080,其中server01为主机hostname,如server01是IP也可以,只是ip太长了,就hostname简洁
(3)DOCKER_IMAGE_NAME =xxx
生成docker镜像的名称
(4)DOCKER_SERVICE_PORT
布署到docker swarm的服务端口,对外暴露服务,也是做负债均衡的
3、maven 部分禁用测试代码检测
clean install -Dmaven.test.skip=true
maven构建前脚本,主要是替换java项目配置文件,其它项目类似:
#构建前替换配置文件
cd $WORK_PATH
cd src/main/resources
echo "开始替换配置文件bootstrap.yml,当前路径为:"
pwd
cp -f /xx/xx/xx/bootstrap.yml bootstrap.yml #修改为对应的路径
4、Gogs代码仓库触发webhook,调用jenkins自动构建
jenkins中触发器中的【Generic Webhook Trigger Plugin】中填Token为123456
Gogs代码仓库中webhook中填:http://jenkins登陆账号:jenkins密码@jenkins的IP:端口/generic-webhook-trigger/invoke?token=123456
5、maven打包后,构建docker镜像、推送到docker镜像到harbor仓库、通过docker warm(自动从harbor中拉取镜像)布署docker service服务,做负载均衡,shell脚本如下
cd $WORK_PATH
# 构建docker镜像
docker build -t $HARBOR_URL/$DOCKER_IMAGE_NAME:$BUILD_NUMBER .
# 推送到harbor仓库
docker push $HARBOR_URL/$DOCKER_IMAGE_NAME:$BUILD_NUMBER
echo "当前构建ID为:$BUILD_NUMBER"
docker service rm $JOB_NAME || true
# 启docker服务,下面80端口为docker镜像内部的端口
docker service create --with-registry-auth --name $JOB_NAME --replicas 1 -p $DOCKER_SERVICE_PORT:80 $HARBOR_URL$DOCKER_IMAGE_NAME:$BUILD_NUMBER
echo "当前构建ID为:$BUILD_NUMBER"echo "当前构建ID为:$BUILD_NUMBER"
专注JAVA系统优化、系统结构调整、系统问题排查医治、系统升级、架构设计、SQL语句优化、小程序、APP、企业应用软件开发,请 + hekf888,欢迎关注,时常发布技术分享博文