我有基于 "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()
}
}
在此代码中,我可以访问
env
和 params
直接,正如预期的那样。然而在顶级
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 中的所有示例我应该可以访问
env
和 params
直接地。我究竟做错了什么?
最佳答案
这是 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/