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 的情况下不起作用的主要内容,如果未能解决你的问题,请参考以下文章

jenkins之-通过API方式调用

Pipeline build step with parameters

[Jenkins] Define a pipeline

在 Jenkins 2 Pipeline 中执行 SonarQube Scanner

jenkins 构建nodejs-pipeline流水风格的任务

詹金斯:步骤和步骤之间的区别