You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理GitHub Actions中不总是触发的必填状态检查?

解决方案:自定义汇总状态检查

要实现“所有触发的必填检查通过后允许合并”的目标,你可以创建一个汇总状态检查工作流,将它设为分支保护的唯一必填项。这个工作流会自动验证当前PR中哪些必填检查(action#1、#3、#9)已经触发,仅要求已触发的检查全部成功,未触发的检查直接忽略。

具体步骤:

  1. 创建汇总检查工作流
    在仓库的.github/workflows/目录下新建一个merge-gate-check.yml文件,内容如下:

    name: Merge Gate Check
    on:
      pull_request:
        types: [opened, synchronize, reopened]
    
    jobs:
      validate-required-checks:
        runs-on: ubuntu-latest
        steps:
          - name: Install GitHub CLI
            run: |
              type -p curl >/dev/null || sudo apt install curl -y
              curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
              && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
              && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
              && sudo apt update \
              && sudo apt install gh -y
    
          - name: Authenticate with GitHub
            run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
    
          - name: Verify triggered checks
            run: |
              # 定义需要验证的必填检查名称
              REQUIRED_CHECKS=("action#1" "action#3" "action#9")
              PR_NUM=${{ github.event.pull_request.number }}
              REPO=${{ github.repository }}
    
              for CHECK in "${REQUIRED_CHECKS[@]}"; do
                # 查询检查的运行状态和结果
                CHECK_DATA=$(gh api repos/$REPO/pulls/$PR_NUM/check-runs --jq ".check_runs[] | select(.name == \"$CHECK\")")
                if [[ -n "$CHECK_DATA" ]]; then
                  STATUS=$(echo "$CHECK_DATA" | jq -r ".status")
                  CONCLUSION=$(echo "$CHECK_DATA" | jq -r ".conclusion")
    
                  if [[ "$STATUS" == "in_progress" ]]; then
                    echo "检查 $CHECK 仍在运行,等待完成..."
                    exit 1
                  elif [[ "$CONCLUSION" != "success" ]]; then
                    echo "检查 $CHECK 未通过(结果:$CONCLUSION)"
                    exit 1
                  fi
                fi
                # 未触发的检查直接跳过
              done
    
              echo "所有已触发的必填检查均通过"
    
  2. 更新分支保护规则

    • 进入仓库的「Settings」→「Branches」→「Branch protection rules」
    • 移除原来的action#1、action#3、action#9必填项,只添加新创建的Merge Gate Check作为唯一必填状态检查

工作原理:

  • 当PR打开或更新时,汇总检查自动触发
  • 它会通过GitHub API查询当前PR中所有必填检查的运行状态:
    • 如果某检查正在运行,汇总检查会失败并等待该检查完成后重新触发
    • 如果某检查已完成但未通过,汇总检查直接失败,阻止合并
    • 如果某检查未触发(比如无代码变更时的action#3),则直接忽略
  • 只有所有已触发的必填检查都成功时,汇总检查才会标记为通过,此时PR的合并按钮会被启用

这种方式既避免了无意义的action#3运行,又能确保只要触发的检查全部通过就能合并,同时防止开发者在必要检查未完成时合并PR。

内容的提问来源于stack exchange,提问作者Ming6

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:40:26