在来自 Jenkins/groovy 的 shellscript 参数周围添加引号

adding quotes around shellscript parameter from Jenkins/groovy

我正在 Jenkins 中构建一个管道,在这个管道中,我调用了一个 shellscript:sh "helm upgrade --install $app --set myVar=$myVar"

现在,在我本地计算机的终端中尝试此操作后,我发现对于 myVar 的某些值,需要在命令行中引用它。 (具体来说,我传递的是 YAML 列表,例如:"{foo,bar,baz}"

现在看来这并不像看起来那么简单。我的第一次尝试是:

sh "helm upgrade --install $app --set myVar='$myVar'"

但在日志中,我们看到最终 运行 的命令看起来像

sh helm upgrade --install appname --set myvar={foo,bar,baz}

令人沮丧的是,helm 没有以正确的方式解析它。

所以我心想,"double quotes would work too",然后我尝试:

sh "helm upgrade --install appname --set myvar=\"$myVar\""

但是,唉,日志讲述了同样的故事:

sh helm upgrade --install appname --set myvar={foo,bar,baz}

所以。我如何说服我的 jenkins-pipeline 运行 命令作为

sh "helm upgrade --install appname --set myvar="{foo,bar,baz}"

另外,为什么这不能按预期工作?

我 运行 前段时间遇到过类似的问题,这个问题的解决方案非常简单,但非常违反直觉。您必须使用三重反斜杠转义双引号。看看这个非常简单的例子:

node {
    stage('Test') {
        sh "echo \\"Lorem ipsum dolor sit amet\\""
    }
}

这是控制台输出:

[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
[test-pipeline] Running shell script
+ echo "Lorem ipsum dolor sit amet"
"Lorem ipsum dolor sit amet"
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS