【问题标题】:How to enforce a format for a (pull request) merge commit message in BitBucket如何在 BitBucket 中强制执行(拉取请求)合并提交消息的格式
【发布时间】:2019-09-01 10:56:34
【问题描述】:

我们的团队正在迁移到 BitBucket。我们的工作流程需要对合并到主源代码库的代码的提交消息进行某种格式设置。

每个开发人员都有一个(或多个)分叉。我们的工作流程是将功能/错误分支推送到分支并从该分支创建拉取请求。其他两个开发人员必须审核并 +1 拉取请求才能合并。

当有人点击 Merge 时,BitBucket 会显示一个标题为“Merge Pull Request”的对话框。此时,开发人员可以在单击第二个合并按钮之前编辑为合并记录的文本消息。这是需要符合特定格式的消息。

我已阅读此处的文档:https://scriptrunner.adaptavist.com/latest/bitbucket/StashMergeChecks.html 它有几个非常具体的示例,但与我们的用例无关。我还没有找到关于如何创建合并检查的良好通用参考。

我可以编写一个检查特定字符串值的条件:

mergeRequest.message == "My Message"

但我需要它来检查正则表达式。 如果消息不符合正则表达式,我如何编写预合并挂钩来拒绝合并?

加法

从文档看来,条件检查脚本代码似乎是执行此条件的正确位置。脚本可以添加到Repository Settings > SCRIPTRUNNER > Script Merge Checks > Conditional merge check。为条件合并检查显示了一长串示例,包括:

  • 特定组中的当前用户
  • 更改的文件包含 .XYZ 文件
  • 敏感目录中的文件已更改
  • 目标分支是发布

经过一些搜索和实验,我发现我可以根据提交消息阻止合并。但到目前为止,我只找到了将整个字符串与常量字符串表达式进行比较的示例。我还没有找到如何在这个比较中使用正则表达式。

【问题讨论】:

    标签: bitbucket


    【解决方案1】:

    您可以尝试一些 Bitbucket 的插件,例如 YACC:

    https://marketplace.atlassian.com/apps/1211854/yet-another-commit-checker?hosting=server&tab=overview

    如果这不符合您的要求,您可以编写自己的: https://developer.atlassian.com/server/bitbucket/how-tos/hooks-merge-checks-guide/

    【讨论】:

    • 那么你是说需要使用插件来检查合并提交消息是否匹配正则表达式?编写插件似乎是一个比我预期的更大的解决方案。
    • 希望不会发生这种情况。您可以向 YACC 维护者提出问题:github.com/sford/yet-another-commit-checker 我使用 File Hooks 插件,它不再维护,因此由于 API 已弃用,我不得不更新插件。这是向第三方支付大量资金,恳求现有插件开发人员或自己做的情况。
    • @LeeJenkins,您似乎没有意识到您已经在使用插件。 “ScriptRunner for Bitbucket”是来自 Adaptivist 的第三方付费插件。 YACC 是另一个插件,它内置了正则表达式合并检查。为此使用 YACC 比为 ScriptRunner 插件编写脚本要简单得多。
    【解决方案2】:

    在将此问题搁置数周后,OP 在这里。问题解决了。您可以在不使用插件的情况下根据正则表达式检查合并提交消息。解决方案是为那些来搜索相同问题的人提供的。

    首先,找到与编写合并检查脚本最相关的对象的文档比本应具有的挑战性更大。下面是当前 6.3.0 API 的几个链接:

    • PullRequest - 最后,我的脚本没有使用这个对象,但是拉取请求与合并请求密切相关,其他人可能需要文档。

    • MergeRequest - 此对象具有确定上下文的方法(见下文)。

    其次,Merge Check 脚本在两个不同的上下文中触发:(1) 当 bitbucket 尝试确定是否应该启用/禁用 Pull Request 上的 Merge 按钮时> 页面,以及 (2) 当有人单击 Merge pull request 对话框上的 Merge 按钮时。在第一个上下文中,合并消息为空,因此它无法匹配正则表达式。无论如何,在这种情况下禁用按钮是没有意义的。我真的只想在第二种情况下进行检查。所以脚本需要一种区分上下文的方法。

    第三,消息对象是Java String,所以脚本可以调用matches()方法来检查消息是否匹配正则表达式。

    掌握所有信息后,编写脚本就很容易了:

    // the message regex
    String pattern = "(PATTERN1|PATTERN2|etc)"
    // reject if not dry-run and
    //           message doesn't match regex
    ! mergeRequest.isDryRun() &&
        ! mergeRequest.message.matches(pattern)
    

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多