1 目标
通过jenkins pipeline部署maven项目,其中项目打包成docker镜像,镜像存储在harbor中。
[部署jenkins 参考]()
[docker构建java项目参考]()
[安装harbor参考]()
2 详细步骤
2.1 创建pipeline任务
a、jenkins面板点“新建任务”
b、输入任务名称、选择流水线、再点“确定”即可创建pipeline任务
c、丢弃旧的构建,节约磁盘空间
2.2 pipeline脚本
此处在jenkins中直接写pipeline脚本,还可以将写pipeline文件放在git上。配置git拉取。
注:
a、没有jenkins slave执行节点。可以将jenkins和构建slave放在不同服务器,分担jenkins负载
b、maven项目和jenkins在同一台服务器,通过ansible在远程部署maven项目
2.3 环境变量
a、如上图,配置几个环境变量均和docker镜像或者harbor镜像库相关。构建镜像的时候需要带镜像地址和藏况名称才能push镜像到镜像仓库
b、jdk、maven、git在系统管理、全局配置工具中配置
c、jdk、maven如果要直接在pipeline中使用,需要用tools引用全局工具
也可以在pipeline文件中用printenv找到path路劲,将jdk和maven软连接至path
d、jenkins pipeline中使用docker可能会报权限相关错误。主要是因为jenkins是用jenkins用户执行,没有docker的执行权限。将jenkins用户增加到docker用户组中即可。
usermod -G groupname username
或者:gpasswd -a username groupname
e、从安全角度考虑将git和harbor的用户名和密码设置成jenkins 凭据
f、pipeline脚本
该pipeline没有执行异常条件参数判断处理,也没有邮件通知
pipeline {
agent {
label "master"
}
environment {
DOCKER_NAME='你的容器名'/*运行的docker容器名称*/
DOCKER_TAG=createVersion()/*时间戳,作为版本*/
HARBOR_URL='你的harbor地址'/*harbor地址*/
HARBOR_REP='你的仓库名'/*镜像仓库名*/
HARBOR_CRT='你的harbor凭证'/*jenkins上配置的harbor凭证*/
}
stages {
stage('git pull'){
steps {
sh 'pwd'
/*jenkins上配置的git凭证和地址*/
git credentialsId: '你的git凭证', url: '你的git地址'
}
}
stage('mvn install') {
steps {
script {
try {
sh 'pwd'
sh 'mvn --version'
/*用maven打包项目,此处掉过单元测试*/
sh 'mvn clean install -DskipTests'
currentBuild.result="SUCCESS"
} catch (e) {
currentBuild.result="FAILURE"
throw e
} finally {
}
}
}
}
stage('image build') {
steps {
script {
/*在harbor上有更多镜像,构建主机只保留最后一次构建镜像。$是groovy的特殊字符,需要用\转义*/
sh """docker rmi \$(docker images | grep ${DOCKER_NAME} | sed -n '1,\$p' | awk '{print \$3}') || true"""
def customImage=docker.build("${HARBOR_URL}/${HARBOR_REP}/${DOCKER_NAME}:${DOCKER_TAG}")
sh 'pwd'
withDockerRegistry(url: "http://${HARBOR_URL}", credentialsId: "${HARBOR_CRT}") {
/* Push the container to the custom Registry */
customImage.push()
}
}
}
}
stage('docker run') {
steps {
script {
sh 'pwd'
sh '''
/*web为在ansible的配置文件中配置的主机组,可以是多台主机*/
ansible web -a "docker rm -f ${DOCKER_NAME} " | true
ansible web -a "docker login -u 你的harbor用户名 -p 你的harbor密码 ${HARBOR_ULR}"
ansible web -a "docker pull ${HARBOR_URL}/${HARBOR_REP}/${DOCKER_NAME}:${DOCKER_TAG}"
ansible web -a "docker run -itd --name ${DOCKER_NAME} -p 8080:8080 ${HARBOR_URL}/${HARBOR_REP}/${DOCKER_NAME}:${DOCKER_TAG}"
/*在运行主机上删除多余的镜像,只保留两个镜像。此处$转义需要用两个\\进行转义,单引号也需要进行转义。*/
ansible web -m shell -a "docker images | grep ${DOCKER_NAME} | sed -n \'3, \\$p\' | awk \'{print \\$3}\' | xargs docker rmi " || true
'''
}
}
}
}
}
def createVersion() {
// 定义一个版本号作为当次构建的版本
return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}