【问题标题】:adding quotes around shellscript parameter from Jenkins/groovy在 Jenkins/groovy 的 shellscript 参数周围添加引号
【发布时间】:2018-06-21 14:58:47
【问题描述】:

我正在 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 没有正确解析。

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

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

另外,为什么这没有按预期工作?

【问题讨论】:

    标签: shell jenkins groovy kubernetes-helm


    【解决方案1】:

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

    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
    

    【讨论】:

    • 这就是解决方案。 “三重反斜杠”实际上是` \\ `(转义的反斜杠)和\"(转义的双引号)-sh 构建步骤在脱壳之前执行自己的参数扩展,这意味着转义的引号被构建将传递给 shell 的命令的过程。要将文字 " 传递给实际的 bash shell 命令,您需要转义 both 反斜杠和双引号。
    • 哦,旧的“越狱”技巧!为什么我没有想到呢?我会试一试并尽快报告,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多