组件 | 版本 |
---|---|
Jenkins | 2.332.2 |
pipeline {
/*Jenkins节点,any代表所有*/
//agent any
agent {
node {
//在label为dev1的节点进行部署
label 'dev1'
}
}
//需要使用的系统组件版本,如JDK、MVN,在 系统管理 -> 全局工具配置 中设置
tools{
maven '3.8.5'
}
/*环境变量,类似全局变量*/
environment {
BUILD_USER = "" //项目构建者
GIT_COMMIT_MSG = "" //GIT提交信息
GIT_COMMIT_ID = "" //GIT提交ID,可用于标识版本
/*部署配置*/
POM_PATH = "${env.WORKSPACE}/pom.xml" //配置文件路径
POM_ARTIFACTID = "" //项目名称
POM_VERSION = "" //项目版本
JAR_NAME = "" //jar包名称
JAR_PATH = "${env.WORKSPACE}/target" //生成的jar包路径
/*部署配置*/
JAR_WORK_PATH = "你的程序运行路径" //运行jar的工作路径,统一管理,并需要提前创建好
/*部署配置*/
LOG_PATH = "你的日志统一路径" //日志路径
}
/*Jenkins自动构建触发器*/
triggers{
//每5分钟判断一次代码是否有变化
pollSCM('H/5 * * * *')
}
/*构建阶段*/
stages {
/*准备阶段:拉取代码、定义全局变量等*/
stage('Preparation') {
steps {
//使用build user vars插件,获取构建执行者
wrap([$class: 'BuildUser']) {
script {
BUILD_USER = "${env.BUILD_USER}" //将构建执行者注入到环境变量中,方便最后通知使用
}
}
/*部署配置*/
/** 从Bitbucket上拉取分支
* @url git地址
* @branch 分支名称
* @credentialsId Jenkins凭证Id,用于远程访问
*/
git(url: '你的Git地址', branch: 'master', credentialsId: '你的Git凭证')
script {
//执行Git命令获取Git相关信息赋值给全局变量,returnStdout返回命令结果
GIT_COMMIT_MSG = sh(script: 'git log -1 --pretty=%B ${GIT_COMMIT}', returnStdout: true).trim()
GIT_COMMIT_ID = sh(script: 'git rev-parse --short HEAD', returnStdout: true ).trim()
}
/*读取pom.xml文件,设置全局变量*/
readPom()
}
}
/*构建阶段*/
stage('Build'){
steps{
/**
* 执行maven打包
* -B --batch-mode 在非交互(批处理)模式下运行(该模式下,当Mven需要输入时,它不会停下来接受用户的输入,而是使用合理的默认值)
* 打包时跳过JUnit测试用例
* -DskipTests 不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下
* -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类
**/
sh 'mvn -B -DskipTests clean package'
}
}
/*部署阶段*/
stage('Deliver') {
steps {
withEnv(['JENKINS_NODE_COOKIE=background_job']) {
sh """
# 停止服务并杀死进程
pid=\$(ps -ef | grep ${POM_ARTIFACTID} | grep -v grep | awk \'{ print \$2 }\')
if [ -z "\$pid" ]
then
echo ${POM_ARTIFACTID} is already stopped
else
echo kill ${POM_ARTIFACTID}
echo kill -2 \${pid}
kill -15 \${pid}
fi
# kill需要一定时间,等待10秒
sleep 10
# 创建默认路径
mkdir -p ${JAR_WORK_PATH}
# 移动打包文件
cp -f ${JAR_PATH}/${JAR_NAME} ${JAR_WORK_PATH}
# 将工作目录切换到日志路径执行程序
cd ${LOG_PATH}
# /dev/null 所有写入它的内容都会永远丢失
nohup java -jar ${JAR_WORK_PATH}/${JAR_NAME} >/dev/null 2>>${JAR_WORK_PATH}/sys_error.log &
"""
}
}
}
}
post {
success {
dingtalk (
robot: "dev1_demo",
type:'ACTION_CARD',
atAll: false,
title: "构建成功:${env.JOB_NAME}",
//messageUrl: 'xxxx',
text: [
"### [${env.JOB_NAME}](${env.JOB_URL}) ",
'---',
"- 任务:[${currentBuild.displayName}](${env.BUILD_URL})",
'- 状态:成功',
"- 持续时间:${currentBuild.durationString}".split("and counting")[0],
"- 执行人:${BUILD_USER}",
"- 提交日志: ${GIT_COMMIT_MSG}",
]
)
}
failure{
dingtalk (
robot: "dev1_demo",
type:'ACTION_CARD',
atAll: false,
title: "构建失败:${env.JOB_NAME}",
//messageUrl: 'xxxx',
text: [
"### [${env.JOB_NAME}](${env.JOB_URL}) ",
'---',
"- 任务:[${currentBuild.displayName}](${env.BUILD_URL})",
'- 状态:失败',
"- 持续时间:${currentBuild.durationString}".split("and counting")[0],
"- 执行人:${BUILD_USER}",
"- 提交日志: ${GIT_COMMIT_MSG}",
]
)
}
}
}
def POM_PROJECT_NAME
def POM_VERSION
def POM_ARTIFACTID
def JAR_WORK_PATH
def JAR_NAME
/**
* 读取配置文件,获取信息
* @return
*/
def readPom(){
def pom = readMavenPom file: "${POM_PATH}" //使用Jenkins插件pipeline-utility-steps读取pom.xml文件,使用方法详见https://www.jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#readmavenpom-read-a-maven-project-file
POM_PROJECT_NAME = "${pom.artifactId}" + '-' + "${pom.version}" + '.jar'
POM_VERSION = pom.version
//设置全局变量
POM_ARTIFACTID = "${pom.artifactId}"
JAR_WORK_PATH += '/' + POM_ARTIFACTID
JAR_NAME = POM_ARTIFACTID + '-' + POM_VERSION + '.jar'
}
使用如上Pipeline只需要修改三行
/*部署配置*/
JAR_WORK_PATH = "你的程序运行路径" //运行jar的工作路径,统一管理,并需要提前创建好
/*部署配置*/
LOG_PATH = "你的日志统一路径" //日志路径
......
/*部署配置*/
/** 从Bitbucket上拉取分支
* @url git地址
* @branch 分支名称
* @credentialsId Jenkins凭证Id,用于远程访问
*/
git(url: '你的Git地址', branch: 'master', credentialsId: '你的Git凭证')
程序会自动调用readPom函数,获取Pom中的配置。
如果前端需要部署,可以修改readPom为readPackage函数,替换对应的变量和命令即可