将 Jenkins 构建参数传递给管道节点
Pass Jenkins build parameters to pipeline nodes
我创建了一个新的 Jenkins 管道。管道(当前)使用名为 VAR_A
的单个布尔选项进行参数化。我的管道脚本是:
node ('windows') {
echo "$VAR_A"
bat 'env'
}
当我在选中 VAR_A
的情况下手动构建项目时,如预期的那样回显了 "true"。但是,环境变量列表不显示 VAR_A=true
.
如果我将调用包装在 withEnv
块中,我能够让 env
显示 VAR_A
:
node ('windows') {
echo "$VAR_A"
withEnv(["VAR_A=$VAR_A"]) {
bat 'env'
}
}
我将提供比这更多的参数,因此不需要单独指定每个参数。 有没有办法将所有构建参数传输到节点环境?
重点是在流水线脚本中,作业参数不会像常规作业那样自动注入到环境中。每个参数都成为流水线脚本的一个变量binding。因此,您可以直接通过名称访问它们。
在您的示例中,echo "$VAR_A"
变量替换由 groovy 在您的脚本上下文中执行(参见 Groovy doc on strings interpolation)。这就是为什么您在 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_A
和 BBBB
。
IMO,除非您的工作定义了数十个参数env.VAR_A = VAR_A
首选方法,因为它更简单、直接且不需要批准。
在构建作业步骤中动态传递节点是一个很好的功能。它有助于 运行 在不同节点上并行执行多个作业。在 Jenkins 管道脚本中添加以下脚本可能会有所帮助。
def build_one()
{
parallel one: {
stage('XYZ') {
catchError(buildResult: 'SUCCESS', stageResult:'FAILURE') {
build job: 'yourDownStreamJob', parameters: [[$class: 'NodeParameterValue', name: 'NodeToRun',labels: ['nodeName'], nodeEligibility: [$class: 'AllNodeEligibility']], string(name: 'ParentBuildName', value: "XX"), string(name: 'Browser', value: 'chrome'), string(name: 'Environment', value: 'envName')]
}
}
},
two : {
stage('SecondArea') {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
build job: 'yourDownStreamJob', parameters: [[$class: 'NodeParameterValue', name: 'NodeToRun',labels: ['Your'], nodeEligibility: [$class: 'AllNodeEligibility']], string(name: 'ParentBuildName', value: "XYX"), string(name: 'Browser', value: 'firefox'), string(name: 'Environment', value: 'envName')]
}
}
}
}
build_one()
我创建了一个新的 Jenkins 管道。管道(当前)使用名为 VAR_A
的单个布尔选项进行参数化。我的管道脚本是:
node ('windows') {
echo "$VAR_A"
bat 'env'
}
当我在选中 VAR_A
的情况下手动构建项目时,如预期的那样回显了 "true"。但是,环境变量列表不显示 VAR_A=true
.
如果我将调用包装在 withEnv
块中,我能够让 env
显示 VAR_A
:
node ('windows') {
echo "$VAR_A"
withEnv(["VAR_A=$VAR_A"]) {
bat 'env'
}
}
我将提供比这更多的参数,因此不需要单独指定每个参数。 有没有办法将所有构建参数传输到节点环境?
重点是在流水线脚本中,作业参数不会像常规作业那样自动注入到环境中。每个参数都成为流水线脚本的一个变量binding。因此,您可以直接通过名称访问它们。
在您的示例中,echo "$VAR_A"
变量替换由 groovy 在您的脚本上下文中执行(参见 Groovy doc on strings interpolation)。这就是为什么您在 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_A
和 BBBB
。
IMO,除非您的工作定义了数十个参数env.VAR_A = VAR_A
首选方法,因为它更简单、直接且不需要批准。
在构建作业步骤中动态传递节点是一个很好的功能。它有助于 运行 在不同节点上并行执行多个作业。在 Jenkins 管道脚本中添加以下脚本可能会有所帮助。
def build_one()
{
parallel one: {
stage('XYZ') {
catchError(buildResult: 'SUCCESS', stageResult:'FAILURE') {
build job: 'yourDownStreamJob', parameters: [[$class: 'NodeParameterValue', name: 'NodeToRun',labels: ['nodeName'], nodeEligibility: [$class: 'AllNodeEligibility']], string(name: 'ParentBuildName', value: "XX"), string(name: 'Browser', value: 'chrome'), string(name: 'Environment', value: 'envName')]
}
}
},
two : {
stage('SecondArea') {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
build job: 'yourDownStreamJob', parameters: [[$class: 'NodeParameterValue', name: 'NodeToRun',labels: ['Your'], nodeEligibility: [$class: 'AllNodeEligibility']], string(name: 'ParentBuildName', value: "XYX"), string(name: 'Browser', value: 'firefox'), string(name: 'Environment', value: 'envName')]
}
}
}
}
build_one()