fix(ci): 修复CI状态检查误判导致提前合并的bug #486

Merged
auto-approve-bot merged 1 commits from fix/check-ci-status-false-positive into develop 2026-07-17 20:46:23 +08:00
Owner

问题

auto-merge 有时会在CI还没跑完的时候就去合并,返回405。

根因

scripts/check_ci_status.py 里,如果找不到目标context的status,就返回 "success"(假设该workflow没触发不需要检查)。但实际上更常见的情况是CI还没开始写status(pending状态还没出现)。

特别是把 auto-merge.yml 的 checkout 从 actions/checkout@v3 改成 tar.gz 方式后,checkout 速度变快很多,CI还没来得及写第一个status,脚本就全找不到context、全返回success,导致误判全绿。

修复内容

1. scripts/check_ci_status.py(核心修复)

  • 找不到context时返回 "pending" 而非 "success"
  • 理由:找不到=还没开始,应该等待而不是算通过
  • 如果某个workflow真的没触发(比如纯CI改动跳过了build),它的status会是 "skipped" 而不是不存在
  • 保留 skipped → success 的映射(跳过的任务算通过)

2. auto-merge.yml 405处理优化

  • 405时不立即 exit 0,改为继续下一轮检查
  • 增加连续405计数器(默认6次=约60秒),多轮都是405才退出并评论提醒
  • 405可能是CI状态同步延迟,不是真的合并失败

3. auto-approve.yml 同步保护

  • auto-approve 也使用 check_ci_status.py,共享核心修复
  • 同样增加30秒初始等待保护

4. 增加"至少等待一轮"保护

  • auto-merge.yml 和 auto-approve.yml 都在第一次检查前等待30秒
  • 给CI启动写status的时间,避免checkout太快导致误判

修改文件

  • scripts/check_ci_status.py
  • .gitea/workflows/auto-merge.yml
  • .gitea/workflows/auto-approve.yml
## 问题 auto-merge 有时会在CI还没跑完的时候就去合并,返回405。 ## 根因 `scripts/check_ci_status.py` 里,如果找不到目标context的status,就返回 "success"(假设该workflow没触发不需要检查)。但实际上更常见的情况是CI还没开始写status(pending状态还没出现)。 特别是把 auto-merge.yml 的 checkout 从 actions/checkout@v3 改成 tar.gz 方式后,checkout 速度变快很多,CI还没来得及写第一个status,脚本就全找不到context、全返回success,导致误判全绿。 ## 修复内容 ### 1. scripts/check_ci_status.py(核心修复) - 找不到context时返回 "pending" 而非 "success" - 理由:找不到=还没开始,应该等待而不是算通过 - 如果某个workflow真的没触发(比如纯CI改动跳过了build),它的status会是 "skipped" 而不是不存在 - 保留 skipped → success 的映射(跳过的任务算通过) ### 2. auto-merge.yml 405处理优化 - 405时不立即 exit 0,改为继续下一轮检查 - 增加连续405计数器(默认6次=约60秒),多轮都是405才退出并评论提醒 - 405可能是CI状态同步延迟,不是真的合并失败 ### 3. auto-approve.yml 同步保护 - auto-approve 也使用 check_ci_status.py,共享核心修复 - 同样增加30秒初始等待保护 ### 4. 增加"至少等待一轮"保护 - auto-merge.yml 和 auto-approve.yml 都在第一次检查前等待30秒 - 给CI启动写status的时间,避免checkout太快导致误判 ## 修改文件 - scripts/check_ci_status.py - .gitea/workflows/auto-merge.yml - .gitea/workflows/auto-approve.yml
xiaoxia added 1 commit 2026-07-17 20:41:23 +08:00
fix(ci): 修复CI状态检查误判导致提前合并的bug
CI Build & Deploy Pipeline / Build Staging API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 16s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 56s
AI Code Review / AI Code Review (pull_request) Successful in 2m30s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 3m9s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m18s
Auto Approve CI PRs / Auto Approve on CI Green (pull_request) Successful in 3m40s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m29s
Auto Merge CI PRs / Auto Merge on CI Green + Approved (pull_request) Successful in 5m0s
4a38216fb0
- check_ci_status.py: 找不到context时返回pending而非success
  (找不到=CI还没启动,应该等待;真跳过的会有skipped状态)
- auto-merge.yml: 405时不立即退出,改为重试多轮后才放弃
  (405可能是CI状态同步延迟,不是真的合并失败)
- auto-merge.yml + auto-approve.yml: 增加30秒初始等待
  (避免tar.gz checkout太快,CI还没写第一个status就检查)
Collaborator

代码审查结果 - PR #486

⚠️ 问题(2个需要修改)

  1. scripts/check_ci_status.py 第45行:将“未找到状态”默认返回值从 success 改为 pending 存在死锁风险。如果 CI 因路径过滤或其他规则被跳过(且未发送 skipped 状态),脚本将一直返回 pending,导致外层循环空转直至超时(20-30分钟),严重影响自动化效率。
  2. .gitea/workflows/auto-merge.yml 第151行ANY_PENDING 变量已定义并赋值,但在合并判断逻辑中未被使用。由于 ALL_SUCCESS 初始化为 true,当 CI 状态为 pending 时,脚本仍会尝试执行合并操作,导致产生不必要的 405 错误并消耗 API 配额,仅靠重试机制来掩盖逻辑缺陷。

💡 建议(1个可选)

  1. .gitea/workflows/auto-merge.yml:405重试机制(MAX_405_RETRIES=6)仅能覆盖约60秒的窗口。如果 CI 启动或执行较慢,可能导致重试次数耗尽而误报失败。建议根据实际 CI 耗时适当增加重试次数或延长单次休眠时间。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-17 20:43:54 | 模型:

## 代码审查结果 - PR #486 ### ⚠️ 问题(2个需要修改) 1. **scripts/check_ci_status.py 第45行**:将“未找到状态”默认返回值从 `success` 改为 `pending` 存在死锁风险。如果 CI 因路径过滤或其他规则被跳过(且未发送 `skipped` 状态),脚本将一直返回 `pending`,导致外层循环空转直至超时(20-30分钟),严重影响自动化效率。 2. **.gitea/workflows/auto-merge.yml 第151行**:`ANY_PENDING` 变量已定义并赋值,但在合并判断逻辑中未被使用。由于 `ALL_SUCCESS` 初始化为 `true`,当 CI 状态为 `pending` 时,脚本仍会尝试执行合并操作,导致产生不必要的 405 错误并消耗 API 配额,仅靠重试机制来掩盖逻辑缺陷。 ### 💡 建议(1个可选) 1. **.gitea/workflows/auto-merge.yml**:405重试机制(`MAX_405_RETRIES=6`)仅能覆盖约60秒的窗口。如果 CI 启动或执行较慢,可能导致重试次数耗尽而误报失败。建议根据实际 CI 耗时适当增加重试次数或延长单次休眠时间。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-17 20:43:54 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-07-17 20:45:04 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-17 20:45:04 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 7c0d33984e into develop 2026-07-17 20:46:23 +08:00
auto-approve-bot deleted branch fix/check-ci-status-false-positive 2026-07-17 20:46:23 +08:00
Sign in to join this conversation.