我无法从A
的范围访问任何Jenkins参数(例如:myPipelineTemplate
,如下所示)。
来自Jenkinsfile
文件:
library 'myPipelineTemplate'
properties([
parameters([
booleanParam(name: 'A', defaultValue: false, description: '')
])
])
myPipelineTemplate {
arg1 = A
arg2 = true
}
来自管道模板:
def call(body) {
def args = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = args
body()
echo "$args.arg1" // return (null)
echo "$args.arg2" // return (true)
pipeline {
...
}
任何领导?
编辑:Jenkins ver。 2.107.1答案 0 :(得分:0)
您使用的是Closure.DELEGATE_FIRST
策略,delegate
是Map
。您的arg2 = true
分配了该属性,但A
属性查找是该地图上的键查找,这就是分配null
的原因。 A
属性查找永远不会在最终委托给owner
的{{1}}上下文中完成。
使用您的委派策略,调用类似如下:
params.A
其中delegate.arg1 = delegate.A
delegate.arg2 = true
是delegate
。在这种情况下,def args = [:]
处理属性查找。值为delegate
,然后将其分配给null
。通话结束后,您的地图为delegate.arg1
。如果您将其更改为[arg1:null, arg2:true]
,则params.A
会因delegate.params.A
而失败,因为NullPointerException
为delegate.params
。
要确保将来电解析给所有者,您可以使用null
(请参阅this question/answer for meaning of this
in a Closure
):
this.params
您还可以更改解决方案策略:
myPipelineTemplate {
arg1 = this.params.A
arg2 = true
}
body.resolveStrategy = Closure.OWNER_FIRST
我建议您将delegate.arg1 = A
delegate.arg2 = true
方法从call
参数更改为。任何:
Closure
例如,对于Map
:
Map
def call(Map args) {
// ...
}
答案 1 :(得分:0)
解决方法:
properties([
parameters([
booleanParam(name: 'A', defaultValue: false, description: '')
])
])
def params = params
myPipelineTemplate {
arg1 = A
arg2 = true
}