防止基于标签有条件地合并分支

Prevent merging of branch conditionally based on label

提问人:Brandon McConnell 提问时间:3/17/2022 更新时间:7/17/2023 访问量:2722

问:

我的团队使用无权访问草稿拉取请求的专用分支,但我仍然至少希望有一种方法来防止合并拉取请求,因为它们应用了自定义标签,例如“草稿”或“WIP”。

有没有办法建立自定义的必需状态检查来检查该标签或使用 GitHub 操作使 PR 无效,直到标签被删除或类似的东西?

github-actions

评论


答:

6赞 Matt 3/17/2022 #1

由于您没有可用的草稿拉取请求,因此我假设您也没有分支保护规则。因此,你不能真正强制执行你在问题中描述的内容。但是,可以给出一些图形提示,让用户知道 PR 是草稿。

这可以通过 GitHub Actions 中的工作流来完成。您需要添加 ,并在pull_request触发器上键入,以便在创建 PR 或更改标签时运行工作流。之后,您可以定义一个作业,该作业仅在自定义标签(例如)存在时运行,并且只需运行出口 1 即可使检查失败openedlabeledunlabeleddraft

以下是完整的工作流程(例如check-draft.yml):

name: Check Draft

on:
  pull_request:
#    branches:
#      - main
    types:
      - opened
      - labeled
      - unlabeled

jobs:
  fail-for-draft:
    if: contains(github.event.pull_request.labels.*.name, 'draft')
    runs-on: ubuntu-latest
    steps:
      - name: Fail if PR is a draft
        run: |
          echo "This PR is currently a draft."
          exit 1

PR 草稿标签检查失败:(请注意,即使合并按钮是灰色的,如果没有设置分支保护规则,PR 实际上也可以合并。

fail

成功运行,PR 上没有草稿标签:

success

评论

2赞 Brandon McConnell 3/17/2022
我不能要求一个更全面的解决方案。谢谢!!
2赞 yuki 4/11/2023 #2

在步骤内移动条件将显示绿色复选✅,而不是显示为跳过

name: Check Draft

on:
  pull_request:
    types:
      - opened
      - labeled
      - unlabeled

jobs:
  fail-for-draft:
    runs-on: ubuntu-latest
    steps:
      - name: Fail if PR is a draft
        if: contains(github.event.pull_request.labels.*.name, 'draft') # Move the condition to here
        run: |
          echo "This PR is currently a draft."
          exit 1
1赞 Rim 7/17/2023 #3

只是想添加一些东西

如果我们在更新拉取请求的新内容时有人遇到错误,检查将再次运行,但它停留在

Expected — Waiting for status to be reported

我们可能需要添加一些额外的事件

---
name: 'Check Mergable by label ✅'

on:
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - edited
      - labeled
      - unlabeled

jobs:
  fail-by-label:
    if: contains(github.event.pull_request.labels.*.name, 'do not merge')
    runs-on: ubuntu-latest
    steps:
      - name: Fail if PR is labeled "do not merge"
        run: |
          echo "This PR is labeled as do not merge!"
          exit 1