【问题标题】:Bash (via Jenkins) regex if/elseBash(通过 Jenkins)正则表达式 if/else
【发布时间】: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。您的 sh shell 不支持 [[ ... ]] 条件。
  • 尝试确定您是否可以像她一样支持bash。您可以通过 bash ./script.sh 指示您的脚本使用 bash 脚本。
  • 感谢你们两位;我不是 Linux 人,所以假设 bash 是正在运行的。如果我不能让bash 加入,我会考虑用sh 来做这件事
  • @anbat 请不要使用反引号(内联代码格式)来强调 - 请参阅 meta.stackoverflow.com/questions/254990/…
  • 好的,我会记住的

标签: bash jenkins


【解决方案1】:

非常感谢 chorobaJohn Mark Mitchell 将我推向正确的方向。

在我的 Jenkins“执行 shell 脚本”构建步骤中工作的解决方案是

!/bin/bash # Name the build with the JIRA number taken from the branch name. # NOTE: the first line (aka shebang) is required to force /bin/bash shell (instead of /bin/sh) which handles the regex below. [[ ${GIT_BRANCH#*/feature/} =~ (ABC-[[:digit:]]*) ]] && branch="${BASH_REMATCH[1]}" || branch="bugfix" echo "Branch is $branch" echo feature_name=$branch > feature.prop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多