首页/开发/CI/CD 与发布速查/必需状态检查(Status Checks)
质量门禁与回滚51 条

必需状态检查(Status Checks)

把 CI 作业设为分支保护的必需检查:全部通过才允许合并;注意作业命名与路径过滤,避免出现永远处于等待状态的检查项。

CI/CD 与发布速查开发更新于 2026-10-13

必需状态检查是什么

必需状态检查(Status Checks)是分支保护的核心机制:把 CI 作业登记为必需检查后,目标分支的每次合并必须等这些检查全部通过,未通过时合并按钮保持禁用。落地要点有三:作业名即检查项标识,改名等于更换检查,保护规则会一直等一个不再出现的名字;被路径过滤(paths 等条件)跳过的作业不上报成功状态,登记为必需后提交会卡死在等待;与合并队列联用时,判定基于队列中合并后的临时结果,而不是各提交单独跑的结果。GitLab 的对应物是「合并请求流水线必须成功」等合并检查配置。

基本信息

配置位置分支保护规则中勾选必需检查
命名作业名是检查项标识,改名等于更换检查项
路径过滤被过滤跳过的作业显示为等待状态
合并队列与 merge queue 联用时按队列内结果判定
strict 模式要求分支先更新到最新再验证(up to date)

典型使用场景

  • 保护主干:main 只允许通过评审与检查的合并,其余入口一律关闭。
  • monorepo 路径过滤:只对受影响目录跑重作业,用汇总作业化解与必需检查的冲突。
  • 高并发仓库:配合合并队列串行验证「合并后」的组合状态,避免互相踩踏。
  • 多工作流聚合:多个 workflow 的结论汇总到一个必过作业上,保护规则只面向它。
  • 排查卡合并:提交长时间停在 Expected 时,先核对检查名与跳过原因,再查 Runner 队列。
  • 准入类校验:把变更日志、版本号格式这类脚本检查也设为必需,规则面前人人平等。

设置必需检查

设置必需检查
gh api -X PUT repos/OWNER/REPO/branches/main/protection \
  -f 'required_status_checks[strict]=true' \
  -f 'required_status_checks[contexts][]=ci/test'
# 检查名要与作业名(含矩阵后缀)逐字一致

检查状态读法

状态含义处理
Expected/Waiting检查未上报,合并不放行核对检查名、跳过条件与平台设置
Success检查通过可合并
Failure/Error检查失败修复后重跑;频繁失败查用例稳定性
Queued排队等待 Runner扩容或减少并发占用
路径过滤与必需检查的冲突是经典事故:被跳过的作业不产生成功状态,提交卡在等待;把强制要求绑定到「总会运行」的汇总作业上。
矩阵作业会展开成多个检查项(带后缀),保护规则要么逐一勾选,要么让汇总作业去承载强制点。
合并队列会为每个入队变更生成临时合并结果并重跑检查,失败自动踢出并在变更上留言说明原因。

易错点

  • 改动作业名不同步保护规则:旧检查永远等不到,合并被冻结;改名时一并更新规则。
  • 必需检查叠加路径过滤:被跳过的作业卡等待,用总是运行的汇总作业兜底。
  • strict 全开:他人每次合并后本分支都要更新再重跑,高活跃仓库体验差,按仓库权衡。
  • 管理员绕过开关无人管理:紧急通道应记录使用原因,常规发布仍走门禁,防止门禁形同虚设。
  • 检查清单长期不审:漏掉安全与迁移类关键作业,定期对照发布流程复查必需项。

数据来源与参考

  • GitHub Docs《About required status checks》
  • GitHub Docs《Handling skipped but required checks》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌