44

我正在为我的项目运行 Multibranch 管道。

Jenkinsfile 的行为应该根据触发器而改变。触发管道的事件有两个 1. Push 事件 2. Pull Request。

我正在尝试检查环境变量“CHANGE_ID”(“CHANGE_ID”仅可用于拉取请求)。参考

因此,如果管道由推送事件触发,并且如果检查“CHANGE_ID”变量,则会引发异常(如果管道被拉取请求触发,代码工作正常)。

代码:

stage('groovyTest'){
    node('mynode1') {
        if (CHANGE_ID!=NULL){
            echo "This is Pull request"
        }else{
            echo "This is Push request"
        }
    }
}

错误:

groovy.lang.MissingPropertyException: No such property: CHANGE_ID for class: groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:224)
    at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:221)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:221)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:28)
    at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
    at WorkflowScript.run(WorkflowScript:5)
    at ___cps.transform___(Native Method)

如何检查 Jenkinsfile 中是否存在“CHANGE_ID”变量?

4

3 回答 3

72

您可以在使用前检查它:

 if (env.CHANGE_ID) {
 ...

文档

可从脚本化管道访问的环境变量,例如:env.PATHenv.BUILD_ID. 有关Pipeline 中可用的完整且最新的环境变量列表,请参阅内置的全局变量参考。

于 2017-08-18T15:23:10.500 回答
40

这就是声明性管道的样子:

pipeline {
    // ...
    stages {
        // ...
        stage('Build') {
            when {
                allOf {
                    expression { env.CHANGE_ID != null }
                    expression { env.CHANGE_TARGET != null }
                }
            }
            steps {
                echo "Building PR #${env.CHANGE_ID}"
            }
        }
    }
}

仅在构建 PR 时运行阶段:

when { expression { env.CHANGE_ID == null } }
于 2018-02-02T11:53:37.493 回答
7

您还可以使用changeRequest()when 子句中的函数来检查 PR:

when {
   anyOf {
      changeRequest()    // if pull request
      branch 'master'
      branch 'release/*'
   }
}
于 2019-12-24T09:14:49.273 回答