【问题标题】:How do I configure Jenkins to build all branches except a few which I exclude?我如何配置 Jenkins 以构建除我排除的少数分支之外的所有分支?
【发布时间】:2015-05-07 08:22:28
【问题描述】:

我们在 git 中有一些代码,我开始设置 Jenkins 来获取我们的分支并尝试编译。似乎有一些树枝在上次建造后的几年里可能已经开始腐烂,因为它们没有完成制作。

我想构建找到的所有分支,但排除的列表除外。这在詹金斯可能吗?这将让我启动并运行,然后在我尝试修复它们时回来启用更多分支。

到目前为止我已经尝试过什么

带有前瞻的正则表达式

查看“Git > Branches to build”选项,我希望可以用 : 替换默认的“**”通配符。对http://rubular.com/ 进行了一些挖掘和双重检查,这表明以下内容可能符合我的要求。

:^(?!origin/exclude\-this\-branch\.v1|origin/exclude\-this\-branch\-too.v2)(\S+)

现在这里假设正则表达式引擎在后台运行。我希望它可以理解前瞻,但如果它不理解,则说明此方法失败的原因。它似乎建立了所有分支,包括我试图排除的分支。也许我只是需要找到更多的调试?

在这里寻找类似的问题

我遇到了Jenkins/Hudson Build All Branches With Prioritization,它似乎包含一个可能的解决方案,其中一些添加了一个 inverse 选项来匹配https://github.com/jenkinsci/git-plugin/pull/45 的分支,这听起来像是我需要的。可悲的是,这似乎不在我拥有的 Jenkins 版本中,这很奇怪,因为 2011 年是很久以前的事了。

我正在使用的系统

Ubuntu LTS 14.04。詹金斯版1.611。用于制作 C/C++ 代码的 GNU 工具链。

【问题讨论】:

  • 这几乎是duplicate of this question。您应该编写一个 匹配 仅要排除的分支的正则表达式(或者更简单的是添加多个“要构建的分支”条目),然后使用“反向”选择策略。
  • @ChristopherOrr 这听起来像是我需要的解决方案。我只是找不到反向选项隐藏的位置。我已经尝试过了,它似乎不起作用,仍然尝试构建排除的分支,但我会坚持下去。您是否应该将您的评论作为答案,以便我可以选择它,或者这不是处理重复项的方式?

标签: regex git jenkins


【解决方案1】:

如何使用

^(?!.*master).*$

作为分支说明符。这个正则表达式意味着所有不匹配主分支的分支。

细分:

^(?!.*master).*$
^                ---> beginning of string
 (?!        )    ---> negative lookahead find all that doesnt match
    .*           ---> zero or more of 'any' character
      master     ---> should not match master
             .*$ ---> will match anything to the end of string

相关:https://stackoverflow.com/a/18709097/109305

【讨论】:

  • 我在问题中说我已经尝试过了,但它不起作用。也许 RegEx 引擎在过去两年中已经更新,现在它可以工作了。我最终按照 ChristopherOrr 的建议进行了逆向选择策略。
  • 如何对两个分支使用忽略,例如主分支和功能分支
  • 通常,前瞻(或后瞻)断言仅适用于固定长度的字符串。另外,在这种特殊情况下,我相信您不能使用 '|'要组合您要排除的内容 - 相反,您必须连续定义多个否定的前瞻性断言。参考:stackoverflow.com/a/2078924/2773846
  • 所以如果我取出 ?!,那么它将匹配任何包含 master 的分支?
【解决方案2】:

我需要使用 Jenkins 工具“通过 regex 过滤分支”,我发现该 regex 的风格只适用于反向引用。 所以,在Jesper 响应和this issue 之后,我在这里又做了两个例子:

^(?:.*release\/\d+.\d+.\d+(?!.))$
// check all branches like "release/0.0.0" or "origin/release/1.2.3"
^(?:.*release\/\d+.\d+.\d+_any)$
// check all branches like "release/0.0.0_any" or "origin/release/1.2.3_any"

我希望这对某人有帮助

编辑 - New example

^(?:origin\/develop|origin\/master|origin\/release\/\d+\.\d+\.\d+(?!.)|origin\/release\/\d+\.\d+\.\d+(?:_uat|_preprod))$

^(?:.*develop|.*master|.*release/\d+\.\d+\.\d+(?!.))$

【讨论】:

  • 这些?: 部分的用途是什么?第一个简单的正则表达式不应该是^.*release\/\d+.\d+.\d+$吗?
  • 嗨 Aaron,我在使用这些正则表达式的地方给你代码授权:triggers { gitlab(triggerOnPush: true, triggerOnMergeRequest: false, branchFilterType: "RegexBasedFilter", targetBranchRegex: '^(?:(?!feature).)*$') } 如果你不使用它,那个触发器就不起作用。
猜你喜欢
  • 1970-01-01
  • 2015-04-18
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2018-09-30
相关资源
最近更新 更多