Skip to content

fix(ci): 超时退出码断言补 124 + PR 阶段也跑单元测试(修 main 上的红灯) - #16

Merged
Seller-1990 merged 2 commits into
mainfrom
fix/ocr-review-timeout-124
Oct 10, 2026
Merged

Seller-1990 merged 2 commits into
mainfrom
fix/ocr-review-timeout-124

Conversation

@Seller-1990

Copy link
Copy Markdown
Owner

背景

用户报告「PR #14、#15 在 GitHub 上都报错了」。查证结果:

根因:一个只在 Linux 成立的行为差异

PR #14 给 scripts/ocr-review.sh 的 run_with_deadline() 加了「有 GNU timeout 就优先用它」的新分支:

if timeout --version >/dev/null 2>&1; then
  timeout "$secs" "$@"
  return $?
fi

脚本自己的判定已经改成了 124|137|143,但测试的断言只写了 137|143:

环境 走的路径 退出码 旧断言
macOS(本机开发) 无 timeout,进程组回退 143 ✅ 通过
ubuntu-latest(CI) 有 GNU timeout 124 ❌ 失败

所以本地 npm test 全绿、CI 红。git log -S'124|137|143' -- scripts/ocr-review.sh 唯一定位到 67766d4(PR #14 的 squash 合并)。

本机复现(不是猜的):把 GNU timeout 的行为(自成进程组 + 整组 TERM→KILL + 返回 124)做成 PATH 上的替身,再跑旧断言,报错与 CI 一字不差:

actual: '  ⚠ 本跳到 2s 上限被强制终止(退出码 124),降级到下一个\n…'
expected: /上限被强制终止(退出码 (137|143))/
error: '超时必须明说并带上退出码'

改动

  1. test/ocr-review.test.js —— 断言只要求「是脚本认定为被强制终止的那组码」,不锁死平台具体值;补注释说明两条实现路径各返回什么。脚本本身没动:124 确实是 GNU timeout 到点自杀的码,错的是断言。
  2. .github/workflows/build-installers.yml —— 加 pull_request: branches: [main]。原先 PR 上只跑 ocr-review 的 advisory 评审、不跑 npm test,所以这类差异只能等合进 main 才亮灯。构建类 job 都有 startsWith(github.ref,'refs/tags/v') || event_name == 'workflow_dispatch' 守卫,PR 上只剩 test 这一个 job。顺带修掉文件头一句不实的注释(原先写「此前只有 tag 与 PR 触发测试」,git log 三个版本都没有过 pull_request)。

验证

  • 两条路径本机都实测通过:
    • 无 GNU timeout(macOS 原生):npm test → 594 tests / 593 pass / 1 skipped / 0 fail
    • 注入 GNU timeout 替身:test/ocr-review.test.js → 28/28(含「孙进程必须已被回收」断言)
  • 对照组:旧断言 + GNU timeout 替身 → 复现 CI 同一条失败(见上)。
  • 本 PR 自己就会跑新增的 pull_request test job,等于在真的 ubuntu-latest 上再验一次。

PR #14 给 run_with_deadline 加了「有 GNU timeout 就优先用它」的分支,脚本这边
case 已经改成 124|137|143,但测试的断言只写了 137|143:

- macOS(本机开发环境)没有 timeout,走进程组回退,返回 143 → 本地全绿;
- ubuntu-latest 有 GNU timeout,到点自杀返回 124 → main 上这个用例红。

实测复现:把 GNU timeout 的行为(自成进程组 + 整组 TERM→KILL + 返回 124)做成
PATH 上的替身,再用旧断言跑,报的错与 CI 一字不差:

  actual: '  ⚠ 本跳到 2s 上限被强制终止(退出码 124),降级到下一个\n…'
  expected: /上限被强制终止(退出码 (137|143))/
  error: '超时必须明说并带上退出码'

脚本的分类没错(124 确实是 GNU timeout 到点自杀的码),错的是断言把平台的
具体退出码写死了。改成只要求「是脚本认定为被强制终止的那组码」,并补注释说明
两条实现路径各返回什么。两条路径本机都实测通过(原 143 路径 28/28;注入 GNU
timeout 替身后 28/28,含孙进程回收断言)。
build-installers 原先只在 push main / tag / 手动触发时跑,PR 上只有 ocr-review
的 advisory 评审,不跑 npm test —— 所以「本机全绿、Linux 红」这类差异会一路
合进 main 才亮灯。PR #14 和 #15 就是这么各红了一次(两次都是同一个用例)。

构建类 job 都带 `startsWith(github.ref,'refs/tags/v') || event_name ==
'workflow_dispatch'` 守卫,加 pull_request 后 PR 上只剩 test 这一个 job。

顺带修掉文件头一句不实的注释(原先写「此前只有 tag 与 PR 触发测试」,实际从
来没有过 pull_request 触发,git log 三个版本都没有)。
@github-actions

Copy link
Copy Markdown

✅ OpenCodeReview: Review complete: 0 finding(s) across 1 selected item(s).

@Seller-1990
Seller-1990 merged commit d7599d9 into main Oct 10, 2026
6 checks passed
@Seller-1990
Seller-1990 deleted the fix/ocr-review-timeout-124 branch October 10, 2026 10:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant