Jenkins 詹金斯:避免由于提交消息而生成

Jenkins 詹金斯:避免由于提交消息而生成,jenkins,jenkins-plugins,Jenkins,Jenkins Plugins,由于特殊的提交消息模式,是否可以取消或跳过Jenkins中的作业?我认为作业配置中的“排除提交注释”选项可以在开箱即用的情况下实现这一点,如前所述。但是不管我在这个字段中写的是哪一个正则表达式,构建都是执行的 例如: 我只想在提交消息包含表达式“release”时执行构建作业。因此,我在Excluded Commit comments字段中编写正则表达式[^(?:release)]。我想如果我提交一个修订,例如“测试提交”,构建作业不会执行,对吗?当不使用post commit hook时,这是

由于特殊的提交消息模式,是否可以取消或跳过Jenkins中的作业?我认为作业配置中的“排除提交注释”选项可以在开箱即用的情况下实现这一点,如前所述。但是不管我在这个字段中写的是哪一个正则表达式,构建都是执行的

例如:
我只想在提交消息包含表达式“release”时执行构建作业。因此,我在Excluded Commit comments字段中编写正则表达式[^(?:release)]。我想如果我提交一个修订,例如“测试提交”,构建作业不会执行,对吗?当不使用post commit hook时,这是正确的方法吗?

Jenkins Git插件向您公开环境变量
Git\u commit
,其中当然包含当前的Git commit哈希。 使用[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将跳过构建

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

(?i)(?s)(?!.*\brelease\b.*)^.*$
更好的是,使用一个触发器短语,它不太可能意外地添加到提交消息中。例如,使用“[ci构建]”:

这是怎么回事?
  • (?i)
    告诉regex do do do不区分大小写的匹配。这是可选的,但是如果您想匹配“Release”和“Release”以及“Release”,那么它很有用
  • (?s)
    使点与线端匹配(也称为dotall选项),以便在整个提交消息中查找匹配项。默认情况下,点与行尾不匹配,因此,如果提交消息中的一行上没有“release”关键字,则模式将与该行匹配,并且Jenkins将错误地忽略提交。使用dotall,我们查看整个提交消息,忽略任何行尾
  • (?!.\b租赁\b*)
    -负前瞻模式。如果在匹配中找到此模式,则将放弃任何匹配。在这种模式中:
    • *
      匹配触发短语前后的任何内容。我们之所以需要它,是因为java正则表达式匹配的工作方式(引自:
matches(“regex”)返回true或false,这取决于正则表达式是否可以完全匹配字符串。重要的是要记住,String.matches()仅在可以匹配整个字符串时才返回true。换句话说,“regex”的应用就好像您编写了“^regex$”和字符串起始和结束锚一样。这与大多数其他正则表达式库不同,如果正则表达式可以在字符串中的任何位置匹配,“快速匹配测试”方法将返回true。如果myString是abc,那么myString.matches(“bc”)返回false。bc与abc匹配,但^bc$(此处实际使用)不匹配

  • \b
    确保关键字前后都有单词边界,因为您可能不想匹配“unreleased”等
  • ^.*$
    是我们正在寻找的实际匹配模式。请注意,^和$匹配字符串的开头和结尾,而不是该字符串中行的开头/结尾。这是java正则表达式的默认行为,除非启用了多行模式。换句话说,这个模式匹配整个提交消息,因为dotall模式是由
    (?s)
    启用的,并且点匹配换行符
所以,匹配算法将匹配整个提交消息,然后丢弃它,这取决于它是否在其中的任何位置找到负的前瞻模式

为什么你的表情不起作用? 建议的正则表达式有两个问题。首先,您使用了不正确的正则表达式语法来排除模式。第二,你没有告诉你的模式应该包括什么,只告诉它应该排除什么。因此,即使使用了正确的语法,它也永远不会匹配任何内容。因为它不匹配任何内容,所以触发作业时不会排除任何内容,即任何提交都会触发

工具书类
如果您需要更多信息,请查找Jenkins用于匹配的软件包。我过去常常测试我的表情。我还发现了一个关于
(?m)
(?s)
(?I)
的很好的学习方法。

你尝试过更简单的表达式吗?无论多么简单,都要尝试获取所有排除的匹配项。我认为上面的代码很接近,但并不完全正确。这就是我的工作
code
if[[$(git show$git_COMMIT | grep“[跳过提交的字符串]”| wc-m)-ne 0];然后echo“跳过此提交”退出0否则echo“确定生成”fi
code
(?i)(?s)(?!.*\[ci build\].*)^.*$