我在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。
答案 0 :(得分:2)
根据此机票https://issues.jenkins-ci.org/browse/JENKINS-16143
中的评论这似乎不是一个错误。比较参数值$ JENKINS_URL和$$ JENKINS_URL。 Jenkins在内部解析变量中的占位符, 和美元用于此。 $$是逃脱的$。
我在Jenkins ver上观察字符串和文本字段的相同行为。 1.562
答案 1 :(得分:1)
是的,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作业的参数值的一部分
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$$$