jenkins - 为什么在 Jenkinsfile 的 DSL 闭包中使用 `this` 或 `env` 时需要关键字 `param`

标签 jenkins groovy jenkins-pipeline

我有基于 "structured DSL" 的代码概念。

// vars/buildStuff.groovy
def call(body) {

    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()

    node {
        assert env
        assert params
        doStuff()
    }
} 

在此代码中,我可以访问 envparams直接,正如预期的那样。

然而在顶级Jenkinsfile :
buildStuff {
    someParam=params.SOME_PARAM
    buildId=env.BUILD_ID
}

原因 java.lang.NullPointerException: Cannot get property 'SOME_PARAM' on null object .我必须通过将其写为以下内容来解决这个问题:
buildStuff {
    someParam=this.params.SOME_PARAM
    buildId=this.env.BUILD_ID
}

为什么会这样?根据 Pipelines documentation 中的所有示例我应该可以访问 envparams直接地。
我究竟做错了什么?

最佳答案

这是 resolveStrategy 的问题.

def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
config您提供的任何属性将解析为其值或空值,因此 owner没有查询它。在你的例子中 owner只是 this .这就是它起作用的原因。

取决于您实际尝试实现的目标,OWNER_FIRST可能是更好的策略。如果您无法更改此设置,最好使用没有属性默认值的数据结构。

关于jenkins - 为什么在 Jenkinsfile 的 DSL 闭包中使用 `this` 或 `env` 时需要关键字 `param`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44080531/

相关文章:

从 Jenkins 开始,Tomcat 上出现 java.security.PrivilegedActionException : sun. nio.fs.UnixException

grails - 设置全局变量并在Grails Controller 中访问它们

unit-testing - 使用 StaticLoggerBinder 对类进行单元测试

java - Groovy 使用递归目录搜索查找文件的最新版本

docker - Jenkins 管道DOCKER_HOST

jenkins - 当其中一个阶段中止时如何标记构建成功?

jenkins - 是否可以在 Open JDK 8 中编译代码并在 Oracle JRE 中运行?

git - Jenkins - 如何建立一个特定的分支

groovy - 如何获取 Jenkins 上的构建步骤触发的构建的 url?

ios - Worklight iOS native 构建在 Jenkins 上失败