11

由于特殊的提交消息模式,是否可以取消或跳过 Jenkins 中的工作?我认为作业配置中的“排除提交评论”选项为我提供了开箱即用的功能,就像这里提到的那样。但是无论我在这个字段中编写哪个正则表达式,都会执行构建。

例如:我只想在提交消息包含表达式“release”时执行构建作业。所以我在 Excluded Commit comments 字段中写了正则表达式 [^(?:release)]。我想如果我使用例如“测试提交”进行修订,则构建作业不会执行,对吗?当不使用提交后挂钩时,这是正确的做法吗?

4

3 回答 3

5

Jenkins Git 插件向您公开环境变量GIT_COMMIT,其中当然包含当前的 git 提交哈希。使用 [Jenkins Conditional Step] 并构建一个执行以下 bash shell 的步骤:

echo "==========================="

if [ "git show $GIT_COMMIT | grep "your-pattern-here" == false  ] ; then
        echo "pattern failed";
        exit 1
else
        echo "ok"
fi

echo "==========================="

并标记如果 shell 失败,则构建失败。

于 2014-09-04T08:53:24.593 回答
3

迟到的回复,但将来可能会对某些人有所帮助,有一个插件可以根据 git 提交消息跳过构建,只需在提交消息中包含一个 [ci-skip] junkin 将跳过构建

jenkins-ci-skip-plugin

于 2015-04-08T06:20:11.220 回答
1

TL;博士

要仅为带有“release”字(不区分大小写)的提交触发构建,请在作业配置的“Excluded Commit comments”字段中设置:

(?i)(?s)(?!.*\brelease\b.*)^.*$

更好的是,使用不太可能意外添加到提交消息中的触发短语。例如,使用“[ci build]”:

(?i)(?s)(?!.*\[ci build\].*)^.*$

这是如何运作的?

  • (?i)告诉正则表达式做不区分大小写的匹配。这是可选的,但如果您想匹配“Release”和“RELEASE”以及“release”,这很有用。
  • (?s)使 dot 匹配行尾(又名dotall选项),以便我们在整个提交消息中查找匹配项。默认情况下,点与行尾不匹配,因此如果提交消息中的其中一行没有“release”关键字,则该模式将匹配该行,并且 Jenkins 会错误地忽略提交。使用 dotall,我们查看整个提交消息,忽略任何行结束。
  • (?!.*\brelease\b.*)- 负前瞻模式。如果在其中找到此模式,则丢弃任何匹配项。在这种模式下:
    • .*匹配我们的触发短语之前和之后的任何内容。我们需要这个,因为 java regex 匹配的工作方式(引自教程):

myString.matches("regex") 返回 true 或 false,具体取决于字符串是否可以完全由正则表达式匹配。重要的是要记住 String.matches() 仅在可以匹配整个字符串时才返回 true。换句话说:“正则表达式”的应用就好像您已经用字符串锚点的开始和结束编写了“^regex$”。这与大多数其他正则表达式库不同,如果正则表达式可以匹配字符串中的任何位置,“快速匹配测试”方法将返回 true。如果 myString 是 abc,则 myString.matches("bc") 返回 false。bc 与 abc 匹配,但 ^bc$(此处实际使用)不匹配。

  • \b确保关键字前后有一个单词边界,因为您可能不想匹配“未发布”等。
  • ^.*$是我们正在寻找的实际匹配模式。请注意, ^ 和 $ 匹配字符串的开头和字符串的结尾,而不是该字符串中行的开头/结尾。这是 java regex 的默认行为,除非启用了多行模式。换句话说,此模式匹配整个提交消息,因为 dotall 模式由启用(?s)并且 dot 匹配换行符。

因此,匹配算法将匹配整个提交消息,然后根据它是否在其中的任何位置找到负前瞻模式来丢弃它。

为什么你的表情不起作用?

您建议的正则表达式存在两个问题。首先,您使用了不正确的正则表达式语法来排除模式。其次,你没有告诉你的模式应该包括什么,只说它应该排除什么。因此,即使您使用正确的语法,它也永远不会匹配任何内容。并且因为它不匹配任何东西,所以没有任何东西被排除在触发作业之外,即任何提交都会触发。

参考

如果您需要更多信息,请查找Jenkins 用于匹配的java.util.regex包。我使用这个在线 java 正则表达式测试器来测试我的表达式。我还找到了一个不错的教程- 了解(?m),(?s)(?i)那里。

于 2019-08-23T15:21:31.903 回答