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

Tim*_*per 6 jenkins jenkins-pipeline

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

node ('windows') {
    echo "$VAR_A"
    bat 'env'
}
Run Code Online (Sandbox Code Playgroud)

当我使用VAR_Achecked 手动构建项目时,会按预期回显"true".但是,环境变量列表未显示VAR_A=true.

如果我在一个块中包装调用,我能够env显示:VAR_AwithEnv

node ('windows') {
    echo "$VAR_A"
    withEnv(["VAR_A=$VAR_A"]) {
        bat 'env'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

izz*_*kil 10

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

在您的示例中,echo "$VAR_A"变量在脚本的上下文中由groovy执行(请参阅字符串插值的Groovy doc).这就是你没有在bat输出中看到它的原因.

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

或者,有一种方法可以添加所有脚本变量,包括参数甚至是Pipeline内置变量,即添加steps到环境中.不幸的是,它需要在沙箱中运行一些白名单:

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

示例: 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'
}
Run Code Online (Sandbox Code Playgroud)

bat输出中你会发现VAR_ABBBB.

IMO,除非你的工作有数十个参数定义env.VAR_A = VAR_A方法是首选的更简单,直接,不需要批准.