Jenkins:由于提交消息而避免构建

时间:2013-11-01 08:52:44

标签: jenkins jenkins-plugins

由于特殊的提交消息模式,是否可以取消或跳过Jenkins中的作业?我认为作业配置中的“Excluded Commit comments”选项可以为我提供开箱即用的功能,就像提到here一样。但无论我在这个领域写的是哪个正则表达式,都会执行构建。

例如: 仅当提交消息包含表达式“release”时,我才想执行构建作业。所以我在Excluded Commit comments字段中编写正则表达式[^(?: release)]。我想如果我提交一个修订版,例如“test commit”,那么build-job不会执行,对吧?这是不使用post-commit钩子的正确方法吗?

3 个答案:

答案 0 :(得分:4)

Jenkins Git插件向您公开环境变量GIT_COMMIT,当然,它包含当前的git commit hash。 使用[Jenkins条件步骤]并构建一个执行以下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失败,则构建失败。

答案 1 :(得分:3)

延迟回复,但将来可能有所帮助, 有一个插件可以跳过构建,具体取决于git commit消息,只需在提交消息中包含[ci-skip],junkin将跳过构建

jenkins-ci-skip-plugin

答案 2 :(得分:0)

首先,您使用不正确的正则表达式语法来排除模式。其次,您不会告诉您的模式应该包括,因此即使您使用了正确的语法,它也永远不会匹配任何内容(因此所有提交都会触发工作)。

Jenkins似乎使用java.util.regex软件包进行匹配。我使用this online java regex tester测试我的表情。我还找到了不错的tutorial-在那儿了解了(?m)(?s)(?i)

要解决您的问题,请尝试以下模式:

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

它的作用:

  • (?i)告诉正则表达式执行不区分大小写的匹配。这是可选的,但如果要同时匹配“发行”和“发行”以及“发行”,则很有用。
  • (?s)使点匹配行尾(dotall选项),以便我们在整个提交消息中寻找匹配项。默认情况下,点与行尾不匹配,因此,如果提交消息中的任一行上没有“ release”关键字,则该模式将与该行匹配,并且詹金斯会错误地忽略提交。使用dotall,我们将查看整个提交消息,而忽略任何行尾。
  • (?!.*\brelease\b.*)-否预读模式。如果在其中找到该模式,则任何匹配项都将被丢弃。在这种模式下:
    • .*匹配触发词之前和之后的所有内容。我们需要这样做是因为java regex匹配的工作方式(来自tutorial的引用):
        

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

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

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

在旁注中,我宁愿使用一个触发短语,它不太可能被意外添加到消息中。例如,SCM Skip(和较旧的CI Skip)插件使用“ [ci skip]”关键字跳过提交。因此,我将类推地使用“ [ci build]”。

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