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

var*_*tec 6 groovy jenkins jenkins-pipeline

我有基于"结构化DSL"概念的代码.

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

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

    node {
        assert env
        assert params
        doStuff()
    }
} 
Run Code Online (Sandbox Code Playgroud)

在这段代码中我能访问envparams直接,符合市场预期.

但是在顶层Jenkinsfile:

buildStuff {
    someParam=params.SOME_PARAM
    buildId=env.BUILD_ID
}
Run Code Online (Sandbox Code Playgroud)

原因java.lang.NullPointerException: Cannot get property 'SOME_PARAM' on null object.我必须通过写这个来解决这个问题:

buildStuff {
    someParam=this.params.SOME_PARAM
    buildId=this.env.BUILD_ID
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?根据所有的例子管道的文件,我应该能够访问envparams直接.我究竟做错了什么?

tyn*_*ynn 4

这是 的问题resolveStrategy

def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
Run Code Online (Sandbox Code Playgroud)

config提供的 会将任何属性解析为其值或 null,因此owner不会对其进行查询。在您的示例中,owner只是this. 这就是它起作用的原因。

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