Skip to content

Launchpad 事件模式

launchpad up --headlesslaunchpad down --headless 会向 stdout 每行流式输出一个 JSON 事件。这是自动化接入面:可从 CI、脚本或驱动型 TUI 中对这些事件进行断言。

所有事件共享相同的顶层结构。仅与该事件类型相关的字段会被填充。

json
{
  "ev":       "<kind>",        // discriminator; see below
  "time":     "2026-07-02T16:05:14.089Z",
  "phase":    "<phase>",       // only on ev=phase
  "vm_key":   "mssp",          // scopes VM-level events
  "step":     "install",       // sub-phase within a VM
  "percent":  60,              // 0-100
  "message":  "...",           // human-readable
  "level":    "info",          // for vm_log
  "gate_id":  "...",           // for gate_open / gate_resolved
  "instructions": "...",       // for gate_open
  "copy_text":    "...",       // for gate_open
  "ipv4":     "100.x.x.x",     // for vm_ready
  "ipv6":     "...",
  "ssh_user": "ops",
  "ssh_port": 22,
  "fields":   { "capabilities": ["vm.plan"] },  // free-form; used by plugin_ready
  "error":    { "category":"...", "code":"...", "message":"...", "hint":"..." }
}

事件类型

ev触发时机是否终结?
phase编排器切换阶段时。
plugin_ready供给插件已启动并返回其 hello 握手。
vm_plan对插件将会创建内容的每 VM 试运行描述。
vm_progress每 VM 子步骤进度(含 step + percent)。
vm_ready插件已创建并验证该 VM。
vm_log来自插件(进度中继)或 launchpad 驱动的安装 shell 的日志行。
gate_open到达手动闸门;需要操作员确认。
gate_resolved操作员(或 --auto-resolve-gates)关闭了闸门。
error致命错误。error.category + error.code 是稳定标识符。
complete整个流程干净地运行完毕。

errorcomplete 是两个终结事件。每次 launchpad 运行都恰好发出其中一个。

阶段顺序(up)

initializing → planning → provisioning → installing → complete

provisioning 内部,每个 VM 会以 vm_progress 发出 lookup → prepare → image_cache|image_download → tailscale → cloud_init → disk → boot → wait_ready 这些步骤。installing 期间的 install 步骤会将底层安装程序的 stdout 以 vm_log 流式输出。

阶段顺序(down)

tearing_down → torn_down → complete

vm.destroy 会按供给的逆序对每个 VM 调用(租户在先,MSSP 在最后)。每个 VM 的发出都是一个 step=destroyvm_progress

错误分类法

error.category 是 launchpad 及所有第一方插件承诺遵守的十个稳定标识符之一:

类别含义可重试
auth凭据缺失、无效或缺少作用域。
validation配置或输入格式错误。
not_found被引用的实体不存在。
already_exists幂等创建失败,因为实体已存在。
provider_unavailable上游提供方(Tailscale、Hetzner 等)不可达。
quota提供方侧配额耗尽。
timeout等待超过了策略的截止期限。
internal插件/编排器缺陷——意外的错误路径。
network本地网络 / TLS / DNS。
cancelledCtrl-C 或 SIGTERM。

error.code 是该类别下带插件命名空间的标识符(例如 qemu.image.sha256_mismatch)。类别是稳定的;代码可能会新增。

从 bash 消费

bash
launchpad up --config pilot.yaml --headless --auto-resolve-gates | \
  jq -c 'select(.ev == "phase" or .ev == "error" or .ev == "complete")'

要基于完成状态对 CI 作业设置门控:

bash
launchpad up --config pilot.yaml --headless --auto-resolve-gates > run.log
grep -q '"ev":"complete"' run.log || {
  jq -r 'select(.ev == "error") | "\(.error.category)/\(.error.code): \(.error.message)"' < run.log
  exit 1
}

版本兼容性

  • 字段新增不会破坏兼容性。
  • 字段移除会提升 launchpad 主版本号。
  • error.category 的取值是永久的。ev 的取值是永久的。
  • error.code 的取值可能在同一类别内被重命名(它们是插件作用域的)。

基于 Apache 2.0 许可证发布。