Fork me on GitHub

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参数进行传递。最后指定标签进行构建即可:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
posted @ 2022-09-18 16:34  iveBoy  阅读(1105)  评论(0编辑  收藏  举报
TOP