如何逃避Jenkins参数化构建变量

时间:2014-05-22 21:11:36

标签: jenkins escaping

我使用Jenkins ver. 1.522并且我想在参数化构建部分中传递一个带空格和引号的长字符串作为参数。该作业只运行python脚本。

我的问题是我无法找到逃脱字符串的方法,以便jenkins将其正确传递给脚本。

...假设

字符串:fixVersion in ("foo") AND issuetype in (Bug, Improvement) AND resolution = Fixed ORDER BY resolution ASC, assignee ASC, key DESC

变量名称:bar

脚本名称:coco.py

当我在终端中运行脚本时,一切都很好:python coco.py --option 'fixVersion in ("foo") AND issuetype in (Bug, Improvement) AND resolution = Fixed ORDER BY resolution ASC, assignee ASC, key DESC'

当我使用参数化构建与jenkins运行相同的脚本并尝试转义变量以使其最终被py脚本作为一个参数时,它被jenkins奇怪地想象。

在我的jenkins工作中,我称之为脚本:python coco.py --option \'${BAR}\'

最终成为:

python coco.py --option '"fixVersion' in '('\''foo'\'')' AND issuetype in '(Bug,' 'Improvement)' in '(Production,' 'Stage)' AND resolution = Fixed ORDER BY resolution ASC, assignee ASC, key 'DESC"'

我还尝试了\"${BAR}\"\"$BAR\"\'$BAR\'

正确的方法是什么呢?

2 个答案:

答案 0 :(得分:6)

尝试

python coco.py --option "${BAR}"

或者,如果您需要围绕所有内容的单引号

python coco.py --option \'"${BAR}"\'

在您列出的案例中,bash会将空格视为分隔符。在变量周围加上双引号将保留字符串中的空格。实施例

aString='foo bar'
for x in $aString; do echo $x; done
# foo
# bar
for x in "$aString"; do echo $x; done
# foo bar

答案 1 :(得分:0)

我正在使用Jenkins v1.606并遇到同样的问题! 我看到将包含空格的用户定义字符串参数传递给执行shell的问题不能正确格式化字符串(仅使用具有1个或多个空格的参数)。您需要注意的是检查'输出'登录。 Jenkins将无法在日志中正确显示字符串参数值。

示例包含空格的正确格式):

docker exec -i container-base /bin/bash -c "cd /container/path/to/code/ && ./gradlew test_xml -P DISPLAY_NAME='${DISPLAY_NAME}' -P USERNAME='${USERNAME}' -P SERVER_NAME='${SERVER_NAME}'"
字符串的

Jenkins输出(注意字符串值格式):

+ docker exec -i container-base /bin/bash -c 'cd /container/path/to/code/ && ./gradlew test_xml -P DISPLAY_NAME='\''VM10 USER D33PZ3R0'\'' -P USERNAME='\''d33pz3r0@stackoverflow.com'\'' -P SERVER_NAME='\''stackoverflow.com'\'''

<强>结论: 在我的示例中,文字命令用&lt;&#34;&gt;封装,然后用&lt;&#39;&gt;包围参数。转义文字cmd字符串并控制Jenkins字符串语法。记住不要只看你的詹金斯输出日志,因为它导致我错误一整天,而我与之斗争!对于您的问题,这应该是相同的,您不需要使用\&#39;或其他转义字符。希望这可以帮助!!