如何处理GitHub Actions中不总是触发的必填状态检查?
解决方案:自定义汇总状态检查
要实现“所有触发的必填检查通过后允许合并”的目标,你可以创建一个汇总状态检查工作流,将它设为分支保护的唯一必填项。这个工作流会自动验证当前PR中哪些必填检查(action#1、#3、#9)已经触发,仅要求已触发的检查全部成功,未触发的检查直接忽略。
具体步骤:
创建汇总检查工作流
在仓库的.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 "所有已触发的必填检查均通过"更新分支保护规则
- 进入仓库的「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
相关产品推荐
相关产品推荐

