如何在不自动请求审查的情况下强制执行来自代码所有者的审查?

14
我有一个GitHub存储库,当打开拉取请求时会自动向代码所有者团队(在 .github/CODEOWNERS 中定义)请求审查。我想要强制要求拉取请求必须由代码所有者批准,但在第一次打开拉取请求时停止发送这些审查请求。也就是说,贡献者的期望流程如下所示:

打开拉取请求 -> 操作、更改内容 -> 在准备好后手动请求审查(未经代码所有者批准无法合并)

可以通过让贡献者打开草稿拉取请求,并仅在实际准备好时将其标记为“已准备就绪”来解决此问题,但贡献者似乎不想这样做。当拉取请求并没有准备好进行审查时,贡献者通常会打开一个(非草稿)拉取请求(我猜这是出于习惯)。

是否有一种方法可以做到这一点,而不依赖于贡献者使用草稿拉取请求?


1
谢谢您的提问,我也在想同样的问题。如果无法实现这一点,至少不要让“自动请求审阅者”自动订阅审阅,因为这可能会导致不必要的垃圾邮件。 - raph
3
我在 GitHub 上创建了一篇相关的讨论,以查看它是否会被支持或其他人是否会参与其中:https://github.com/orgs/community/discussions/35673#discussion-4459776 - raph
1
谢谢@raph - 我已经在Github的帖子上点赞了。 - K--
2个回答

2
这非常令人讨厌,尤其是如果你有多层的代码所有者。
例如,一个操作团队在整个仓库中都有代码所有权,但他们并不会每天审核大部分PR。
确实:当你有分层的代码所有者时,拥有对整个代码库具有代码所有权但只应偶尔进行审核的默认或全能团队(比如操作团队),会变得有些棘手。
关键挑战是确保操作团队不会被审核请求垃圾邮件轰炸,即使他们是全能的代码所有者,除非他们的审核实际上是需要的。
可以从优化你的CODEOWNERS文件开始。 确保组织好你的 .github/CODEOWNERS 文件,以便特定路径和文件夹有各自的代码所有者,而操作团队则是对一般监督或未指定路径的后备。
* @ops-team
/docs/ @documentation-team
/app/ @app-team

你将继续使用GitHub Actions,但这次要更具体一些。你需要一个动作来检查PR中更改的文件。
但是:

  • 如果更改的文件特定于某个团队,并且不属于ops的一般类别,则可以跳过该团队的审查请求移除,并仅移除ops团队的请求。(参见“从拉取请求中删除请求的审阅者”API调用)
  • 如果涉及到一般事务,则会自动向ops团队请求审查。

例如:

name: Handle Review Requests

on:
  pull_request:
    types:
      - opened

jobs:
  handle-requests:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Check changed files
      id: files
      run: |
        FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }})
        echo "modified_files=$FILES" >> $GITHUB_ENV
    
    - name: Conditionally remove requested reviewers
      run: |
        MODIFIED_FILES="${modified_files}"
        
        # Check if the PR modifies files inside /app/ or /docs/
        if [[ "$MODIFIED_FILES" == *"app/"* ]] || [[ "$MODIFIED_FILES" == *"docs/"* ]]; then
          # Remove ops team from the review request list
          gh api \
            --method DELETE \
            /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/requested_reviewers \
            -F reviewers='["ops-team"]'
        fi
      env:
        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

另请参阅discussions/25797,以了解关于${{ github.event.before }}${{ github.event.after }}的示例。

很棒的答案!我想提醒未来的读者一个小细节:::set-output 命令可以被新的命令 echo "{name}={value}" >> $GITHUB_OUTPUT 替代。旧命令原本计划在2023年5月后弃用,但后来被延长了。请参阅 GitHub 的博客文章 - Sascha
1
@Sascha 谢谢你的反馈,很有道理。我已经相应地编辑了代码。 - VonC

1
我在GitHub论坛上找到了其他人提出同样问题的帖子。我认为目前GitHub没有设置可以做到这一点。我找到了这条评论: “对于这样的自定义工作流程,您可能需要查看Probot。 Work in Progress Probot应用程序提供了一个示例,说明如何创建一个可以基于自定义逻辑阻止PR合并的机器人。”
我发现你可以使用这个应用程序做类似的事情。
version: 2
mergeable:
  - when: pull_request.*, pull_request_review.*
    name: 'Approval check'
    validate:
      - do: approvals
        min:
          count: 1
        limit:
          users: [ 'approverA', 'approverB' ]

这可能解决你的问题,但对于我这种情况,应用程序的不同部分有不同的代码所有者,这还不够好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接