一、集成的必要性
在之前的项目部署中,使用jenkins将构建好的代码通过 publish over ssh 插件推送到远程服务器进行部署,然后在远程服务器上进行镜像的构建以及容器的启动。那么如果是多台服务器就会比较耗时,这时采用在jenkins服务器上直接构建好镜像推送到镜像仓库,然后jenkins通知远程服务器直接去镜像仓库拉取镜像即可。
二、Jenkins构建镜像配置
在上面的流程图中可以看到需要jenkins来构建镜像,但是jenkins是容器服务,所以就有如下两种方案:
- jenkins容器内部搭建docker服务,进行构建
- jenkins容器使用宿主机的docker服务,进行构建
第一种方式在容器内部去构建docker显然成本太高,那么采用第二种方式容器内部使用宿主机的docker。
1、设置宿主机docker.sock权限
chown root:root /var/run/docker.sock chmod o+rw /var/run/docker.sock
2、添加数据卷
version: "3.1" services: jenkins: image: jenkinsci/blueocean container_name: jenkins ports: - 8080:8080 - 50000:50000 volumes: - ./data/:/var/jenkins_home/
- /lib64/:/lib64/ - /usr/bin/docker:/usr/bin/docker - /var/run/docker.sock:/var/run/docker.sock - /etc/docker/daemon.json:/etc/docker/daemon.json
注意的是上述数据卷lib64是处理宿主机与容器架构的差异化导致容器无法使用宿主机的docker,然后重启容器:
[root@localhost ~]# docker compose up -d [+] Running 1/1 ⠿ Container jenkins Started
三、Jenkins构建操作
1、构建参数
在General构建如下参数:
- Git参数 tag origin/main
- 字符参数 container_port 5000
- 字符参数 host_port 5000
2、源码管理
指定源码仓:
- Repository URL http://172.16.52.8/shenjianping/web_test.git
- Credentials 认证
- Branches to build */main
3、构建
执行shell脚本:
# 切换指定标签的代码 git checkout $tag # 在Jenkins服务器上构建镜像 docker build -t 172.16.52.10:80/repo/${JOB_NAME}:$tag . # 登录镜像仓 docker login -u shenjianping -p ****** 172.16.52.10:80 # 推送到镜像仓库 docker push 172.16.52.10:80/repo/${JOB_NAME}:$tag
4、构建后操作
通过Publish Over SSH插件将Jenkins部署脚本同步到远程服务器:
- Source files
deploy.sh
- Exec command
# 远程服务器执行命令 cd /usr/local/test chmod a+x deploy.sh ./deploy.sh 172.16.52.10:80 repo ${JOB_NAME} $tag $host_port $container_port
其中远程服务器需要在系统管理-->系统配置中进行配置。
- deploy.sh
#!/bin/bash harbor_addr=$1 harbor_repo=$2 project_name=$3 version=$4 container_port=$5 host_port=$6 imageName=$harbor_addr/$harbor_repo/$project_name:$version containerId=`docker ps -a | grep ${project_name} | awk '{print $1}'` if [ $containerId != "" ] ; then docker stop $containerId docker rm $containerId fi tag=`docker images | grep ${project_name} | awk '{print $2}'` if [[ $tag =~ $version ]] ; then docker rmi $imageName fi docker login -u shenjianping -p ****** $harbor_addr docker pull $imageName docker run -d -p $host_port:$container_port --name $project_name $imageName echo "$project_name success!"
该脚本执行的逻辑:
- 首先判断该服务器上是否有正在运行该镜像的容器,如果存在就停掉该容器并且删除
- 然后删除该镜像
- 其次是登录到镜像仓,拉取镜像
- 最后是运行拉取镜像的容器
脚本中涉及的参数是通过jenkins参数进行传递。最后指定标签进行构建即可:
标签:容器,镜像,name,Harbor,构建,jenkins,Jenkins,docker From: https://www.cnblogs.com/shenjianping/p/16704159.html