Jenkins集成Harbor镜像仓库
一、集成的必要性
在之前的项目部署中,使用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参数进行传递。最后指定标签进行构建即可:
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架