当前位置:   article > 正文

Jenkins Pipeline 中阶示例详解_pipeline pom_path

pipeline pom_path

一、系统环境

组件版本
Ubuntu20.04
Jenkins2.319.1
Bitbucket

二、完整示例

pipeline {

    /*Jenkins节点,any代表所有*/
    //agent any
    agent {
        node {
            //在label为dev1的节点进行部署
            label 'dev1'
        }
    }

    /*环境变量,类似全局变量*/
    environment {
        BUILD_USER = "" //项目构建者
        GIT_COMMIT_MSG = "" //GIT提交信息
        GIT_COMMIT_ID = "" //GIT提交ID,可用于标识版本

        /*部署配置*/
        POM_PATH = "${env.WORKSPACE}/pom.xml" //配置文件路径
        POM_ARTIFACTID = "" //项目名称
        POM_VERSION = "" //项目版本
        POM_PROJECT_NAME = "" //上一版项目全称,用于杀死上一版本进程:POM_ARTIFACTID+'-'+POM_VERSION+'.jar'。值为空则读取Pom.xml中上个版本项目名称,值不为空则指定杀死进程。

        JAR_NAME = "" //jar包名称
        JAR_PATH = "${env.WORKSPACE}/target" //生成的jar包路径
        /*部署配置*/
        JAR_WORK_PATH = "你要运行jar包的路径" //运行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: 'https://sleetdream@bitbucket.org/sleetdream/demo-hello.git', branch: 'master', credentialsId: 'sleetdream')

                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文件,设置全局变量*/
                readRom()


                /**
                 * 提交修改的Pom.xml文件到Bitbucket
                 * 1.获取Jenkins凭证,将凭证中的username赋予变量GIT_USERNAME,password赋予变量GIT_PASSWORD
                 * 2.运行git脚本,提交代码并push到Bitbucket
                 */
                withCredentials([usernamePassword(credentialsId: 'sleetdream', usernameVariable: "GIT_USERNAME", passwordVariable: "GIT_PASSWORD")]) {
                    sh('git config --global user.name "sleetdream"') //设置Git本地全局用户名
                    sh('git config --global user.email "sleetdream@demo.com"') //设置Git本地全局邮箱
                    sh('git commit -a -m "Jenkins自动修改版本"') //参数说明:-a -m 只提交跟踪过的文件,即修改过的文件
                    /*部署配置*/
                    sh('git push https://${GIT_USERNAME}:${GIT_PASSWORD}@bitbucket.org/sleetdream/demo-hello.git') //使用凭证中的Username和Password提交代码
                }

                /*部署配置*/
                //再次拉取代码,防止Jenkins因Push触发自动编译,导致自动编译与版本修改的死循环
                git(url: 'https://sleetdream@bitbucket.org/sleetdream/demo-hello.git', branch: 'master', credentialsId: 'sleetdream')
            }
        }

        /*构建阶段*/
        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})",
                            '- 状态:<font color=#00CD00 >成功</font>',
                            "- 持续时间:${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})",
                            '- 状态:<font color=#EE0000 >失败</font>',
                            "- 持续时间:${currentBuild.durationString}".split("and counting")[0],
                            "- 执行人:${BUILD_USER}",
                            "- 提交日志: ${GIT_COMMIT_MSG}",
                    ]
            )
        }
    }
}


/**
 * 读取配置文件,获取信息
 * @return
 */
def readRom(){
    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
    if(!POM_PROJECT_NAME){
        POM_PROJECT_NAME = "${pom.artifactId}" + '-' + "${pom.version}" + '.jar'
    }
    println("当前中的版本:${pom.version}")
    POM_VERSION = modifyVersion("${pom.version}") //修改版本
    pom.version = POM_VERSION
    println("更新后的版本:${pom.version}")

    writeMavenPom model: pom //使用Jenkins插件pipeline-utility-steps写入pom.xml文件

    //设置全局变量
    POM_ARTIFACTID = "${pom.artifactId}"
    JAR_WORK_PATH += POM_ARTIFACTID + '/'
    JAR_NAME = POM_ARTIFACTID + '-' + POM_VERSION + '.jar'
}

/**
 * 修改Version信息
 * @return version
 */
def modifyVersion(String version) {
    def flag = false
    if(version.endsWith('-SNAPSHOT')){
        version = version.replace('-SNAPSHOT','')
        flag = true
    }
    def number = version.split('\\.')
    def num0 = number[0]
    def num1 = number[1]
    int num2 = number[2] as Integer
    num2 += 1
    version = num0+'.'+num1+'.'+num2 +'.'+ "${GIT_COMMIT_ID}"
    if(flag){
        version += '-SNAPSHOT'
    }
    return version
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218

三、细节详解

1、Jenkins节点

/*Jenkins节点,any代表所有*/
//agent any
agent {
    node {
        //在label为dev1的节点进行部署
        label 'dev1'
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

官方文档
在Jenkins上新建节点,将其标签设置为dev1,下载agent.jar在目标服务器上按Jenkins给出的命令启动。

2、环境变量

/*环境变量,类似全局变量*/
environment {
    BUILD_USER = "" //项目构建者
    GIT_COMMIT_MSG = "" //GIT提交信息
    GIT_COMMIT_ID = "" //GIT提交ID,可用于标识版本

    /*部署配置*/
    POM_PATH = "${env.WORKSPACE}/pom.xml" //配置文件路径
    POM_ARTIFACTID = "" //项目名称
    POM_VERSION = "" //项目版本
    POM_PROJECT_NAME = "" //上一版项目全称,用于杀死上一版本进程:POM_ARTIFACTID+'-'+POM_VERSION+'.jar'。值为空则读取Pom.xml中上个版本项目名称,值不为空则指定杀死进程。

    JAR_NAME = "" //jar包名称
    JAR_PATH = "${env.WORKSPACE}/target" //生成的jar包路径
    /*部署配置*/
    JAR_WORK_PATH = "你要运行jar包的路径" //运行jar的工作路径,统一管理,并需要提前创建好
    /*部署配置*/
    LOG_PATH = "你要放日志的路径" //日志路径
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

官方文档
定义Jenkins的环境变量,方便后续部署步骤使用。

(1)在Groovy中使用环境变量

//可直接使用环境变量
def path = POM_PATH
  • 1
  • 2

(2)在shell中使用环境变量

sh """
# 需要用${}将变量名称包裹起来
echo ${POM_PROJECT_NAME}
"""
  • 1
  • 2
  • 3
  • 4

【注意】在sh调用脚本双引号和单引号存在区别,双引号可以使用变量,单引号不能使用变量
linux sh 三个单引号,Shell双引号和单引号有哪些不同

3、触发器

/*Jenkins自动构建触发器*/
triggers{
    //每5分钟判断一次代码是否有变化
    pollSCM('H/5 * * * *')
}
  • 1
  • 2
  • 3
  • 4
  • 5

官方文档

4、获取Jenkins构建执行者

获取Jenkins的构建执行者,用于发送构建通知给Email或钉钉

//使用build-user-vars-plugin插件,获取构建执行者
wrap([$class: 'BuildUser']) {
    script {
        BUILD_USER = "${env.BUILD_USER}" //将构建执行者注入到环境变量中,方便最后通知使用
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

build-user-vars-plugin插件官方文档

5、Git Pull代码

/*部署配置*/
/** 从Bitbucket上拉取分支
 * @url git地址
 * @branch 分支名称
 * @credentialsId Jenkins凭证Id,用于远程访问
 */
git(url: 'https://sleetdream@bitbucket.org/sleetdream/demo-hello.git', branch: 'master', credentialsId: 'sleetdream')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

git插件官方文档

6、获取构建信息

获取构建信息有两种方式,可以直接运行Git命令获取返回值,也可以从环境变量中获取

(1)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()
}
  • 1
  • 2
  • 3
  • 4
  • 5

(2)环境变量

@NonCPS
def getChangeString() {
    MAX_MSG_LEN = 100
    def changeString = ""

    echo "Gathering SCM changes"
    def changeLogSets = currentBuild.changeSets
    for (int i = 0; i < changeLogSets.size(); i++) {
        def entries = changeLogSets[i].items
        for (int j = 0; j < entries.length; j++) {
            def entry = entries[j]
            truncated_msg = entry.msg.take(MAX_MSG_LEN)
            changeString += " -${entry.author} : ${truncated_msg} \n"
        }
    }
    if (!changeString) {
        changeString = " - No new changes"
    }
    return changeString
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

全局变量文档 “你的jenkins地址/pipeline-syntax/globals”
currentBuild.changeSets为环境变量,变量详解

7、读取Pom.xml文件

/**
 * 读取配置文件,获取信息
 * @return
 */
def readRom(){
    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
    if(!POM_PROJECT_NAME){
        POM_PROJECT_NAME = "${pom.artifactId}" + '-' + "${pom.version}" + '.jar'
    }

    println("当前中的版本:${pom.version}")
    POM_VERSION = modifyVersion("${pom.version}") //修改版本
    pom.version = POM_VERSION
    println("更新后的版本:${pom.version}")

    writeMavenPom model: pom //使用Jenkins插件pipeline-utility-steps写入pom.xml文件

    //设置全局变量
    POM_ARTIFACTID = "${pom.artifactId}"
    JAR_WORK_PATH += POM_ARTIFACTID + '/'
    JAR_NAME = POM_ARTIFACTID + '-' + POM_VERSION + '.jar'
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

使用Jenkins插件pipeline-utility-steps读写pom.xml

【注意】此处不能使用Groovy自带的XmlParser和XmlSlurper,原因是这两个类使用了java.io.file。凡是涉及java.io.file的方法,均只能在Jenkins主节点执行,就算一开始agent指定了node,该处脚本也只会在master节点执行。

jenkins pipeline 使用groovy操作文件提示java.io.FileNotFoundException: ×××××.txt (No such file or directory)

如下例子笔者已验证,该脚本只会在master节点运行,经常会出现master节点的pom.xml文件路径不存在,出现java.io.FileNotFoundException

/**
 * 修改Version信息,并Push文件
 * @return
 */
def modifyVersion() {
    def doc = new XmlSlurper().parse("${env.WORKSPACE}/pom.xml");
    String version = doc.version.text();
    def flag = false;
    if(version.endsWith('-SNAPSHOT')){
        version = version.replace('-SNAPSHOT','');
        flag = true;
    }
    def number = version.split('\\.')
    def num0 = number[0];
    def num1 = number[1];
    int num2 = number[2] as Integer;
    num2 += 1;
    version = num0+'.'+num1+'.'+num2;
    if(flag){
        version += '-SNAPSHOT';
    }
    println(version);
    doc.version.replaceBody(version);
    def writeFile = new File("${env.WORKSPACE}/pom.xml");
    writeFile.write(groovy.xml.XmlUtil.serialize(doc).replaceAll('tag0:', '').replaceAll(':tag0', '') );
    return version;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

8、修改Pom.xml中Version信息

使用groovy脚本修改Version,此处可根据需要进行定制
对version进行split时请注意,英文句号.需要双斜杠进行转义

/**
 * 修改Version信息
 * @return version
 */
def modifyVersion(String version) {
    def flag = false
    if(version.endsWith('-SNAPSHOT')){
        version = version.replace('-SNAPSHOT','')
        flag = true
    }
    def number = version.split('\\.')
    def num0 = number[0]
    def num1 = number[1]
    int num2 = number[2] as Integer
    num2 += 1
    version = num0+'.'+num1+'.'+num2 +'.'+ "${GIT_COMMIT_ID}"
    if(flag){
        version += '-SNAPSHOT'
    }
    return version
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

9、Git Push代码

/**
 * 提交修改的Pom.xml文件到Bitbucket
 * 1.获取Jenkins凭证,将凭证中的username赋予变量GIT_USERNAME,password赋予变量GIT_PASSWORD
 * 2.运行git脚本,提交代码并push到Bitbucket
 */
withCredentials([usernamePassword(credentialsId: 'sleetdream', usernameVariable: "GIT_USERNAME", passwordVariable: "GIT_PASSWORD")]) {
    sh('git config --global user.name "sleetdream"') //设置Git本地全局用户名
    sh('git config --global user.email "sleetdream@demo.com"') //设置Git本地全局邮箱
    sh('git commit -a -m "Jenkins自动修改版本"') //参数说明:-a -m 只提交跟踪过的文件,即修改过的文件
    /*部署配置*/
    sh('git push https://${GIT_USERNAME}:${GIT_PASSWORD}@bitbucket.org/sleetdream/demo-hello.git') //使用凭证中的Username和Password提交代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

官方示例
Push代码有两种方式:
1.使用Jenkins凭证中的用户名密码
2.使用Jenkins凭证中的SSH密钥
凭证管理官方文档

// This is currently the best way to push a tag (or a branch, etc) from a
// Pipeline job. It's not ideal - https://issues.jenkins-ci.org/browse/JENKINS-28335
// is an open JIRA for getting the GitPublisher Jenkins functionality working
// with Pipeline.

// credentialsId here is the credentials you have set up in Jenkins for pushing
// to that repository using username and password.
withCredentials([usernamePassword(credentialsId: 'git-pass-credentials-ID', passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
    sh("git tag -a some_tag -m 'Jenkins'")
    sh('git push https://${GIT_USERNAME}:${GIT_PASSWORD}@<REPO> --tags')
}

// For SSH private key authentication, try the sshagent step from the SSH Agent plugin.
sshagent (credentials: ['git-ssh-credentials-ID']) {
    sh("git tag -a some_tag -m 'Jenkins'")
    sh('git push <REPO> --tags')
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

代码简析:withCredentials使用凭证,credentialsId凭证ID,凭证中的usernameVariable用户名、passwordVariable密码赋予内部变量GIT_USERNAME、GIT_PASSWORD,在运行git push命令时使用。

10、再次拉取代码,防止循环构建

//再次拉取代码,防止Jenkins因Push触发自动编译,导致自动编译与版本修改的死循环
git(url: 'https://sleetdream@bitbucket.org/sleetdream/demo-hello.git', branch: 'master', credentialsId: 'sleetdream')
  • 1
  • 2

【注意】如果之前Push过代码,此处必须重新拉取一次。否则Jenkins触发器会认为本地版本与线上版本不一致,造成自动编译与版本修改的死循环

11、mvn编译打包

/**
 * 执行maven打包
 * -B --batch-mode 在非交互(批处理)模式下运行(该模式下,当Mven需要输入时,它不会停下来接受用户的输入,而是使用合理的默认值)
 * 打包时跳过JUnit测试用例
 * -DskipTests 不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下
 * -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类
 **/
sh 'mvn -B -DskipTests clean package'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

12、shell部署

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 &
"""
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

【注意】在sh调用脚本双引号和单引号存在区别,双引号可以使用变量,单引号不能使用变量
linux sh 三个单引号,Shell双引号和单引号有哪些不同

withEnv([‘JENKINS_NODE_COOKIE=dontkillme’]) 解决杀掉了所有子进程问题

(1)在Shell中引用Jenkins环境变量

sh """
echo ${POM_ARTIFACTID}
"""
  • 1
  • 2
  • 3

(2)在Shell中使用Shell变量

需要对$字符进行转义

sh """
artifactId = 'demo-hello'
echo \${artifactId}
"""
  • 1
  • 2
  • 3
  • 4

13、钉钉发送构建信息

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})",
                            '- 状态:<font color=#00CD00 >成功</font>',
                            "- 持续时间:${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})",
                            '- 状态:<font color=#EE0000 >失败</font>',
                            "- 持续时间:${currentBuild.durationString}".split("and counting")[0],
                            "- 执行人:${BUILD_USER}",
                            "- 提交日志: ${GIT_COMMIT_MSG}",
                    ]
            )
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

Jenkins DingTalk 钉钉通知插件

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/492187
推荐阅读
相关标签
  

闽ICP备14008679号