Skip to content

ci: 用独立 runner 与任务缓存缩短 PR 等待 - #139

Merged
Disdjj merged 3 commits into
mainfrom
optimize-ci-runtime
Sep 5, 2026
Merged

ci: 用独立 runner 与任务缓存缩短 PR 等待#139
Disdjj merged 3 commits into
mainfrom
optimize-ci-runtime

Conversation

@Disdjj

@Disdjj Disdjj commented Sep 5, 2026

Copy link
Copy Markdown
Member

最近 20 次成功 PR CI 的中位数为 6 分 16 秒、p90 为 6 分 50 秒。最近一次纯文档 PR 仍等待 6 分 32 秒:类型检查 107 秒、lint 30 秒、测试 149 秒、构建 67 秒串行堆叠;依赖安装仅 8 秒,正常排队中位数仅 3 秒。基线运行

将 quality、单测、集成测试与 build/pack 放到独立 runner。每台测试 runner 仍限制一个包的 Vitest pool,保留此前修复 DOM 计时器超时的约束;测试直接消费源码,类型检查由独立任务承担,避免每台 runner 重复执行。所有包测试及根目录的发布、Dockerfile、部署过滤、Compose 快照回归完整保留。

仅类型检查与构建使用跨运行 Turbo 缓存,按 Node 精确版本、OS/架构、任务、锁文件、根配置和根脚本隔离,包源码及依赖由 Turbo task hash 判断。测试和最终 tarball 检查每次执行。统一 verify 检查保留,并显式拒绝任何依赖任务的失败、取消或意外跳过。

取舍是增加并行 runner 和几次依赖安装,以缩短 PR 等待。没有公开包的契约或发布内容变化,无需 bump 或发布 tag。

验证:

  • 本地 pnpm verify 与 pnpm turbo run build 通过(复用既有本地 Turbo 缓存)。
  • 新单测/集成测试命令实际完整运行通过;6 个公开包的 pack --skip-install 验证通过。
  • actionlint v1.7.12 通过;覆盖检查确认 8 个包测试恰好执行一次,汇总闸门拒绝全部 15 种单任务失败/取消/跳过组合。
  • GitHub 两次运行全部通过:首次无任务缓存同提交缓存重跑
同一产品源码的对比 PR 等待时间 相比基线
原流水线 6 分 32 秒
新流水线,任务冷缓存 2 分 46 秒 缩短 58%
新流水线,任务热缓存 1 分 49 秒 缩短 72%

统计口径为本次 attempt 创建到最后 job 完成。两次新运行均使用同一提交,每种缓存状态各测一次;这证明本次收益,不能替代长期 p50/p90。冷缓存 typecheck 0/8、build 0/6 命中;热缓存分别 8/8、6/6 命中,实际执行步骤均降至约 1 秒。热缓存两组测试仍实际运行 80 秒与 66 秒,tarball 检查仍执行 11 秒。

累计 runner 执行时间由基线 395 秒变为冷缓存 441 秒(约 +12%)、热缓存 296 秒(约 -25%);这是执行时长,未计账单按 job 取整。主干首次运行后才能建立供后续 PR 复用的 main 分支缓存。

把类型检查、两组测试和产物验证分配到独立 runner,避免全部堆在 verify 的关键路径,同时保留每台 runner 单个 Vitest pool。用统一 verify 汇总全部结果,失败、取消或跳过均拒绝通过。只缓存类型检查和构建,根脚本与工具链变化使缓存失效;测试及 tarball 检查每次执行。代价是增加并行 runner 与依赖安装次数。
@Disdjj
Disdjj marked this pull request as ready for review September 5, 2026 23:36
@Disdjj
Disdjj merged commit 010ff17 into main Sep 5, 2026
12 checks passed
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