【问题标题】:Jenkins text parameter - special characters garbled (unwanted variable substitution)Jenkins 文本参数 - 特殊字符乱码(不需要的变量替换)
【发布时间】:2015-02-12 05:30:32
【问题描述】:

我在 Jenkins(在 Linux 下)有一份工作,build parameter 类型为“Text”。我使用该参数来形成构建过程中使用的文件的内容,使用 bash “shell 执行”步骤,如 echo "$TEXTPARAM" > file

如果有通用文本,它会很好地工作。但是当出现像“$”这样的字符时,它的行为就很奇怪了。

E. G。文字

Some $one and $$two and $$$more bucks and $ bucks $$ that $$$ stand alone and$ after$$ words$$$

变成了

Some $one and $two and $-sl bucks and $ bucks $ that $$ stand alone and$ after$ words$$

虽然我希望文本出现在文件中,就像它出现在输入文本框中一样。

这是 jenkins 中的错误(所以我应该向他们的跟踪器发布问题)还是我做错了什么?

更新 我想这是由于 Jenkins 完成了变量替换。即在执行任何“shell 执行”步骤之前,所有$VARNAMEs 都被 VARNAME 值替换。而这个替换 cannot be turned off 就目前而言。

【问题讨论】:

    标签: bash parameters jenkins


    【解决方案1】:

    根据这张票https://issues.jenkins-ci.org/browse/JENKINS-16143的评论

    这似乎不是错误。比较参数值 $JENKINS_URL 和 $$JENKINS_URL。 Jenkins 在内部解析变量中的占位符, 美元就是用来做这件事的。 $$ 是转义的 $。

    我在 Jenkins 版本上观察到字符串和文本字段的相同行为。 1.562

    【讨论】:

    • 即使输出中的$-sl 而不是$$$more 也不是bug? :) 我相信没有定义 $more 变量...
    • 哦等等...$$$moaaare 输出为$$moaaare
    • 好吧,它确实像现在一样替代了变量。他们的追踪器中有one more ticket
    【解决方案2】:

    使用 jenkins-cli.jar 进行扩展

    确实,Jenkins 扩展了构建变量名称,例如 JENKINS_URLBUILD_NUMBER,当它们以 $ 为前缀时。但是,如果您使用 jenkins-cli.jar,还有其他一些转换——相当出乎意料的转换。

    • 回车变成\r(反斜杠+“r”)
    • 新行变为\n(反斜杠加“n”)
    • 制表符变为\t(反斜杠加“t”)

    这里是corresponding part of the source code of jenkins-cli.jar

    在使用 jenkins-cli.jar 时,我不知道任何转义或引用来保留作为 Jenkins 作业参数值的一部分的空格字符的方法

    使用“原始”ssh 时的扩展(没有 jenkins-cli.jar)

    Jenkins master 在命令行上处理空格、反斜杠和引号有点像 shell:

    • a 仍然是 a
    • 'a' 变为 a
    • "a b" 变为 a b
    • a b是一个错误,因为Jenkins的命令行解析器会看到b
    • a" " 变为 a(“a”加空格)

    我的想法是重新实现在 jenkins-cli.jar 中进行引用的代码(减去处理制表符等时的错误)。所以这是我的食谱:

    对于每个参数,转义每个反斜杠和 每个单引号都带有反斜杠。 然后用单引号括起来。

    示例:发送'a\'"b',而不是a'"b

    这已被证明可以保护空白和引号。而不是使用单引号,您可以使用双引号。

    测试管道

    这是我的测试方式:我使用字符串参数“PARAM”和以下脚本创建了管道test-quoting

    import groovy.json.JsonOutput
    node {
        println JsonOutput.toJson(env.PARAM)
    }
    

    然后我启动了管道(在 bash 中),添加了一个额外的引用层,本地 shell 将删除:

    # for testing 'a b'
    $ ssh -x -p 50022 <jenkins-server> -l <user-name> build -s -v test-quoting -p PARAM="'a b'"
    
    # for testing the behaviour of the cli with tab character
    $ java -jar jenkins-cli.jar -ssh -s <jenkins-url> -user <user-name> build -s -v test-quoting -p PARAM="$(printf '\t')"
    

    如果您不确定本地 shell 真正传递给 ssh(或任何其他命令)的内容,请在命令前加上 strace -e execve

    【讨论】:

      【解决方案3】:

      这与詹金斯无关。

      使用echo "some $$$more" &gt; file 编写一个 bash 脚本并在 linux 命令提示符下执行该脚本,您将得到相同的乱码。

      特殊字符,如$ 必须转义,因为这是一个linux 环境,$ 表示一个变量。有几种方法可以做到这一点。

      选项 1。
      使用按字符转义,即对于您想要按字面显示的每个$,请改用\$。于是就变成了:
      echo "some \$\$\$more" &gt; file

      选项 2。
      使用 strong-quoting,即单引号 '。单引号内没有任何特殊含义,除了用于关闭字符串的第二个单引号:
      echo 'some $$$more' &gt; file
      当然,使用这种方法,您必须确保您的 $TEXTPARAM 字符串没有任何自己的单引号。

      在任何一种情况下,您都必须清理您的输入。在将其输出到文件之前,您需要解析 $TEXTPARAM 的内容并将所有 $ 替换为 \$ 并使用选项 1。或者在输出之前解析您的 $TEXTPARAM 并删除所有单引号 '使用选项 2 归档。

      编辑

      在你的情况下,我想你只是想要:
      echo $TEXTPARAM &gt; file 没有任何额外的引号

      root@ ~ $ cat test.sh
      #!/bin/bash
      TEXTPARAM='Some $one and $$two and $$$more bucks and $ bucks $$ that $$$ stand alone and$ after$$ words$$$'
      echo $TEXTPARAM
      echo $TEXTPARAM > file
      cat file
      root@ ~ $ ./test.sh
      Some $one and $$two and $$$more bucks and $ bucks $$ that $$$ stand alone and$ after$$ words$$$
      Some $one and $$two and $$$more bucks and $ bucks $$ that $$$ stand alone and$ after$$ words$$$
      

      【讨论】:

      • 我假设 Jenkins 做了变量替换。 Here 是我这样想的动力。
      • 再一次,将相同的内容放入任何 shell 脚本中,您会得到相同的结果。我只是从你的链接做的。詹金斯什么也没做。研究 Jenkins 如何执行“Shell Command”构建步骤。它根据您(逐字)编写的行创建一个临时的.sh 脚本并执行该脚本。研究控制台输出,您可以看到它制作的这个临时 shell 脚本的名称和路径。在您的脚本中添加sleep,您甚至可以在执行期间将该临时脚本复制到某处并稍后查看(甚至重新启动)它。任何替换都由 shell 完成,就像在任何其他 shell 脚本上一样
      • 我已经解释了如何在 shell 替换中处理特殊字符。
      • 还是想不通。我在詹金斯有一个构建参数。文本构建参数。它的内容由 Jenkins 放在名为 $TEXTPARAM 的变量中。然后我想选择你的“选项2”。我应该在“Shell 命令”中写什么? echo '$TEXTPARAM'???
      • @AndreyRegentov 是的,只要没有人在该构建参数中键入 '
      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多