自托管 runner 的 checkout 钩子默认 30 分钟超时:卡住的钩子不再一直占着槽位
在自己的机器上跑 Claude Code 云会话(自托管 runner)时,每个会话开始前都有一个准备阶段:把代码检出到工作目录。很多团队会在这里挂一个 checkout 钩子,用来装依赖、拉子模块、准备缓存或注入配置。
钩子是你自己写的脚本,难免有卡住的时候:某个下载一直没响应、某条命令在等输入、私有源连不上。问题在于,旧版本里这样一个卡住的钩子可以无限期地挂着。
默认 30 分钟就停
CLI 2.1.307 的更新说明里有一条行为变化:自托管 runner 的 checkout 钩子在 30 分钟后默认会被停止,会话的准备阶段随之失败。
如果你的钩子确实需要更久(比如首次构建一个很大的依赖缓存),说明里给了两个办法:
- 调大
--checkout-hook-timeout-min,单位是分钟; - 把它设为
0,即不设超时。
同版本的 CLI 环境变量列表里还新增了 SELF_HOSTED_RUNNER_CHECKOUT_HOOK_TIMEOUT_MS,从名字看是同一个超时的毫秒版配置;官方更新说明没有单独解释它,用之前建议以官方文档为准。
顺带修掉的槽位泄漏
和超时配套的是一条修复:在 checkout 钩子运行期间归档或重新排队一个会话,或者直接停止 runner,以前会让钩子的进程继续运行、runner 的槽位也一直被占着。 2.1.307 修好了这个问题。
这两件事加在一起,解决的是同一个现象:runner 上明明没有在干活的会话,却「满了」,新会话一直显示在等 runner。现在卡住的钩子到点会被停掉,中途取消的会话也会把进程和槽位一起清理干净。
升级前后可以检查什么
- 量一下钩子平时跑多久:如果正常情况就接近或超过 30 分钟,升级前先把
--checkout-hook-timeout-min调大,否则会话会在准备阶段失败; - 给钩子里的网络操作加自己的超时:比起等 runner 30 分钟后统一掐断,让下载命令自己超时并输出清楚的错误,排查更快;
- 留意失败的会话:准备阶段因超时失败时,先看钩子日志卡在哪一步,再决定是修钩子还是放宽时限。
同版本其他自托管 runner 变化
- 使用
--use-anthropic-git-proxy的会话,以前可能会把上一个会话留在克隆目录里的.claude/settings.local.json一起提交,已修复; - 为 Anthropic 托管 git 生成的证书文件,现在会像 CLI 一样过滤受信任证书,并用一行
[runner:warn]报告被排除的数量; - 云会话界面上,自托管环境的「Waiting for a runner」状态不再被截断,按需 runner 会从你最后一条消息开始计时并显示失败的尝试。
小结
- 2.1.307 起,自托管 runner 的 checkout 钩子默认 30 分钟超时;
- 需要更久就调大
--checkout-hook-timeout-min,设为0表示不限时; - 钩子运行中取消会话或停止 runner,不再残留进程、占着槽位。