赞
踩
通过jenkins pipeline部署maven项目,其中项目打包成docker镜像,镜像存储在harbor中。
[部署jenkins 参考](https://blog.csdn.net/lsnow8624/article/details/113740989)
[docker构建java项目参考](https://blog.csdn.net/lsnow8624/article/details/113341559)
[安装harbor参考](https://blog.csdn.net/lsnow8624/article/details/113248798)
a、jenkins面板点“新建任务”
b、输入任务名称、选择流水线、再点“确定”即可创建pipeline任务
c、丢弃旧的构建,节约磁盘空间
此处在jenkins中直接写pipeline脚本,还可以将写pipeline文件放在git上。配置git拉取。
注:
a、没有jenkins slave执行节点。可以将jenkins和构建slave放在不同服务器,分担jenkins负载
b、maven项目和jenkins在同一台服务器,通过ansible在远程部署maven项目
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}" }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。