繁体   English   中英

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

[英]Cannot access Jenkins parameters from a templatized pipeline argument

我无法从myPipelineTemplate的范围访问任何Jenkins参数(例如: A如下)。

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 {
        ...
    }

有铅吗?

编辑:詹金斯版。 2.107.1

您正在使用Closure.DELEGATE_FIRST策略,并且delegateMap 您的arg2 = true会分配属性,但是A属性查找是该映射上的键查找,这就是分配为null 永远不会在owner上下文上进行A属性查找,该owner上下文最终将委托给params.A

使用您的委派策略,调用看起来像这样:

delegate.arg1 = delegate.A
delegate.arg2 = true

其中delegatedef args = [:] 在这种情况下, delegate处理属性查找。 该值为null ,然后将其分配给delegate.arg1 调用后的地图为[arg1:null, arg2:true] 如果您将其更改为params.A ,它会像delegate.params.A这将失败, NullPointerException ,因为delegate.paramsnull

为了确保呼叫解决车主,你也可以使用this.params (见的意义这个问题/答案thisClosure ):

myPipelineTemplate {
    arg1 = this.params.A
    arg2 = true
}

您还可以更改解析策略:

body.resolveStrategy = Closure.OWNER_FIRST
delegate.arg1 = A
delegate.arg2 = true

我建议仅将您的call方法从Closure参数更改为。 任何:

  1. Map
  2. 管道的域特定对象
  3. 多个参数

例如,对于Map

def call(Map args) {
  // ...
} 
myPipelineTemplate([
    arg1: params.A
    arg2: true
])

解决方法:

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

def params = params  

myPipelineTemplate {
    arg1 = A
    arg2 = true
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM