Claude Code 会话是持久化的,可以恢复。交互式使用时,--continue 恢复最近的会话。CI/CD 自动化时,从 JSON 输出捕获 session_id 然后用 --resume 加显式 ID——因为 --continue 在并发流水线中不安全。
交互式:—continue
claude --continue 恢复最近的会话。搭配 -p:claude -p "continue the auth review" --continue。简单,不需要 ID。
编程式:—output-format json + —resume
自动化脚本和 CI/CD:
- 阶段 1:
claude -p "lint check" --output-format json→ 从 JSON 响应解析session_id - 阶段 2:
claude -p "review code" --resume $SESSION_ID
--output-format json 标志产出结构化输出,里面有 session_id,可以用 jq 等工具可靠地解析。通过环境变量在流水线阶段之间传递 ID。
流水线数据
3 阶段 CI 流水线中新会话 vs resume 链的对比:
| 指标 | 新会话(每阶段) | Resume 链 |
|---|---|---|
| 阶段 1 | 45 秒,12,000 token | 45 秒,12,000 token |
| 阶段 2 | 45 秒,12,000 token | 18 秒,3,000 token |
| 阶段 3 | 45 秒,12,000 token | 12 秒,2,000 token |
| 合计 | 135 秒,36,000 token | 75 秒,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 流水线:
- 每个 PR 的阶段 1 从 JSON 输出捕获
session_id session_id作为流水线变量传递给后续阶段- 每个阶段用
--resume $SESSION_ID加 PR 专属 ID - 不管并发情况如何,保证 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 在并发流水线中不安全。