跳转至

它省下什么

三件不同的事,第三件最容易被低估。

省的 靠什么
上下文——四千行的 job 日志变成 grep 加几行上下文;12 job 的矩阵变成 12 行名册 get_run、get_job、search_job_log,以及 tail/from_line/next_to_line 窗口
墙钟时间——等待变成一次有界调用;取消与去重省下本来会白烧的分钟 wait_for_run、trigger_workflow(if_absent=true)、cancel_run、typical_duration_seconds
错误结论——"第 1 次挂在容量抖动、第 2 次通过"而不是"这个后端不稳" attempt/is_latest、has_log + reason、ci_status.health.alerts

前两件没有它只是慢一点;第三件会让你写出一份看起来很有把握、实际是错的报告—— 而别人是照那份报告做事的。

一次会话的实测(使用者自述,非基准测试)

一位使用者记录了他一次会话的用量(他的估算,不是我们的基准):

问题 不用本服务 用本服务
Oracle 那个 job 为什么挂 一个 job 4369 行日志 grep: "DPY-6005" → 19 个行号 + 上下文
12 job 的 run 哪个红了 12 份日志约 4.8 万行 get_run 花名册
这十个仓库绿了吗 十次读取 recent_runs 一次

他最锋利的一点不是比例:完整矩阵的日志根本装不进上下文窗口,所以这不是"便宜一点", 而是"原本做不了"。他同一天还记录到:cancel_run + if_absent 粗估省下 50~60 分钟 runner 时间;另有三次,是某个字段让他避免了错误结论,而不是省下一点时间。

诚实的一半(他的记录 + 我们的):

  • 每次调用在内容之前就有 schema + JSON 的开销,约几百 token——"这个 run 绿了吗"并不免费;
  • 自建服务必须能按构建辨识,否则所有评价都可能评错对象(build.revision 就是为此存在);
  • 客户端缓存了工具目录时,"服务端改了"和"我能看见改了"之间差一次重连。

我们用在自己身上看到的

用本服务的工具写本服务:

  • 77 个 job 的矩阵一次拿回名册;失败 step 的 443 行日志一次窗口读回;
  • 对六天前的 run 调 get_job_log(step=N),返回的是 capture_closed 而不是空文档—— 这才促使我们去拉原始归档,测出 step 分片在 56~70 分钟之间被压平;
  • ci_status.health.alerts 列出投递失败的 run id,修复从"排查"变成一遍 get_run;
  • 在 24 个分支的仓库上查询,暴露了 workflow 显示名随分支漂移的问题—— 这个缺陷只读自己仓库是看不见的。