目录

1.Jenkins容器内部使用docker

2.jenkins制作镜像并推送到harbor

3.jenkins通知目标服务器拉取镜像并运行


1.Jenkins容器内部使用docker

#让jenkins容器使用宿主机docker

#要实现要配置三个点

  • docker.sock的文件权限和所属

  • docker可执行文件

  • /etc/docker/daemon.json

[root@k8smaster run]# chown root:root /var/run/docker.sock
[root@k8smaster run]# chmod o+rw /var/run/docker.sock
[root@k8smaster run]# ls -l /var/run/docker.sock
srw-rw-rw- 1 root root 0 May  9 22:01 /var/run/docker.sock
#第一点ok

[root@k8smaster run]# vim /usr/local/docker/jenkins_docker/docker-compose.yml
volumes:
      - /usr/local/docker/jenkins_docker/data/:/var/jenkins_home/
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /etc/docker/daemon.json:/etc/docker/daemon.json
#第二、三点ok

#最后重启jenkins容器验证即可
[root@k8smaster jenkins_docker]# docker compose up -d
[root@k8smaster jenkins_docker]# docker exec -it jenkins bash
jenkins@a64a7bb33ec7:/$ docker info | tail -n 7
 Insecure Registries:
  192.168.64.21:80
  127.0.0.0/8
 Registry Mirrors:
  https://frtqcj69.mirror.aliyuncs.com/
 Live Restore Enabled: false

2.jenkins制作镜像并推送到harbor

#可以删掉这个在目标服务器上构建镜像的步骤了,因为我们要用jenkins制作镜像

#增加构建步骤——执行shell

mv target/*.jar docker/
docker build -t mytest:$tag docker/

#构建后就可以看到v4.0.0的镜像,说明真的制作镜像ok了。(记得在Gitlab打v4.0.0的tag)

#执行shell部分添加内容,推送镜像到harbor

mv target/*.jar docker/
docker build -t mytest:$tag docker/
docker login -u admin -p Harbor12345 http://192.168.64.21:80
docker tag mytest:$tag 192.168.64.21:80/repo/mytest:$tag
docker push 192.168.64.21:80/repo/mytest:$tag

3.jenkins通知目标服务器拉取镜像并运行

#一、流程:

  • 1.告知目标服务器拉取哪个镜像

  • 2.判断当前服务器是否正在运行容器,需要删除

  • 3.如果目标服务器已经存在当前镜像,需要删除

  • 4.目标服务器拉取harbor上的镜像

  • 5.将拉取下来的镜像运行成容器

#如果全让jenkins来做的话成本就会比较高,这里在目标服务器准备一个脚本,包括以上内容,再让jenkins通知目标服务器运行脚本即可。

#二、脚本需要知道哪些东西:

  • harbor地址/harbor仓库/镜像名:镜像版本

  • 容器运行需要的端口号

harbor_addr=$1 harbor_repo=$2 project=$3 version=$4 port=$5

#这五个信息,会让jenkins给到目标服务器

[root@k8snode1 ~]# vim deploy.sh
#!/bin/bash
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6


#完整的镜像名称
imagename=$harbor_addr/$harbor_repo/$project:$version

#判断容器是否正在运行
containerid=`docker ps -a | grep ${project} | awk '{print $1}'`

echo $containerid

#如果容器在运行就停止并删除容器
if [ "$containerid" != "" ];then
  docker stop $containerid
  docker rm $containerid
fi

#判断镜像是否存在,获取版本号
tag=`docker images | grep ${project} | awk '{print $2}'`

echo $tag

#如果版本号中包含jenkins提供的版本号,那么删除掉这个镜像
if [ "$tag" == "$version" ];then
  docker rmi -f $imagename
fi

#登录镜像仓库并拉取镜像
docker login -u admin -p Harbor12345 $harbor_addr

docker pull $imagename

echo "拉取镜像: $imagename 成功"

#运行容器
docker run -d -p $host_port:$container_port --name $project $imagename

echo "容器运行: $project 成功"



[root@k8snode1 ~]# chmod a+x deploy.sh 
[root@k8snode1 ~]# cp deploy.sh /usr/bin/
[root@k8snode1 ~]# ./deploy.sh 192.168.64.21:80 repo mytest1 v3.0.0 8081 8080

#测试成功

#服务器脚本ok,接下来要搞定jenkins通知服务器来运行这个脚本即可。

#添加端口参数

#构建后操作

deploy.sh 192.168.64.21:80 repo ${JOB_NAME} $tag $port

#再次构建即可,去目标服务器检查容器是否运行。

#这里我把镜像构建的名称改为了test2,因为我的jenkins项目名也就是${JOB_NAME}改为了test2,不然会找不到harbor上的test2镜像。这里根据自己的情况来。

#构建成功的话可以 看到

#至此ok

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐