【发布时间】:2016-05-09 22:10:40
【问题描述】:
我正在尝试从 Jenkins 中的分支名称(Ubuntu 12.04 上的 1.617)中提取 Jira 故事编号,以便我的 Maven 部署(Web 应用程序)可以使用该 Jira 编号来标记应用程序名称。如果没有 Jira 故事编号,我希望分支被标记为“bugfix”。
例如,我签入分支ABC-123_Some_Feature。 Jenkins 发现有人签入并构建了项目。然后提取“ABC-123”部分并将应用程序部署到http://my-dev-server/ABC-123。
除了正则表达式之外,我的所有这些工作都很好。特别是通过 Jenkins 运行时的正则表达式。
为了大大简化问题,在托管我们的 Jenkins 实例的 Ubuntu 12 机器上,我可以通过命令行执行以下操作:
xxx@yyy:/$ [[ abc_ABC-123_def =~ (ABC-[[:digit:]]*) ]] && echo "match" || echo "No match"
match
xxx@yyy:/$ [[ abc_XXX-ZZZ_def =~ (ABC-[[:digit:]]*) ]] && echo "match" || echo "No match"
No match
但是,当我在一个空的 Jenkins 作业中的“执行 shell”构建命令中使用相同的脚本时,“控制台输出”是
[EnvInject] - Loading node environment variables.
Building in workspace /var/lib/jenkins/jobs/TEST PROJECT/workspace
[workspace] $ /bin/sh -xe /tmp/hudson4251159992600854370.sh
/tmp/hudson4251159992600854370.sh: 2: /tmp/hudson4251159992600854370.sh: Syntax error: "(" unexpected
Build step 'Execute shell' marked build as failure
Finished: FAILURE
我假设意外的左括号是正则表达式字符串的开头。但是,我需要它来匹配组。
我还尝试将正则表达式用双引号括起来(例如 "(ABC-[[:digit:]]*)",这会产生令人讨厌的效果,即脚本不会失败,但它确实会产生不正确的“不匹配”结果。
FWIW 我想要做的是,如果我能找出正则表达式脚本的问题 - 将 Jira 编号分配给名为 branch 的变量,稍后在构建脚本中使用该变量:
[[ echo "${GIT_BRANCH#*/feature/}" =~ (ABC-[[:digit:]]*) ]] && branch=echo "${BASH_REMATCH[1]}" || branch="bugfix"
除此之外:我通过一个不同的、类似的脚本“有点”让这个工作,但是 if/else 让我无法理解。我可以将变量 branch 设置为 ABC-123 与此 if 它出现在分支名称中,但如果不是,则 grep 失败,进而导致构建失败。
branch=$(echo "${GIT_BRANCH#*/feature/}" | grep -o 'ABC-[0-9]\+')
最后,这个问题类似于this one,但 Jenkins 特有的怪异问题没有得到解答。
【问题讨论】:
-
/bin/sh不是/bin/bash。您的shshell 不支持[[ ... ]]条件。 -
尝试确定您是否可以像她一样支持
bash。您可以通过bash ./script.sh指示您的脚本使用 bash 脚本。 -
感谢你们两位;我不是 Linux 人,所以假设
bash是正在运行的。如果我不能让bash加入,我会考虑用sh来做这件事 -
@anbat 请不要使用反引号(内联代码格式)来强调 - 请参阅 meta.stackoverflow.com/questions/254990/…
-
好的,我会记住的