无法从模板化的管道参数中访问Jenkins参数

时间:2018-04-05 18:01:35

标签: templates jenkins groovy parameters jenkins-pipeline

我无法从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

2 个答案:

答案 0 :(得分:0)

您使用的是Closure.DELEGATE_FIRST策略,delegateMap。您的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而失败,因为NullPointerExceptiondelegate.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参数更改为。任何:

  1. Closure
  2. 管道的特定于域的对象
  3. 多个参数
  4. 例如,对于Map

    Map
    def call(Map args) {
      // ...
    } 
    

答案 1 :(得分:0)

解决方法:

properties([
    parameters([
        booleanParam(name: 'A', defaultValue: false, description: '')
    ])
])

def params = params  

myPipelineTemplate {
    arg1 = A
    arg2 = true
}