Jenkins Pipeline Step withEnv 在没有 BASH 的情况下不起作用
Posted
技术标签:
【中文标题】Jenkins Pipeline Step withEnv 在没有 BASH 的情况下不起作用【英文标题】:Jenkins Pipeline Step withEnv does not work without BASH 【发布时间】:2017-04-02 00:13:51 【问题描述】:我在为 Jenkins 管道中的容器设置环境变量时遇到了麻烦。 看来,“withEnv”在没有 bash 的机器上不能很好地工作。
你能确认一下吗?我找不到官方声明;-)
当我在 Jenkins slave 上运行以下 sn-p 时,它可以工作。 但是当它在没有 BASH 的 docker 容器中执行时,没有设置“$test”。
withEnv(["test='asd'"])
sh 'echo $test'
https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv-code-set-environment-variables
【问题讨论】:
“test”是 groovy 变量还是 bash 变量? test 应该成为一个 bash 变量(在块中)。 可能Jenkins节点将变量传递给运行docker的子shell,但是docker没有将环境变量传递给自己的子shell;试试这个:***.com/a/30494145/1388202 【参考方案1】:如果我没记错的话,我认为变量设置不正确。
试试这个:
withEnv(["test=asd"])
sh "echo \$test"
在 Jenkins 流水线中:
$var = Groovy parameter
\$var (within a sh closure) = Bash parameter
$var = also refers to Groovy parameter
为了在 bash 变量中插入一个 groovy 变量:
sh ("VAR=$GROOVY_VAR")
在 sh 闭包中使用 bash 变量:
sh (" echo \$BASH_VAR")
【讨论】:
总的来说,我同意。这是它应该工作的方式。虽然,由于最初的 sn-p 使用刻度,它也应该工作。但是当我选择一个 linux 非常有限的容器时,withEnv 不再起作用 - 只是没有设置变量。【参考方案2】:在 Jenkins 中使用 withEnv 时必须使用单引号。
withEnv(['test=asd'])
sh "echo \$test"
因为,变量扩展是由 Bourne shell 完成的,而不是 Jenkins。 (引用自文档)
在此处查找更多信息:https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/
【讨论】:
以上是关于Jenkins Pipeline Step withEnv 在没有 BASH 的情况下不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Pipeline build step with parameters
在 Jenkins 2 Pipeline 中执行 SonarQube Scanner