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)
在这段代码中我能访问env和params直接,符合市场预期.
但是在顶层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)
为什么会这样?根据所有的例子管道的文件,我应该能够访问env和params直接.我究竟做错了什么?
这是 的问题resolveStrategy。
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
Run Code Online (Sandbox Code Playgroud)
您config提供的 会将任何属性解析为其值或 null,因此owner不会对其进行查询。在您的示例中,owner只是this. 这就是它起作用的原因。
根据您实际想要实现的目标,OWNER_FIRST可能是更好的策略。如果您无法更改此设置,最好使用没有属性默认值的数据结构。