playbooks/docs/ai-workspace-runtime-delivery-plan.md
2026-06-15 22:02:52 +08:00

171 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AI Workspace Runtime 交付计划
## 1. 目标与边界
本计划定义 AI Workspace 核心运行时从源码仓库构建、发布、离线聚合到目标机部署的完整交付链路。
核心原则:
- LiteLLM、xworkspace-console、xworkmate-bridge、QMD 分别在各自源码仓库的 GitHub Actions build job 中构建。
- 每个组件独立发布 `runtime-*` GitHub Release 及其 SHA256 清单。
- offline package 只下载已发布产物,逐文件完成 SHA256 校验后再聚合。
- 目标机只允许校验、解包、安装、配置、启动和健康检查,禁止源码编译、依赖构建及镜像构建。
- 所有未经过 CI 或目标机矩阵实测的能力均保持 `TODO`,不得仅依据设计或局部实现标记完成。
## 2. 目标架构
```text
LiteLLM repository ---------- build job --> runtime-litellm-* ----------\
xworkspace-console repository build job --> runtime-xworkspace-console-* --\
xworkmate-bridge repository -- build job --> runtime-xworkmate-bridge-* -----+--> offline package job
QMD repository -------------- build job --> runtime-qmd-* ------------------/ |
| download
| SHA256 verify
| manifest aggregate
v
offline-package-*
|
v
target host: verify/install only
```
### 2.1 组件 Release
四个组件必须由各自仓库负责构建,聚合仓库不得从源码代建组件。
| 组件 | 构建责任 | Release 命名 | 必需产物 |
| --- | --- | --- | --- |
| LiteLLM | LiteLLM 仓库 GitHub Actions build job | `runtime-litellm-*` | 固定版本 Python runtime/依赖包、启动入口、组件 manifest、SHA256 清单 |
| xworkspace-console | xworkspace-console 仓库 GitHub Actions build job | `runtime-xworkspace-console-*` | dashboard 静态产物、API 二进制、运行配置模板、组件 manifest、SHA256 清单 |
| xworkmate-bridge | xworkmate-bridge 仓库 GitHub Actions build job | `runtime-xworkmate-bridge-*` | bridge 二进制、systemd/运行配置模板、组件 manifest、SHA256 清单 |
| QMD | QMD 仓库 GitHub Actions build job | `runtime-qmd-*` | 已安装依赖和已构建 CLI/runtime、组件 manifest、SHA256 清单 |
资产文件名必须精确匹配,聚合器和目标机均不得尝试别名、模糊匹配或兼容猜测:
- Console`xworkspace-console-runtime-linux-{amd64|arm64}.tar.gz`
- Bridge`xworkmate-bridge-linux-{amd64|arm64}.tar.gz`
- QMD`qmd-runtime-linux-{amd64|arm64}.tar.gz`
- LiteLLM`litellm-runtime-{distro}-{version}-{arch}.tar.gz`
每个组件 manifest 至少记录:组件名、源码 commit、版本、构建时间、目标 OS、目标架构、入口文件、文件列表及每个文件的 SHA256。
### 2.2 offline package 聚合
offline package job 必须:
1. 从四个组件的 `runtime-*` Release 下载与目标平台匹配的产物和 SHA256 清单。
2. 在聚合前执行 SHA256 校验;缺少清单、文件缺失或摘要不一致时立即失败。
3. 生成聚合 manifest固定四个组件的 Release tag、源码 commit、资产 URL、资产大小和 SHA256。
4. 将已校验组件产物、部署 playbook 所需依赖及聚合 manifest 打包为 `offline-package-*`
5. 对最终 offline package 再生成 SHA256并在 CI 中执行一次解包与结构校验。
禁止以 `latest` 作为不可追溯的部署输入;重新聚合必须基于明确 tag 或不可变 commit。
### 2.3 目标机部署
目标机部署必须开启 prebuilt-only 约束。缺少任一预构建产物时直接失败,不得回退到以下行为:
- `git clone` 或源码 checkout
- `npm install`、`npm run build`、`go build`、`go run`
- `pip install` 从公网或源码解析构建依赖;
- `docker build`、`podman build` 或其他本地镜像构建;
- 任何需要编译器、SDK 或前端构建工具链的安装步骤。
部署仅执行offline package SHA256 校验、manifest 校验、解包、文件安装、权限设置、配置渲染、服务启动、健康检查和结果汇总。
## 3. 资源与性能约束
### 3.1 并发控制
- 全局并发硬上限必须满足 `并发数 <= 2 * 在线 CPU 数`,在线 CPU 数以执行时实际可用 CPU 为准。
- 初始并发取任务上限、配置上限和 `2 * 在线 CPU 数` 三者最小值。
- 调度器必须随 load 动态收缩:负载超过阈值时停止发放新任务并逐级降低并发;负载恢复且持续稳定后再缓慢扩容。
- 动态收缩不得中断正在执行的不可重入安装步骤;只限制后续任务进入。
- 日志和最终摘要必须记录 CPU 数、load 采样、每次并发调整的时间、原因及调整前后值。
### 3.2 部署耗时分布
每次部署必须记录总耗时及至少以下阶段耗时:
- offline package 下载;
- SHA256 与 manifest 校验;
- 解包;
- 各组件安装;
- 配置渲染;
- 服务启动;
- 健康检查。
CI/验收报告按 OS、架构、冷启动/缓存命中、首次执行/幂等重跑分组,统计样本数、最小值、最大值、平均值以及 P50、P90、P95、P99。样本不足时保留原始数据并明确标注不以单次耗时代替分布结论。
## 4. 支持矩阵与验收
目标支持以下全部组合:
| 发行版 | 版本 | 架构 |
| --- | --- | --- |
| Debian | 11、12、13 | amd64、arm64 |
| Ubuntu | 22.04、24.04、26.04 | amd64、arm64 |
每个矩阵项必须验证:
1. offline package 下载和 SHA256 校验成功。
2. 目标机在无源码、无构建工具链、组件外网访问受限的条件下部署成功。
3. 四个组件版本与聚合 manifest 完全一致。
4. 服务启动、健康检查和关键 smoke test 成功。
5. 同一主机使用同一输入至少连续执行两次;第二次成功且无非预期变更、无重复资源、无凭据轮换、无构建行为。
6. 首次部署和幂等重跑均产出阶段耗时及完整摘要。
Ubuntu 26.04 在实际可用 runner/镜像和依赖生态完成验证前,只能保持计划支持状态,不得标记已验证。
## 5. 当前事实
以下状态只记录当前仓库或相邻交付文档能够证明的事实,不把目标设计视为完成:
- [x] 聚合入口已拆分为 preflight 与 runtime playbookpreflight 已校验 `docker`、`k3s`、`systemd` 运行模式组合。
- [x] xworkspace-console 与 QMD 的部署代码已出现预构建 archive 输入及 prebuilt-only 缺包失败入口。
- [x] 相邻一键部署文档已记录xworkspace-console 离线包 `publish-release` 链路和 Release 产物上传曾核对完成。
- [x] 相邻一键部署文档已记录:一键安装脚本优先使用离线安装包。
- [ ] xworkspace-console 与 QMD 当前仍存在目标机源码 checkout/依赖安装/构建回退,尚未满足“目标机禁止构建”。
- [ ] LiteLLM 当前可覆盖 package spec但未证明其独立 `runtime-litellm-*` Release 和完全离线、免构建安装链路。
- [ ] xworkmate-bridge 独立 `runtime-xworkmate-bridge-*` Release 和预构建消费链路尚未在本计划范围内验证。
- [ ] 四组件 Release 的一致命名、manifest 和 SHA256 契约尚未完成验证。
- [ ] offline package 的逐文件下载、SHA256 校验、聚合 manifest 和最终包校验尚未完成验证。
- [ ] 并发硬上限、基于 load 的动态收缩及调整日志尚未完成验证。
- [ ] 部署耗时分布统计尚未完成验证。
- [ ] 连续重复执行的幂等性验收尚未完成。
- [ ] Debian 11/12/13、Ubuntu 22.04/24.04/26.04 的 amd64/arm64 全矩阵尚未完成验证。
## 6. TODO
### P0构建与发布闭环
- [ ] TODO在 LiteLLM 仓库建立 build job发布 `runtime-litellm-*` Release、组件 manifest 和 SHA256 清单。
- [ ] TODO在 xworkspace-console 仓库固化 build job确认每次发布 `runtime-xworkspace-console-*` Release、组件 manifest 和 SHA256 清单。
- [ ] TODO在 xworkmate-bridge 仓库建立 build job发布 `runtime-xworkmate-bridge-*` Release、组件 manifest 和 SHA256 清单。
- [ ] TODO在 QMD 仓库建立 build job发布 `runtime-qmd-*` Release、组件 manifest 和 SHA256 清单。
- [ ] TODO为 amd64、arm64 分别产出可安装资产;若资产与发行版相关,则按支持矩阵拆分并在 manifest 中明确兼容范围。
- [ ] TODO增加 Release 契约测试拒绝缺失入口、manifest、SHA256 或架构资产的发布。
### P0离线聚合与目标机免构建
- [ ] TODO实现 offline package job按固定 tag 下载四组件 Release并在聚合前逐文件执行 SHA256 校验。
- [ ] TODO生成可追溯聚合 manifest并为最终 `offline-package-*` 生成和发布 SHA256。
- [ ] TODO在目标机部署入口强制 prebuilt-only删除或禁用四组件所有源码构建回退。
- [ ] TODO增加“目标机禁止构建”守卫检测到编译器调用、包构建命令、源码 checkout 或镜像构建即失败。
- [ ] TODO在断网或仅允许访问 offline package 源的目标机上完成端到端部署验证。
### P1并发、性能与可观测性
- [ ] TODO实现在线 CPU 探测和 `<= 2 * 在线 CPU` 的全局并发硬限制。
- [ ] TODO定义 load 采样窗口、收缩/恢复阈值、迟滞策略和最低并发,完成动态收缩测试。
- [ ] TODO记录阶段级耗时、组件级耗时、并发变化和环境标签产出结构化 JSON 及人类可读摘要。
- [ ] TODO汇总部署耗时分布至少输出 count/min/max/avg/P50/P90/P95/P99并区分首次执行与幂等重跑。
### P1幂等与平台矩阵
- [ ] TODO为每个支持矩阵项连续执行至少两次验证第二次无非预期 changed、服务中断、重复资源或凭据变化。
- [ ] TODO覆盖 Debian 11/12/13 amd64/arm64。
- [ ] TODO覆盖 Ubuntu 22.04/24.04/26.04 amd64/arm64。
- [ ] TODO保存每个矩阵项的 Release tag、offline package SHA256、部署日志、耗时数据和验收结论。
- [ ] TODO全部矩阵通过后再把“计划支持”更新为“已验证支持”部分通过时逐项记录不做整体完成声明。