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

时间:2018-06-21 14:58:47

标签: shell jenkins groovy kubernetes-helm

我正在詹金斯(Jenkins)中建立一个管道,在这个管道中,我称为shellscript:name is undefined

现在,在本地计算机上的终端中尝试此操作后,我发现对于sh "helm upgrade --install $app --set myVar=$myVar"的某些值,需要在命令行上将其引用。 (具体来说,我正在传递一个YAML列表,例如:myVar

现在事实证明,这并不像看起来那样简单。我的第一次尝试是:

"{foo,bar,baz}"

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

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

令人沮丧的是,无法通过头盔正确解析。

所以我想,“双引号也可以”,我尝试:

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

但是,日志记录了同样的古老故事:

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

所以。我如何说服我的jenkins-pipeline以

运行命令
sh helm upgrade --install appname --set myvar={foo,bar,baz}

而且,为什么这不能按预期工作?

1 个答案:

答案 0 :(得分:4)

前段时间,我遇到了类似的问题,该问题的解决方案非常简单,但却非常直观。您必须使用双反斜杠转义双引号。看一下这个非常简单的示例:

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