gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:58:30 29 4
gpt4 key购买 nike

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

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'
}
}

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

最佳答案

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

在您的示例中 echo "$VAR_A"变量替换由 groovy 在脚本上下文中执行(参见 Groovy doc on strings interpolation)。这就是为什么您在 bat 中看不到它的原因输出。

对于要注入(inject)的每个参数,您需要添加如下一行: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_ABBBB .

IMO 除非您的工作定义了数十个参数 env.VAR_A = VAR_A首选方法是更简单、直接且不需要批准。

关于jenkins - 将 Jenkins 构建参数传递给管道节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37079913/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com