构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可

设置Jenkins容器使用宿主机Docker

  • 设置宿主机docker.sock权限

chown root:root /var/run/docker.sock

chmod o+rw /var/run/docker.sock

  • 添加数据卷

version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./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
    restart: always

添加构建操作

添加参数化部署,这里添加一个参数projectVersion,用来给镜像指定具体的版本

 将原来使用over ssh推送jar及dockerFile文件的构建后操作步骤删除

在代码质量检测完成后执行镜像打包操作,并把镜像推送到目标服务器上

mv target/*.jar docker/
docker build -t mytest:${projectVersion} docker/
docker login -u admin -p Harbor12345 192.168.19.7:80
docker tag mytest:${projectVersion} 192.168.19.7:80/repo/mytest:${projectVersion}
docker push 192.168.19.7:80/repo/mytest:${projectVersion}

编写部署脚本

在代码部署的服务器上编写如下脚本deploy,并且将脚本移动环境变量中:

[root@localhost bin]# ls /usr/bin/ | grep deploy.sh
deploy.sh
 

[root@localhost bin]# cat /usr/bin/deploy.sh 
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5

imageName=$harbor_url/$harbor_project_name/$project_name:$tag

containerId=`docker ps -a | grep ${project_name} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
    docker stop $containerId
    docker rm $containerId
    echo "Delete Container Success"
fi

imageId=`docker images | grep ${project_name} | awk '{print $3}'`

if [ "$imageId" != "" ] ; then
    docker rmi -f $imageId
    echo "Delete Image Success"
fi

docker login -u admin -p Harbor12345 $harbor_url

docker pull $imageName

docker run -d -p $port:8080 --name $project_name $imageName

echo "Start Container Success"
echo $project_name
 

配置构建后操作

在项目的参数中添加如下host_port参数:

在excu command中配置如下命名:

deploy.sh 192.168.19.7:80  repo mytest  ${projectVersion} ${host_port}

测试执行构建:

在源码中修改hello 接口为:

 把代码推送到仓库,然后执行构建

 在浏览器上输入:192.168.19.7:8081/hello,查看输出,观看响应是否已经更改。

看到确实已经修改

至此,我们已经完成了一个基本的CI/CD的流水线。

实现的功能有:

1、开发者编完代码后,将代码推送到gitlab仓库中。

2、jenkins将拉取代码,然后通过maven打包

3、打包完成后,通过sonarQube进行代码质量检测

4、质量检测完成后,将代码打包成镜像

5、将生成的镜像文件推送到Harbor服务器上

6、jenkins服务器通知部署服务器做发布操作

          6.1  如果项目有正在运行的容器,需要停止

          6.2 如果有原来项目的镜像需要把镜像进行删除

          6.3 从Harbor服务器上拉取镜像到部署服务器上

         6.4  根据拉取到的最小镜像来运行一个新的容器

Logo

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

更多推荐