簡體   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