跳转到主要内容

SOW 设计演进:从路由图到仓库引擎

SOW 如何从 v0.1 软件分发平台转为仓库引擎,以及 v0.2 到 v0.5 如何改进这一模型。

SOW 在 v0.1 中探索了以 Git 为核心的软件分发控制面,在 v0.2 中转为仓库引擎。 本文记录这次变化,以及后续到 v0.5.0 的改进。

下文版本号指正式 Git 标签。部分归档计划曾用“v0.2”“v0.3”指代开发中的设计; 其中在 RPM 视图内创建硬链接的 C2 布局,已在 v0.2.0 发布前被替换。

早期工作的细节见四篇配套文章:

简要历史

版本 主要变化 公共布局
v0.1 Git/CAS 状态、Route、边缘鉴权、云端工作流与 Pigsty 迁移 已退役
v0.2 Plain/Managed 模式、每仓库一个包池、纯元数据视图、保留 Generation 与目标发布 引入沿用至今的 pool/ + dists/ 布局
v0.3 移除 V1、缓存包属性、简化 Plain 构建、批量提交包体 不变
v0.4 单遍校验、独立 RPM 信任环、目标重新绑定、迁移与恢复修复 不变
v0.5 包路径保留、移除与恢复修复、签名检查、可复现的 Plain 时间戳 不变

各版本的实现保存在源码标签中: v0.1.0、 v0.2.0、 v0.3.0、 v0.4.0 和 v0.5.0。

v0.1:问题很有价值,产品概念太多

第一版计划覆盖 Git 状态、内容寻址存储、Route 与 View、快照、远端存储服务、边缘鉴权和旧系统迁移。 现存 44 份 ADR(编号至 0045)记录了这些决策及其失败情形。

组合后的范围使所有权难以解释。多个对象都可能描述同一份包体与公开路径。 本地仓库生成也依赖云端、边缘服务和迁移概念。

v0.2 重置移除了 Git 权威数据库、独立 CAS 层、Route/View/Snapshot 命令模型和边缘访问控制, 把本地仓库构建作为核心任务。

v0.2:先建立小而明确的所有权模型

v0.2 将产品拆成两条执行路径:

  • Plain 扫描调用者拥有的目录,就地重建 RPM 或 DEB 元数据。
  • Managed 管理一个包含独立仓库的工作区。每个仓库都有自己的包池、Dist、SQLite 状态、锁和恢复记录。

这次重置引入了沿用至今的术语:包对象、成员关系、期望状态(Desired)、已构建状态(Built)、 Generation(构建快照)和变更集。稳定锁文件协调访问,协议指针在其他生成文件就绪后替换, Managed 操作日志记录中断后的恢复方式。

最初的 C2 实现仍会在每个 RPM 视图中创建包体硬链接。这一布局在发布前发生了变化。

v0.2.0:把 Repository Root 变成交付单元

单包体决策起草于 2026-08-05,并在 8 月 8 日随 v0.2.0 发布。 它移除了 RPM 视图中的包体别名。一个仓库只有一套 pool/ 与纯元数据 dists/, 完整仓库根目录是复制、托管、鉴权与发布的单位。

v0.2.0 也明确区分了本地与远端状态:

  • 包对象、Desired/Built 状态、Generation、变更集与本地保留记录属于仓库。
  • 发布尝试、已应用检查点、远端清单、缓存宽限期与删除记录属于一个仓库和一个发布目标前缀。

仓库之间不对包体去重。一个目标前缀只有一个所有者。 兼容性导出在原仓库之外创建独立副本。

v0.3:在同一模型上做减法与优化

v0.3 保持 v0.2.0 公共布局不变。它删除了 V1 运行时与迁移测试工具,引入包属性缓存, 并将 Plain 生成简化为可重建的单遍操作。成员关系改为批量展开,包体改为分组提交,减少文件系统操作。

v0.4:强化校验与恢复

v0.4 将 Managed 深度校验改为有界单遍读取。RPM 验证必须在一个信任环内完整通过, 不能拼接不同信任环的局部结果。显式重新绑定操作可以更新发布目标的可变设置。 迁移、发布恢复与公共交付检查也更严格。

早期协同发布提案曾考虑用 rclone 批量传输。最终设计保留原生存储适配器, 让 SOW 在同一状态机中检查对象身份、记录回执、控制提交顺序并恢复发布。

v0.5:保留包 URL 与已提交状态

v0.5.0 于 2026-09-29 发布,公共布局不变,托管状态升级为 schema 13。 新增的包池路径索引阻止不同字节占用已有 URL,也覆盖历史发布记录中的 URL。

该版本还修复了移除 Dist 后重新添加包的恢复问题,保留中断前已提交的更改, 并在修改期望状态前检查冲突的签名策略。Plain create --metadata-timestamp 为可复现 RPM 元数据 提供显式时间戳,默认值为零。完整变化见 v0.5.0 更新日志。

每次重构都保留下来的原则

v0.1 的部分规则继续用于更小的模型:

  • 每个持久事实只有一个所有者。
  • 包体与可重建元数据分开保存。
  • 不可变包体与元数据就绪后,再替换协议指针。
  • 提交意图持久化后,通过前向恢复完成操作。
  • 删除前检查引用关系与精确身份;远端删除还要检查缓存宽限期与存储服务能力。
  • 兼容性结果记录产生它的源码版本、客户端、存储服务和环境。

当前设计理由见设计原则、系统模型、 单包体仓库和发布与恢复。 命令与操作步骤见 SOW 文档,各版本变化见发布注记。