跳转到主要内容

Software Object Warehouse

构建软件仓库 同步增量变化

从本地 RPM 与 DEB 软件包生成 YUM、APT 索引。已有软件包目录可直接使用 Plain 模式;需要管理软件包策略、快照、签名与增量发布时,使用 Managed 模式。

SOW 0.5.0 · Linux + macOS · RPM + DEB · Apache-2.0

核心价值

从平面仓库起步,按需升级为托管交付

先用一条命令生成本地仓库;需要治理时,再由 Managed 工作区维护成员关系、不可变 Generation 与发布历史。

01 / 快速创建

一条命令创建可用仓库

◇ 直接把装有软件包的目录交给 SOW

  • sow create 就地索引目录顶层的 RPM 与 DEB 文件
  • 生成 rpm-md 元数据与 APT Packages 索引
  • 显式发布时间参数兼容已有 YUM 客户端

不需要守护进程或元数据工具链,从软件包直接得到仓库索引。

create.sh
$ sow create /srv/repo --jobs 8
✓ repodata/repomd.xml
✓ Packages
✓ Packages.gz

02 / 托管模式

一份包体,多个托管视图

◇ 统一管理 Enterprise Linux、Debian 与 Ubuntu 仓库

  • 每个 Repository 的 live 软件包只存一份,各 Dist 只投影元数据视图
  • 避免对象存储上的重复 object key 与冗余上传
  • 用不可变 Built Generation manifest 保留快照,并组织不同仓库变体

成员关系、筛选策略、签名与快照都有明确状态和审计记录。

03 / 开箱即用

自包含构建,校验后交付

◇ macOS 与 Linux 使用一致的命令接口

  • 为 amd64 与 arm64 提供自包含 CGO_ENABLED=0 归档
  • Release Pipeline 为 Linux 生成 RPM 与 DEB 安装包
  • 校验生成的元数据;Managed 模式支持中断后的写入恢复

不需要运营仓库守护进程,也不需要额外语言运行时。

04 / 增量同步

只发布本次变更集

◇ 先查看,再同步

  • sow changes 列出包体、元数据、指针与删除记录
  • Operation Log 保留谁在何时修改了什么
  • 发布只上传差异,而不是所有仓库对象

无论同步到文件系统还是云端,小改动都只产生小批量传输。

publish.sh
$ sow changes -r pgsql
+ pool/p/postgresql-18/...
~ dists/el9/x86_64/repodata/...
$ sow publish prod
✓ 变更对象已校验

运行模型

起步时保持简单,托管后保持显式

SOW 让轻量路径随时可重建,并让每个托管交付决策都可见。

01

重建派生状态

Plain 模式根据软件包目录重建索引。包字节与参数相同,元数据输出就相同,显式指定的发布时间也属于参数。

02

显式管理意图

Managed 模式分离 Desired Membership 与不可变 Built Generation,避免策略和发布沦为隐式副作用。

03

交付前先验证

对外服务前校验软件包与元数据完整性;Managed 模式还会记录操作,并恢复中断的写入。

常见问题

选择刚好满足需求的最小流程

Plain 与 Managed 使用同一个二进制,但解决不同的运行问题。

我应该从 Plain 还是 Managed 模式开始?

如果目录已经恰好包含需要对外服务的全部内容,从 Plain 模式 开始。需要由 SOW 管理成员关系、策略、已签名元数据、不可变 Generation、审计历史或发布目标时,使用 Managed 工作区。

可以替换现有的 createrepo_c 工作流吗?

平面 RPM 目录可以使用 sow create,并通过 0.5 新增参数指定发布时间。维护脚本继续负责保存发布历史与签署索引,再用保留旧缓存的客户端验收。完整步骤见 YUM 迁移指南;Plain 不生成旧式 SQLite 元数据或模块流。

签署 RPM 包时,也会签署仓库索引吗?

--sign-with 为未签名 RPM 包补签。Plain 模式需要在最后一次建库后单独签署 repomd.xml;Managed 模式通过配置管理元数据签名策略。两种流程见仓库签名。

SOW 能同时处理 RPM 与 DEB 软件包吗?

可以。Plain 目录可同时放置 RPM 与 DEB 软件包。在 Managed 模式中,每个 Dist 只有一种格式,但同一个 Repository 可从公共交付树中对外提供多个 RPM 与 DEB Dist。

SOW 需要守护进程或数据库服务吗?

不需要。SOW 是自包含 CLI,生成静态仓库文件。Managed 工作区把嵌入式状态保存在本地;只需使用现有 HTTP 服务器对外提供生成的公共树。

Managed 仓库可以发布到哪里?

配置好的目标可以是本地或挂载的 filesystem,也可以是 Cloudflare R2 对象存储。sow changes 会在发布前展示差异,SOW 记录的 target 状态会用于下一次增量发布。

现在就构建第一个仓库。从 sow create 开始;需要筛选策略、快照与发布历史时,再进入 Managed 工作区。