由于特殊的提交消息模式,是否可以取消或跳过 Jenkins 中的工作?我认为作业配置中的“排除提交评论”选项为我提供了开箱即用的功能,就像这里提到的那样。但是无论我在这个字段中编写哪个正则表达式,都会执行构建。
例如:我只想在提交消息包含表达式“release”时执行构建作业。所以我在 Excluded Commit comments 字段中写了正则表达式 [^(?:release)]。我想如果我使用例如“测试提交”进行修订,则构建作业不会执行,对吗?当不使用提交后挂钩时,这是正确的做法吗?
由于特殊的提交消息模式,是否可以取消或跳过 Jenkins 中的工作?我认为作业配置中的“排除提交评论”选项为我提供了开箱即用的功能,就像这里提到的那样。但是无论我在这个字段中编写哪个正则表达式,都会执行构建。
例如:我只想在提交消息包含表达式“release”时执行构建作业。所以我在 Excluded Commit comments 字段中写了正则表达式 [^(?:release)]。我想如果我使用例如“测试提交”进行修订,则构建作业不会执行,对吗?当不使用提交后挂钩时,这是正确的做法吗?
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 失败,则构建失败。
迟到的回复,但将来可能会对某些人有所帮助,有一个插件可以根据 git 提交消息跳过构建,只需在提交消息中包含一个 [ci-skip] junkin 将跳过构建
要仅为带有“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)
那里。