跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

发布注记

SOW 发布注记,涵盖功能、性能、正确性、打包与验证。

查看各版 SOW 的变化和升级步骤,版本按从新到旧排列。

SOW 0.6.1 升级到 Go 1.27.3,更新依赖,并修复无效输入的错误信息。 已使用 0.5.0 或 0.6.0 的工作区无需迁移数据库,详见升级说明。

1 - SOW v0.6.1

SOW 0.6.1 升级到 Go 1.27.3,更新依赖并修复无效输入的错误信息,工作区格式保持兼容。

SOW 0.6.1 是一次维护更新,升级依赖并改善错误信息。 命令接口、数据库 schema v13、配置 sow/v3 与公开仓库布局保持不变。 已使用 0.5.0 或 0.6.0 的工作区无需迁移数据库。

软件包与归档见下载页,校验和来自 v0.6.1 发布页。

工具链与依赖

源码构建现在要求 Go 1.27.3 或更新版本。所有发布二进制均使用 Go 1.27.3 构建。 本版更新了加密、S3 访问、压缩、SQLite 与 Debian 包解析等依赖。

依赖 版本
ProtonMail go-crypto 1.5.2
AWS SDK for Go / S3 1.47.3 / 1.114.4
klauspost/compress 1.20.3
modernc SQLite / libc 1.61.0 / 1.79.0
pault.ag/go/debian 0.21.1
go.yaml.in/yaml/v3 3.0.5
golang.org/x/crypto / x/sys 0.58.0 / 0.49.0

YAML 解析切换到 YAML 官方团队维护的模块,现有 sow.yml 配置格式不变。 RPM 解析器继续保留已有的本地安全补丁。 第三方许可清单已更新,随每个归档与 Linux 软件包分发。

维护修复

  • 修复无效路径与 OpenPGP armor 类型的错误信息,不再出现 %!w(<nil>)。 涉及日志导出、RPM 元数据生成、签名校验与工作区检查。 原来被拒绝的无效输入仍然会被拒绝。
  • CI 快照包直接从 Makefile 读取版本,避免遗漏硬编码版本号。 同步更新发布工具与 GitHub Actions,包括 GoReleaser 2.18.3、deadcode 0.52.0 和 govulncheck 1.9.0。

升级

更换可执行文件前,停止工作区写入任务并备份完整工作区。 安装 0.6.1 后,对每个仓库执行构建与检查:

sow version
sow build -r REPOSITORY -C /srv/sow
sow check -r REPOSITORY -C /srv/sow

把 REPOSITORY 换成 sow.yml 中的仓库名。没有变化的仓库会报告空操作,保留原构建快照编号与时间戳。 安装命令以及从 0.3、0.4 迁移的步骤,见安装指南。

发布验证覆盖包测试、竞态检查、APT/DNF 客户端、S3 兼容传输,以及 50,000 包的 RPM 元数据生成。 升级与回退检查使用已发布的 0.6.0 二进制创建 RPM/DEB 工作区,由 0.6.1 操作后,再用 0.6.0 重新打开。

漏洞扫描结果

源码分析与保留符号的对照构建均未发现受影响的符号或导入包。 GO-2026-5932 涉及未使用的旧 golang.org/x/crypto/openpgp 包。 SOW 使用维护中的 ProtonMail 分支;四个发布目标的导入图均不包含该旧包。

发布二进制移除了符号表。对这类二进制,govulncheck -mode=binary 会退回模块级判断并报告此提示, 因此其二进制扫描结果与源码扫描不同。

发布附件包含 Linux 与 macOS 的 amd64、arm64 归档,两个 RPM、两个 DEB,以及 SHA256SUMS。 源码变化见完整差异。

2 - SOW v0.6.0

SOW 0.6.0 保留上一轮 Plain RPM 索引,记录 Managed 发布时间,强化校验与恢复,并减少重复 I/O。

SOW 0.6.0 改进仓库更新、文件校验和中断恢复,保持现有命令、配置格式与公开仓库布局不变。 已使用 0.5.0 的 Managed 工作区无需迁移数据库。

本文记录自 0.5.0 以来的变化。升级步骤见安装说明, 制品发布状态见下载页。

仓库维护者需要了解的变化

范围 0.6.0 的变化 对操作的影响
Plain RPM 更新 保留当前与紧邻上一轮以校验和命名的元数据 客户端可以继续下载上一版索引引用的元数据
Managed 构建 元数据与签名共用一个记录的发布时间 恢复保留原时间;没有变化的构建保留已有输出
文件校验 在认证读取期间持续核对文件身份 检测文件替换与内容改写,包括恢复原修改时间的改写
签名密钥 读取完整 OpenPGP 密钥集合 检查全部受信密钥,拒绝格式错误的输入
状态与恢复 保持锁、读取一致性和已提交结果 维护错误不会使已完成的变更看起来已经回滚
大型仓库 复用已验证数据,限制并发工作量 减少构建、导入、检查和发布中的重复工作

Plain RPM 更新保留上一轮索引

客户端先下载 repomd.xml,再请求其中列出的元数据文件。 如果这两步之间发生仓库更新,旧元数据可能在客户端下载前就被清理。

Plain sow create 现在保留当前与紧邻上一轮以校验和命名的 RPM 元数据。 没有变化的运行不会推进该窗口。下一次索引变化后,更早的元数据可以被清理。

小文件 .sow-plain-rpm-history.json 记录保留引用。 复制目录后还要继续构建时,一并保留该文件。它不是操作日志;Plain 构建中断后仍通过重新执行 create 恢复。

此窗口不保留已删除的包文件,也不覆盖所有客户端缓存期限。 缓存跨越多轮更新时,在发布层保留所需的软件包与元数据。 YUM 迁移指南说明发布顺序、签名与旧客户端缓存的处理方法。

Plain 时间戳仍由调用者指定,--metadata-timestamp 默认值仍为 0。 替换其他生成工具或恢复旧软件包内容时,保留已发布的最大时间戳。

Managed 构建保留一个发布时间

新的 Managed 构建在发布受影响 Dist 的索引前,记录一个精确到秒的 UTC 时间。 APT Release 日期、RPM repomd.xml 的 data 时间戳和元数据签名共用该值。 RPM revision 仍使用构建快照编号。

所选时间遵守已有构建时间与所选签名密钥启用时间的下限。 密钥不可用或尚未生效时,命令返回错误。请保持主机时钟正确。

恢复操作复用已经记录的时间。如果时间发生漂移,SOW 会在发布后续 Dist 入口前拒绝继续。 空操作构建不创建新的构建快照,也不刷新时间戳或签名。

此规则适用于新的元数据构建操作,包括 add、rm 自动触发的构建和新建 Dist。 布局迁移与旧日志保留此前的时间戳规则。 独立的 export rpm-leaf 输出仍使用 RPM data 时间戳 0。

rm --check 预览仍为只读操作,预测成员、路径、动作,以及结果的修订号和构建快照编号。 实际执行会选择自己的发布时间,因此含时间信息的字节、哈希与大小可能不同于预览。

校验实际读取的文件

元数据与软件包校验现在将摘要绑定到打开的文件身份,并在读取前后核对。 快速校验和复用校验结果也采用相同检查。 这能发现文件替换、等长改写,以及改写后恢复原修改时间的情况。

并发创建硬链接可能改变文件属性,但不改变软件包内容。 SOW 正确处理这种情况,并保留成功校验时的文件身份。 只读硬链接导出因此可以与仓库检查并行使用。

路径遍历还会核对实际打开的条目与此前检查的条目是否相同。 访问已知子路径时,父目录只需具备遍历权限,不再额外要求目录列表读取权限。 软件包仍需可读,受控路径仍拒绝不安全的符号链接和文件类型。

读取完整的签名密钥集合

一个受信密钥文件可以包含多个公钥或连续的 ASCII 装甲密钥块。 SOW 现在读取完整输入,不再遇到第一个块后就停止。 格式错误、被截断或不受支持的密钥内容会被拒绝,不会被静默跳过。

签名 key 引用仍须对应一个主密钥。 将密钥集合放入 trusted_keys,每项元数据或软件包签名设置使用一个签名身份。 具体规则见签名参考。

保持状态与恢复结果一致

SQLite 身份检查现在保留现有连接持有的锁。 组合仓库查询从同一个数据库快照读取相关状态。 符合条件的 WAL 数据库在每次打开时验证一次,避免同一连接内反复执行完整验证。

数据库提交可能已经成功,后续检查点或清理才发生错误。 SOW 现在保留这种情况下已经提交的命令结果。 重试前查看结果、sow status 和 sow log;非零退出码不代表事务已回滚。

Dist 状态也会显示未完成的仓库维护,包括本地 GC 和日志裁剪。 即使期望成员与已构建成员数量相同,也不会隐藏这些待处理操作。 移除操作日志同时保留策略造成的结果与显式选中的移除结果。

对于已经启动的开发期 C2 布局迁移,repo migrate --abort 会保留可信迁移标记。 即使首份日志或基准清单尚未生成,也能完成中止。 日志已经绑定迁移计划时,SOW 会按记录的基准清单核对计划,并拒绝矛盾的控制记录。

非空迁移暂存目录会被完整移入 .sow/<repo>/abandoned/。 命令通过 stderr 和 JSON warnings 报告保留路径或清理问题。 暂存清理告警不会阻止中止操作,公开目录保持不变。 仓库选择成功后,即使迁移失败,响应中也会保留仓库名称。

尚未启动迁移的 C2 仓库仍不支持直接迁移。 如果旧版中止操作已经移除了可信标记,需要恢复匹配备份或创建新工作区。 支持的恢复路径见 repo migrate。

减少重复工作

本版减少 I/O,没有增加额外的全仓扫描或恢复状态机:

  • 在同一次操作中,复用已认证的 DEB 字节完成解析与检查。
  • 文件身份仍匹配时,复用当前软件包与 Dist 的校验结果。
  • 复用已验证的 RPM 导出结果,避免再次读取同一份副本。
  • 避免导入暂存阶段的重复写入,移除没有使用的初始输出目录树哈希。
  • 只查询所选软件包的成员关系,并复用本次操作整理出的软件包数据。
  • 保持软件包暂存任务相互独立,并按指定并发数限制工作量。

sow check 仍会在每次运行时读取并哈希每个独立的物理包文件,不会退化为仅检查文件指纹。

R2 清单检查现在每页最多并发执行八个 HEAD 请求。 排队任务与已完成结果的数量都有上限,取消与失败时也一样。 上传重试不再仅因重新定位源文件就重启空闲超时,必须有实际传输进展。 R2 垃圾回收仍只报告候选对象,不删除远端对象。

构建、打包与验证

源码构建要求 Go 1.27.2 或更新版本,质量检查使用 staticcheck 0.8.2。 即使 Go 自动选择了下载的工具链,修补后的 RPM 解析模块也能完成上游来源验证。

发布目标仍为 Linux 与 macOS 的 amd64、arm64。 打包产物包括四个归档、两个 RPM、两个 DEB 和 SHA256SUMS。 归档与安装包继续包含许可证文件和第三方许可声明。 可复现源码交付会将本地代理说明排除在产品源码之外。

回归覆盖增加了文件替换、恢复原修改时间、并发硬链接、完整密钥集合、提交取消、提交后失败、 元数据时间恢复、迁移中止、Plain 索引保留和 R2 有界请求。 本版还移除未使用的代码,以及依赖 Go 运行时内部实现的脆弱 I/O 插桩。

本地发布前核验覆盖 macOS/Linux 测试、race 检查、APT/DNF 集成、S3 兼容传输、 5 万包 RPM 元数据生成、打包,以及从已发布 0.5.0 二进制升级。 部署验收仍使用实际的包管理客户端和发布目标。

从 0.5.0 升级

数据库 schema v13、配置 sow/v3 与公开 pool/ + dists/ 布局均保持不变。

  1. 停止工作区写入。
  2. 备份完整工作区,并保留硬链接。
  3. 安装 SOW 0.6.0。
  4. 对每个仓库执行:
sow version
sow build -C /srv/sow -r REPOSITORY
sow check -C /srv/sow -r REPOSITORY

将 REPOSITORY 与 /srv/sow 换成实际值。 已处于最新状态的 0.5.0 仓库无需迁移数据库或强制重建,build 会报告空操作。 需要把新的构建快照交付到配置目标时,再执行发布。

从 0.3 或 0.4 工作区升级时,先执行 sow repo migrate REPOSITORY,再构建。 详见完整升级步骤。

3 - SOW v0.5.0

SOW v0.5.0 新增 Plain RPM 发布时间参数,并修复仓库恢复、签名与包路径问题。

SOW 0.5.0 为已有 YUM 仓库增加发布时间参数,并修复 Managed 仓库的恢复、签名和包路径处理。 构建过程也减少了对未变化软件包的重复校验。

安装方式见下载 SOW。使用 0.3 或 0.4 Managed 工作区时,先迁移各个 Repository,再进行写操作。

升级 Managed 工作区

  1. 停止向工作区写入的命令。
  2. 备份完整工作区,包括 sow.yml、.sow/ 和所有 Repository 根目录。
  3. 安装 SOW 0.5.0。
  4. 逐个迁移、构建并检查 Repository。将 pgsql 和 /srv/sow 换成实际名称与路径。
sow repo migrate pgsql -C /srv/sow
sow build -r pgsql -C /srv/sow
sow check -r pgsql -C /srv/sow

迁移将数据库更新到 schema v13。配置仍使用 sow/v3,公共目录仍由 pool/ 和 dists/ 组成。 首次构建刷新 RPM 认证与 APT 元数据记录;后续构建会复用匹配的 RPM 校验记录。

迁移后的数据库使用 SOW 0.5.0 或更新版本。备份与安装步骤见 安装与升级。

保持 YUM 发布时间递增

如果新 repomd.xml 中最大的 data 时间戳早于缓存值,EL7 YUM 可能拒绝新索引。 修改校验和、revision 或文件修改时间都不能替代这项比较。

替换已有元数据生成器时,使用新增参数:

# 根据仓库发布历史设置 PUBLISH_TIME。
sow create /srv/yum.candidate --metadata-timestamp "$PUBLISH_TIME"
设置 结果
默认行为 RPM data 时间戳仍为 0
--metadata-timestamp SECONDS 设置三条 RPM data 记录的时间戳
取值范围 0 到 253402300799 的整数
Plain repomd.xml revision 仍为 0
软件包字节与 DEB 索引 不受此参数影响
压缩 XML 与 gzip 头 仅修改时间戳时保持不变

该参数只适用于 create,Managed 构建、发布和 RPM 叶目录导出均不接受它。 包字节与选项相同时,重复构建会生成相同元数据;强制重签软件包可能改变输入字节。

在维护脚本中保存已发布的最大时间戳。内容变化时递增时间戳,恢复旧包集合也按一次新发布处理。 如果之前的转换已将时间戳重置为零,用转换前的发布历史恢复该值。

如果客户端校验仓库签名,每次修改后都要签署最终的 repomd.xml。 --sign-with 签署 RPM 包,不会签署索引。 YUM 迁移指南介绍时间戳选择、索引签名和已有客户端缓存的测试方法。

仓库与发布修复

  • 删除 Dist 时,不再误删后来加入其他 Dist 的软件包。
  • 提交 Desired 变更前,检查签名策略和包池路径冲突。
  • 恢复操作保留已提交的软件包选择,并完成中断的清理。
  • 已发布的包路径始终绑定原内容,本地垃圾回收也不会解除绑定。发布恢复不会用其他字节覆盖该路径。
  • 仅大小写不同的文件名不能创建第二个 Pool URL,即使字节相同也不例外。 大小写不敏感的工作区和文件系统目标还会拒绝目录别名。
  • 并发执行 export rpm-leaf --hardlink 与 check 时,不再将未变化的包误报为损坏。
  • 本地 gc 跳过包只存在于远端的发布记录。
  • 输入路径可以经过符号链接父目录;软件包文件本身仍须通过文件检查。
  • SQLite 检查点被读连接延迟时,不再将已完成的写入报告为失败。macOS 写连接使用 fullfsync。

签名与命令输出

APT 验签兼容 GnuPG 的末尾换行约定。新元数据签名使用 SHA-256,新的构建会检查签名密钥当前是否可用。 Agent 签名固定签名时间,并选择可用的签名子钥。新 APT 发布拒绝弱签名摘要;历史验签沿用记录中的规则。

sow repo migrate 报告迁移前后的 schema 版本。未迁移的 Repository 会给出迁移命令。 命令收到 SIGINT 或 SIGTERM 后返回退出码 130。全部被拒绝的 add 批次会显示各文件的错误。 file:// R2 凭据必须指向普通文件。

RPM 依赖

新增回归用例覆盖事务前、事务后脚本依赖,包括 Cloudberry、Percona 和 Grafana 软件包使用的组合。 依赖渲染继续遵循现代 createrepo_c 的规则。上游变更见 createrepo_c PR #427。

软件包签名流程使用 RPM v4 格式。SOW 0.5.0 不支持 RPM v6 格式签名。 生成的仓库元数据使用 XML,不包含 SQLite rpm-md 或模块流。 格式与客户端覆盖见兼容性。

构建与安装包

源码构建需要 Go 1.27.1 或更新版本。本版使用 x/crypto v0.56.0 与 GoReleaser v2.18.2。 二进制归档和原生安装包均包含 THIRD_PARTY_NOTICES。

发布文件包括四个 Linux/macOS 归档、两个 RPM、两个 DEB 和 SHA256SUMS。 指定版本文件见 v0.5.0 发布页。 兼容性测试位于 qa/compat/,性能测试位于 qa/perf/。S3 集成测试使用按摘要固定的 pgsty/silo 镜像。

4 - SOW v0.4.0

SOW v0.4.0 减少重复校验,独立验证 RPM 密钥集合,支持目标重绑定,并改进迁移与发布恢复。

SOW 0.4.0 改进了 Managed 仓库的校验与恢复。check 只对每个物理软件包计算一次内容哈希;RPM 验签分别判断各组密钥的信任结果;发布目标可通过有记录的重绑定操作修改公共 URL 或缓存时间。

Plain 行为与公共 pool/、dists/ 布局保持不变。本文记录 0.4.0;升级到当前版本请按安装指南操作。

从 0.3 升级到 0.4

停止工作区写入,备份完整工作区并保留硬链接。安装 0.4.0 后,先迁移每个已配置的 Repository,再继续维护:

set -euo pipefail
rsync -aH /srv/sow/ /srv/sow.backup-before-0.4.0/
sow repo migrate pigsty -C /srv/sow
sow repo migrate pgsql -C /srv/sow
sow check -r pigsty -C /srv/sow
sow check -r pgsql -C /srv/sow

本例的仓库名为 pigsty 与 pgsql,请换成 sow.yml 中的实际名称。保留备份用于回退:SOW 0.3 无法打开迁移后的数据库。

Schema v11 修复了 0.3 的状态错误:一个 Dist 仍为 dirty 时,Repository 可能错误显示 clean。现在,Dist 变更与仓库状态在同一事务中更新。迁移还修复发布与签名者记录;从未记录的历史签名身份仍标记为未验证。

Schema v12 为发布目标增加只追加的绑定历史。初次绑定、迁移回填与后续重绑定都有独立修订记录。

每个物理软件包只计算一次内容哈希

每次 sow check 对每个唯一物理软件包执行一次完整内容哈希,包括缓存指纹仍匹配的文件。同一文件的硬链接共用这个结果。校验结果绑定实际读取的文件,SOW 会检测检查期间的替换或修改。

检查保留的构建快照、最终清单与变更时,复用同一结果。增加 Dist 或保留的构建快照不会增加包哈希次数。DEB 与未签名 RPM 需要一次完整读取;已签名 RPM 最多再从主包头读到文件末尾,验证签名。

包缓存只查询本次选中的摘要,并按限定批次读取 SQLite。64 MiB 测试包的重复构建不读取包内容;指纹变化与缓存缺失共用一次校验。

分别验证 RPM 密钥集合

RPM 签名包在每组候选密钥内独立检查。每个可识别签名包都必须在该组中通过验证,且至少一个通过的签名必须认证软件包载荷。

这保留了对历史 CentOS 签名与双签软件包的支持,也避免把不同密钥组中的部分成功结果拼成错误的单密钥验证结论。

当前策略密钥、保留的构建快照密钥与组合受信任密钥共用同一次签名读取。增加密钥只改变信任判断,不增加包读取次数。

修改发布目标设置

使用 sow publish TARGET --rebind 修改目标的可变配置,同时保留存储身份与恢复状态:

可通过 --rebind 修改 需要配置新目标
目标名称 Repository 身份
public_endpoint Provider 或存储 endpoint
max_cache_ttl Region、bucket 或 prefix

普通发布会报告配置变化,并提示使用 --rebind。重绑定取得发布锁、记录修订,也可继续执行已作出提交决定但被中断的发布。清理未完成时,TTL 与 filesystem 公共 URL 的变更受到限制。此前记录的缓存截止时间继续生效。

检查公共文件与恢复上传

Filesystem 与 R2 的 HTTP(S) 检查分别限制等待响应头和响应体停止传输的时间。只要持续接收数据,大文件传输可以超过两分钟。

SOW 检查普通客户端 URL。过期内容与 404 最多等待 max_cache_ttl;临时 408、425、429 与 5xx 响应使用较短重试时间。响应过大时校验失败。Filesystem 清理在删除后检查公共端点是否返回 404 或 410;R2 清理仍只报告候选对象。

其他发布改进包括:

  • 创建目标绑定前检查 filesystem 路径别名,包括大小写不敏感卷上的别名。
  • 中断的指针更新包含记录中的旧内容或新内容时,可继续执行;遇到其他内容则报告问题。
  • 每次发布只检查发生变化的公共对象,不再下载完整构建快照。
  • R2 使用可重试读写、空闲超时与限制并行数的条件式分段上传,完成上传前检查整对象 SHA-256。

CLI 与维护修复

  • 重复执行 sow add 时,即使包已在包池中,也会构建此前因 --skip 或配置变化而处于 dirty 状态的所选 Dist。
  • sow rm --check 使用与删除相同的配置检查,并返回只读预览。
  • 所有 Managed 命令提供可读文本输出。sow.cli/v1 JSON 在命令失败时保留部分结果或诊断结果。
  • 局部构建、Dist 变更、迁移、保留与垃圾回收过程保持签名者记录一致。
  • 移除已退役的 APT 构建器、外部排序、空 Dist 与 Git 跟踪的 by-hash 实现。

构建与发布检查

本版使用 Go 1.27.0,0.3 使用 Go 1.26.5。AWS SDK、SQLite、压缩与密码学依赖同步更新。构建检查固定使用 staticcheck v0.8.1、deadcode v0.49.0 与 govulncheck v1.7.0。

发布检查覆盖 Go 测试、静态分析、漏洞与 RPM 分支源码检查、竞态测试、Linux amd64/arm64 构建,以及上述包读取次数限制。

本版包含四个 Linux/macOS 归档、两个 RPM、两个 DEB 与 SHA256SUMS。归档包含 sow、README.md、CHANGELOG.md 与 LICENSE。Linux 软件包随可执行文件安装协议文件。

获取 0.4.0

从 v0.4.0 GitHub Release 获取该版本制品与校验清单。安装后执行 sow version;0.3 工作区按上文迁移。

现在首次安装请使用当前下载页。当前行为见 Managed 工作区、签名模型与发布与恢复。

5 - SOW v0.3.0

SOW v0.3.0 减少重复软件包读取与数据库查询,批量提交包文件,并增加构建进度事件。

SOW 0.3.0 减少了重复包读取与数据库查询。Plain 生成只遍历一次包内容;Managed 构建缓存已解析的包数据,并批量提交新包池文件。本版还移除了已退役的运行时与发布代码。

Plain:每个软件包只读一次

默认不签名的 sow create 流程对每个 RPM 或 DEB 只做一次哈希与解析,--jobs 控制并行任务数。SOW 根据解析结果生成元数据,写入索引前再次检查软件包集合与文件属性是否变化。

Plain 构建中断后,从软件包目录重新运行即可。0.3 移除了 Plain 的操作日志、回滚副本与重复包哈希;Managed 恢复机制不变。

Pigsty 预处理现在保留包头架构为 i386、i486、i586 或 i686 的 RPM。它们继续进入仓库元数据与 repo_complete 校验清单。DEB i386 与精确匹配 Patroni 3.0.4 的过滤规则保持不变。

Managed:减少查询与包读取

成员表增加了按软件包 SHA-256 的反向索引。SOW 通过一次有序查询读取期望成员与已构建成员,替代逐对象查询。项目基准中,列出含 5,000 个对象的 Dist 从约 4.1 秒降至 33 毫秒;50,000 个对象可在一秒内完成。

Schema v10 新增可重建的包数据缓存,以软件包 SHA-256 为键。导入时校验并解析新包,保存生成元数据所需的信息。构建时批量读取缓存;条目缺失或损坏时,从已校验的包文件重建。

包池不变时,重复构建通过设备号、inode、大小、修改时间与状态变更时间识别未变化文件。指纹变化时,执行完整 SHA-256 检查。sow check 仍会读取并校验完整包内容。

RPM 元数据与 DEB 架构索引使用受 --jobs 限制的并行任务。构建快照清单与变更记录改为批量写入。

批量提交与构建进度

Managed 构建将软件包分批移入公共包池,每批最多 512 个对象或 1 GiB。SOW 先持久保存目标目录,再移除 pending 名称。批次中断时,无论包位于 pending、包池还是两处,恢复流程都能处理。

Pending 文件在私有 0700 目录中使用最终的 0644 权限。构建不再全程为每个 pending 包持有文件描述符,减少了大型仓库的资源占用。

长时间构建会为渲染、包文件提交、Dist 发布、规范化与完成阶段记录 build_progress 事件。使用 sow log 查看进度。

统一仓库实现

本版移除了已退役的 V1 CLI 与运行时、云与 CDN 发布代码、Edge Worker、已完成的迁移程序及其旧测试。当前 CLI 使用统一的仓库实现。

R2 发布保留 SOW 所需的存储操作:list、HEAD、GET 与条件 PUT。远端垃圾回收只报告候选对象,不执行删除。

其他变更

  • 本地垃圾回收可处理大小写不敏感文件系统中记录的唯一包池路径别名,删除前检查包路径、大小与摘要。
  • 归档包含 LICENSE。RPM 与 DEB 分别把 Apache-2.0 协议安装到 /usr/share/licenses/sow/LICENSE 与 /usr/share/doc/sow/copyright。
  • CI 覆盖格式化、模块一致性、静态分析、死代码检查、测试、竞态检测、源码交付与软件包构建。
  • 集成测试覆盖混合 RPM/DEB 流程、Ubuntu 22.04 上未签名 Plain APT 安装、AlmaLinux 8/9 与 pgsty/el10 的 DNF 签名切换,以及固定 MinIO 版本上的 S3 条件操作。

获取 0.3.0

在 v0.3.0 GitHub Release 下载该版本的 Linux/macOS 归档、Linux RPM/DEB 软件包与 SHA256SUMS。安装后执行 sow version。该源码标签要求 Go 1.26.5 或更新版本。

现在首次安装请使用当前下载页。当前行为见 Plain 模式、Managed 工作区与平台与集成。

6 - SOW v0.2.0

SOW v0.2.0 引入 Plain 与 Managed RPM/DEB 仓库、签名、发布、构建快照保留与 RPM Leaf 导出。

SOW 0.2.0 引入了面向 RPM 与 DEB 仓库的 Plain 和 Managed 工作流。它以单个 Go 可执行文件,在 Linux 或 macOS 上构建静态软件包仓库。

本文记录 0.2.0 发布时的功能。当前安装与操作方法见现行文档。

构建平面仓库

Plain 模式索引目录顶层的 RPM 与 DEB 文件:

sow create /srv/repo

RPM 生成 repodata/,DEB 生成 Packages 与 Packages.gz,混合目录同时生成两种索引。Plain 模式以目录内容作为状态,不需要工作区或数据库。

本版还加入 --sign-with,为未签名 RPM 软件包签名。使用 --overwrite 可替换已有 RPM 签名。Plain 模式不生成或签署 APT Release 文件。

持续管理仓库

Managed 模式记录软件包成员,并构建具名 Dist:

mkdir -p /srv/sow
cd /srv/sow
sow init .
sow repo new pigsty
sow dist new el9 --format rpm -r pigsty
sow add /path/to/packages/*.rpm -r pigsty -d el9
sow check -r pigsty

每个 Repository 在 pool/ 下保存一份软件包文件。Dist 的 RPM 或 APT 元数据位于 dists/。每次构建记录一个快照,供 SOW 比较变更并保留选定的仓库状态。

0.2.0 加入了以下功能:

  • sow/v3 配置与软件包成员策略;
  • RPM、APT 元数据签名,以及 RPM 软件包签名;
  • status、check、changes 与操作日志;
  • 可恢复的 filesystem 与 R2 发布;
  • 构建快照保留与本地垃圾回收;
  • 为需要独立 RPM 目录的工具提供 rpm-leaf 导出。

服务或发布完整 Repository 目录树,让元数据能访问共享包池。对已配置目标,sow publish 管理上传顺序与中断恢复。R2 清理只报告候选对象,不删除远端对象。

发布测试与源码

本版加入 APT/DNF 与 S3 兼容集成测试,并通过标签触发 GoReleaser,构建 Linux/macOS 归档与 Linux RPM/DEB 软件包。历史代码与测试保留在 v0.2.0 源码标签。

当前版本见下载页。当前客户端与存储测试范围见平台与集成。