Jenkins文本参数 - 特殊字符乱码(不需要的变量替换)

时间:2015-02-12 05:30:33

标签: bash parameters jenkins

我在Jenkins(在Linux下)找到了一份build parameter类型" Text"的工作。我使用参数来构建在构建过程中使用的文件的内容,使用bash" shell execute"步骤如echo "$TEXTPARAM" > file

如果有一般文字,它的效果很好。但是当像#" $"出现 - 它表现得很奇怪。

电子。 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执行"之前,所有$VARNAME都被VARNAME值替换。执行步骤。现在替换cannot be turned off

3 个答案:

答案 0 :(得分:2)

根据此机票https://issues.jenkins-ci.org/browse/JENKINS-16143

中的评论
  

这似乎不是一个错误。比较参数值$ JENKINS_URL和$$ JENKINS_URL。   Jenkins在内部解析变量中的占位符,   和美元用于此。 $$是逃脱的$。

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

答案 1 :(得分:1)

使用jenkins-cli.jar进行扩展

是的,Jenkins以JENKINS_URL为前缀,扩展了BUILD_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主服务器在命令行上处理空格,反斜杠和引号,就像外壳程序一样:

  • 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

答案 2 :(得分:-1)

这与詹金斯无关。

echo "some $$$more" > file编写一个bash脚本并在linux命令提示符下执行它,你会得到同样的乱码。

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

选项1.
使用按字符转义,即对于您希望按字面意思显示的每个$,请改用\$。所以它变成:
echo "some \$\$\$more" > file

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

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

修改

在你的情况下,我认为你只是想:
echo $TEXTPARAM > 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$$$