构建镜像和发布镜像到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=$5imageName=$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"
fiimageId=`docker images | grep ${project_name} | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
docker rmi -f $imageId
echo "Delete Image Success"
fidocker 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 根据拉取到的最小镜像来运行一个新的容器