我创建了一个新的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'
}
}
我会提供比这更多的参数,因此不需要单独指定每个参数。 有没有办法将所有构建参数传输到节点的环境?
答案 0 :(得分:10)
关键是在管道脚本中,作业参数不会像常规作业一样自动注入环境。每个参数都成为管道脚本binding的变量。因此,您可以直接通过名称访问它们。
在您的示例echo "$VAR_A"
中,变量替换由脚本上下文中的groovy执行(请参阅Groovy doc on strings interpolation)。这就是为什么你没有在bat
输出中看到它。
对于要注入的每个参数,您需要添加如下所示的行:
脚本开头的env.VAR_A = VAR_A
。它可以在node
块之外,因为env
在整个脚本中是全局的。
或者,有一种方法可以将所有脚本变量(包括参数甚至是Pipeline内置变量,即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_A
和BBBB
。
IMO,除非你的工作定义了数十个参数env.VAR_A = VAR_A
方法更为简单,直接,不需要批准。