实验环境
Jenkins主机:
名称 版本
centos 7
java 1.8.0_45
maven 3.5.2
git 1.8.3.1
jenkins 2.190.1
docker 1.13.1
harbor仓库主机:
IP地址:192.168.14.212
用户和密码:admin/123456
harbor版本:1.8.0(建议版本1.7以上)
执行过程:mvn构建,dockerfile:build生成镜像,docker停止、删除、上传镜像到harbor
一、jenkins主机登录harbor仓库
可以使用docker自带的Registry仓库,这里为了方便管理使用了harbor
harbor安装查看https://blog.csdn.net/tladagio/article/details/96864759
1、登录显示报错
2、在/etc/docker/daemon.json加入harbor仓库地址
3、重启docker
[root@jenkins3 ~]# systemctl restart docker
4、再次登录成功
二、Harbor配置
1、新建一个项目
2、输入项目名称(这里只是演示,所以选择公开)
3、现在harbor镜像为空
三、Pipeline脚本
1、编辑脚本
pipeline {
agent any
environment {
def imageName = "${group_id}/${single_project_name}"
def tag="latest"
}
parameters {
string(name:'group_id', defaultValue: 'harbor', description: '项目groupId')
string(name:'maven_name', defaultValue: 'maven-3.5.2', description: '全局工具配置maven的名称')
string(name:'registry_url', defaultValue: '192.168.14.212', description: '镜像仓库地址')
string(name:'port', defaultValue: '8761', description: '部署镜像端口')
}
// 注册工具
tools {
maven "${params.maven_name}"
}
stages {
// 获取或更新最新代码
stage('check out') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], ...
}
}
// maven 编译依赖项目
stage('build dependence') {
steps {
script {
sh '''
mvn -f ***-common-pom clean install -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
mvn -f ***-common-lib clean install -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
'''
}
}
}
// 本地镜像删除(如果存在)、生成新镜像
stage('build images') {
steps {
script {
sh '''
containerStr=`docker ps -a | grep -w ${imageName} | awk '{print $1}'`
imageStr=`docker images | grep -w $imageName | awk '{print $3}'`
echo "container id:$containerStr"
echo "image id:$imageStr"
if [ "$imageStr" != "" ] ; then
if [ "$containerStr" != "" ] ; then
#停掉容器
docker stop `docker ps -a | grep -w ${imageName} | awk '{print $1}'`
#删除容器
docker rm `docker ps -a | grep -w ${imageName} | awk '{print $1}'`
#删除镜像
docker rmi --force ${imageName}
else
#删除镜像
docker rmi --force ${imageName}
fi
fi
mvn -f ${single_project_name} clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
'''
}
}
}
//删除仓库老镜像、重命名镜像、上传重命名新镜像
stage('upload image') {
steps {
script {
sh '''
#(1)判断本地是否已存在该项目的镜像,存在则先删除
regName=${registry_url}/$imageName
imageStr=`docker images | grep -w $regName | awk '{print $3}'`
if [ "$imageStr" != "" ] ; then
#将仓库中的镜像名称删除
docker rmi ${registry_url}/${imageName}:$tag
fi
#(2)必须要先将镜像的名称给变成 域名或ip/镜像名
docker tag ${imageName}:${tag} ${registry_url}/$imageName
#(3)删除本地镜像
docker rmi $imageName:${tag}
#(4)推送到远程harbor的仓库上,并删除本地记录
docker push ${registry_url}/$imageName
docker rmi ${registry_url}/${imageName}:$tag
'''
}
}
}
}
}
2、parameters字符参数(可选查看,这些参数pipeline脚本已经定义)
3、开始构建
四、Harbor镜像仓库
1、构建成功之后,查看harbor添加了一个镜像
2、至此docker镜像上传成功
3、点入镜像可以查看镜像构建历史
4、镜像名称规则受到pom.xml和docker重命名控制