groovy 我可以检查环境变量是否存在于Jenkinsfile中吗

ioekq8ef  于 2023-04-19  发布在  Jenkins
关注(0)|答案(4)|浏览(327)

我正在为我的项目运行多分支管道。
Jenkinsfile的行为应该根据触发器而改变。有两个事件触发管道1.推送事件2.拉取请求。
我正在尝试检查环境变量'CHANGE_ID'('CHANGE_ID'仅适用于合并请求)。参考。
因此,如果pipeline由Push事件触发,并且如果检查'CHANGE_ID'变量,则会抛出异常(如果pipeline由Pull Request触发,则代码工作正常)。

验证码:

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)

我如何检查'CHANGE_ID'变量是否存在于Jenkinsfile中?

myzjeezk

myzjeezk1#

在使用之前,您可以检查它:

if (env.CHANGE_ID) {
 ...

医生给的
可从Scripted Pipeline访问的环境变量,例如:env.PATHenv.BUILD_ID。请参阅内置的全局变量参考,以获得完整的最新环境变量列表。

wvyml7n5

wvyml7n52#

下面是声明式管道的样子:

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 } }
r6hnlfcb

r6hnlfcb3#

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

when {
   anyOf {
      changeRequest()    // if pull request
      branch 'master'
      branch 'release/*'
   }
}
jgzswidk

jgzswidk4#

一些需要提前知道(或至少猜测)的事情:

  • Jenkins Groovy运行时使用env对象(?)来管理当前环境变量-这意味着不能保证任何env成员也会出现在“绑定”系统中
  • 某些成员(如WORKSPACE)可能仅在运行于node/agent/ws覆盖的上下文中时才存在。
  • 部分/全部(?)成员与env.<name><name>同时存在
  • 尝试访问env.<name>的不存在的成员将导致空,而对于相同的情况,访问<name>将引发故障。
  • 有一些特殊的成员将无法通过绑定或类似的分类系统来定位它们。

因此,我建议实现看起来像这样的代码:

if (env.WORKSPACE != null) {
    println "WORKSPACE=${WORKSPACE}"  // or ${env.WORKSPACE}
    // checking for an empty string value is now a simple story.
} else {
    println "WORKSPACE is null"
}

相关问题