使用GitHub Action限制仅管理员合并PR遇报错求助
问题概述
尝试通过GitHub Action实现仅仓库管理员可合并dev、master分支的PR,编写了mergepr.yml配置,但无论用户角色如何,Action均失败,报错如下:
Run echo "Setting up GitHub CLI"
echo "Setting up GitHub CLI"
gh config set -h github.com ${GITHUB_TOKEN}
shell: /usr/bin/bash -e {0}
Setting up GitHub CLI
accepts 2 arg(s), received 0
Error: Process completed with exit code 1.
原配置文件:
name: Restrict merges to admins on: pull_request: branches: - dev - master jobs: restrict-merges: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Install GitHub CLI run: | # Download the GitHub CLI binary for Linux (replace URL with the correct one) curl -fsSL https://github.com/cli/cli/releases/download/v2.35.0/gh_2.35.0_linux_amd64.tar.gz -o gh.tar.gz tar -xzf gh.tar.gz sudo mv gh_* /usr/local/bin/gh gh --version - name: Set up GitHub CLI run: | echo "Setting up GitHub CLI" gh config set -h github.com ${GITHUB_TOKEN} - name: Check if the user is an admin run: | PR_NUMBER="${{ github.event.pull_request.number }}" USER_ROLE=$(gh api users/me/role --jq '.role') if [[ $USER_ROLE != '"admin"' ]]; then echo "Only admins can merge pull requests into the main branch." exit 1 fi - name: Merge the pull request run: | PR_NUMBER="${{ github.event.pull_request.number }}" gh pr merge $PR_NUMBER --auto
报错原因分析
GitHub CLI配置命令语法错误
gh config set的正确语法是gh config set <配置项键> <值> [-h <主机>],原命令gh config set -h github.com ${GITHUB_TOKEN}缺少配置项的键(比如auth.token),导致参数不足触发报错。角色查询API路径错误
gh api users/me/role不是有效的GitHub API路径,GitHub没有提供该接口查询当前用户角色。要获取用户在仓库中的权限,需调用仓库协作者权限接口:/repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission。默认Token权限不足
GitHub Action默认的GITHUB_TOKEN权限有限,无法查询仓库协作者权限和执行PR合并操作,需要显式配置足够的权限。触发时机不合理
原配置使用pull_request事件,会在PR打开、同步等多个场景触发,而我们需要在PR尝试合并时触发检查,更合适的触发事件是pull_request_target(避免分支保护的权限问题)。
修复后的完整配置
name: Restrict merges to admins on: pull_request_target: branches: - dev - master types: [opened, synchronize, ready_for_review] jobs: restrict-merges: runs-on: ubuntu-latest permissions: pull-requests: write contents: write steps: - name: Install GitHub CLI run: | curl -fsSL https://github.com/cli/cli/releases/download/v2.35.0/gh_2.35.0_linux_amd64.tar.gz -o gh.tar.gz tar -xzf gh.tar.gz sudo mv gh_*/gh /usr/local/bin/gh gh --version - name: Check user permission level run: | # 获取当前触发Action的用户在仓库中的权限 PERMISSION=$(gh api repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission --jq '.permission') # 仅允许管理员权限用户合并 if [[ "$PERMISSION" != "admin" ]]; then echo "❌ Only users with admin permission can merge PRs to protected branches." exit 1 else echo "✅ User has admin permission, proceeding with merge check." fi - name: Merge PR if ready run: | gh pr merge ${{ github.event.pull_request.number }} --auto --delete-branch env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
关键修复点说明
- 修正GH CLI认证方式:移除错误的
gh config set命令,直接通过env传递GITHUB_TOKEN,GH CLI会自动读取该环境变量完成认证。 - 修正权限查询逻辑:使用仓库协作者权限接口获取用户在当前仓库的实际权限(
admin/write/read/none)。 - 配置足够权限:在job中添加
permissions字段,授予pull-requests: write和contents: write权限,确保能执行PR合并和权限查询操作。 - 优化触发事件:使用
pull_request_target事件,避免分支保护导致的代码拉取权限问题,同时指定触发类型聚焦在PR关键状态变化时。 - 简化冗余步骤:移除不必要的
checkout步骤,权限查询和PR合并不需要拉取代码。
内容的提问来源于stack exchange,提问作者hersidia

