K1.7.1 Task 1.7

Resume 在 CI 流水线中省 44% 时间和 58% Token

Claude Code 会话是持久化的,可以恢复。交互式使用时,--continue 恢复最近的会话。CI/CD 自动化时,从 JSON 输出捕获 session_id 然后用 --resume 加显式 ID——因为 --continue 在并发流水线中不安全。

交互式:—continue

claude --continue 恢复最近的会话。搭配 -pclaude -p "continue the auth review" --continue。简单,不需要 ID。

编程式:—output-format json + —resume

自动化脚本和 CI/CD:

  1. 阶段 1:claude -p "lint check" --output-format json → 从 JSON 响应解析 session_id
  2. 阶段 2:claude -p "review code" --resume $SESSION_ID

--output-format json 标志产出结构化输出,里面有 session_id,可以用 jq 等工具可靠地解析。通过环境变量在流水线阶段之间传递 ID。

流水线数据

3 阶段 CI 流水线中新会话 vs resume 链的对比:

指标新会话(每阶段)Resume 链
阶段 145 秒,12,000 token45 秒,12,000 token
阶段 245 秒,12,000 token18 秒,3,000 token
阶段 345 秒,12,000 token12 秒,2,000 token
合计135 秒,36,000 token75 秒,17,000 token

时间减少 44%,token 减少 58%,质量相同。 恢复的阶段不需要重新读取已在上下文中的文件。

会话状态是本地的

会话数据存在创建它的机器上。如果 CI runner 把阶段 2 分配到了和阶段 1 不同的机器,session_id 指向的数据在那台机器上不存在。Resume 会静默失败,表现为新会话。

修复:确保流水线阶段在同一台机器上运行,或使用共享的会话存储机制。

—continue 在并发流水线中不安全

--continue 恢复的是机器上全局的最近会话。并发 PR 流水线时:

  • PR-1 阶段 1 在 10:00:01 完成
  • PR-2 阶段 1 在 10:00:02 完成
  • PR-1 阶段 2 用 --continue → 恢复了 PR-2 的会话(错了!)

修复:自动化中始终用 --resume $SESSION_ID--continue 只在单用户交互使用时安全。

健壮的多 PR 流水线策略

共享 CI runner 上的并发多 PR 流水线:

  1. 每个 PR 的阶段 1 从 JSON 输出捕获 session_id
  2. session_id 作为流水线变量传递给后续阶段
  3. 每个阶段用 --resume $SESSION_ID 加 PR 专属 ID
  4. 不管并发情况如何,保证 PR 级别的会话隔离

前后审查者接力

两个审查者在不同时间处理同一个 PR:审查者 1 捕获 session_id,审查者 2 用 --resume 从审查者 1 的完整上下文开始——所有已读文件、已识别发现、推理过程都保留。没有多余的文件重读。

反模式:每个阶段都新建会话

每个流水线阶段都新建会话会丢弃所有累积的上下文。审查阶段丢了 lint 发现。测试生成丢了 lint 和审查的洞察。每个阶段重新读取相同的文件。135 秒而不是 75 秒。36,000 token 而不是 17,000。


一句话总结: 交互式用 --continue,CI/CD 用 --resume $SESSION_ID(通过 --output-format json 捕获)——resume 省 44% 时间和 58% token,但会话状态是本地的且 --continue 在并发流水线中不安全。