小编典典

将Jenkins构建参数传递给管道节点

jenkins

我创建了一个新的詹金斯管道。(当前)使用单个名为的布尔选项对管道进行参数化VAR_A。我的管道脚本是:

node ('windows') {
    echo "$VAR_A"
    bat 'env'
}

当我手动创建带有VAR_A选中项的项目时,将按预期回显“ true”。但是,环境变量列表未显示VAR_A=true

我能够env显示VAR_A是否将呼叫包装在一个withEnv块中:

node ('windows') {
    echo "$VAR_A"
    withEnv(["VAR_A=$VAR_A"]) {
        bat 'env'
    }
}

我将拥有比这更多的参数,因此不需要单独指定每个参数。 有没有办法将所有构建参数传送到节点的环境?


阅读 449

收藏
2020-07-25

共1个答案

小编典典

关键是,在管道脚本中,作业参数不会像常规作业一样自动注入到环境中。每个参数都成为Pipeline脚本绑定的变量。因此,您可以直接按名称访问它们。

在您的示例中,echo "$VAR_A"变量替换是由groovy在脚本的上下文中执行的(请参阅Groovy
doc关于字符串插值的文档
)。这就是为什么您在bat输出中看不到它的原因。

对于要注入的每个参数,您需要env.VAR_A = VAR_A在脚本的开头添加一行:
它可以在代码node块之外,因为env在整个脚本中是全局的。

另外,还有一种方法可以将所有脚本变量(包括参数,甚至管道内置变量)添加steps到环境中。不幸的是,它需要一些白名单才能在沙箱中运行:

@NonCPS
def populateEnv(){ binding.variables.each{k,v -> env."$k" = "$v"} }
populateEnv()

示例: VAR_A 是一个参数。脚本主体:

def AAAA = 1 // such a definition doesn't put variable in the binding
BBBB = 2     // creates a binding variable. Absolutely the same behavior as for a job parameter.

@NonCPS
def populateEnv(){ binding.variables.each{k,v -> env."$k" = "$v"} }
populateEnv() // at this point injection happens

CCCC = 3      // created after the injection hence it won't appear in env.
node ('windows') {
    bat 'env'
}

bat输出中,您将找到VAR_ABBBB

除非您的工作具有数十个参数定义的IMO,否则将env.VAR_A = VAR_A首选方法,因为这种方法更简单,直接并且不需要批准。

2020-07-25