跳转到主要内容

第一个工作区

创建工作区,建立 RPM/DEB Dist,添加软件包并校验公共树。

Managed 模式会持久保存配置、成员关系、Generation 与审计状态。下面从空目录开始。

初始化工作区

sow init /srv/sow
cd /srv/sow

init 创建:

/srv/sow/
├── sow.yml   # 配置;schema: sow/v3
└── .sow/     # SQLite 状态、锁、staging、恢复与操作日志

不要编辑或对外服务 .sow/。init 是幂等操作:重复执行会校验并收敛已声明的 Repository 与 Dist,不会重置有效工作区。

默认架构族是 x86_64 与 aarch64。配置接受 amd64、arm64 别名,并规范化为上述族名。

创建 Repository 与两个 Dist

sow repo new local
sow dist new el9 --format rpm
sow dist new bookworm --format deb

一个 Repository 拥有一棵公共 pool/ + dists/ 树和一份私有状态数据库。每个 Dist 只有 一种格式。dist new 会立即生成合法空视图,客户端读取空 Dist 时得到空索引而不是 404。

此时公共布局为:

/srv/sow/local/
├── pool/
└── dists/
    ├── el9/
    │   ├── x86_64/repodata/
    │   └── aarch64/repodata/
    └── bookworm/
        ├── Release
        └── main/
            ├── binary-amd64/{Packages,Packages.gz,by-hash/}
            └── binary-arm64/{Packages,Packages.gz,by-hash/}

添加软件包

显式选择目标 Dist:

sow add /path/to/packages/*.rpm -d el9
sow add /path/to/packages/*.deb -d bookworm

SOW 从包本身读取身份与架构,把接受的字节存入 local/pool/,更新 Desired Membership, 并在返回前构建受影响的 Dist。输入路径只用于导入;后续构建使用 Managed 包池。

需要合并多次成员变更时,用 --skip 暂不构建,最后统一收敛:

sow add /path/to/more/*.rpm -d el9 --skip
sow build

Desired Membership 领先于 Built Generation 时,Repository 状态为 dirty,且 ready_to_copy=false。

查看与校验

sow status
sow ls -d el9
sow ls -d bookworm
sow check

status 是低成本状态读取。check 是交付门禁:它校验配置、状态、公共文件权限、保留根、 包字节、Desired Membership、索引、签名与 Generation manifest,且不写入任何内容。 只有 clean 且所有层都通过的 Repository 才返回成功。

查看规范化配置与默认值:

sow config show --all

对外服务 Repository

公共交付单元是 /srv/sow/local,不是工作区根。把这个目录挂到稳定 URL 前缀;不要暴露 sow.yml 或 .sow/。

  • DNF base URL:https://repo.example.com/local/dists/el9/x86_64/
  • APT source:deb https://repo.example.com/local bookworm main

安全的 Nginx 与 filesystem 发布流程见对外服务。

选择规则

  • Workspace:给了 -C DIR 就从该目录向上找,否则从当前目录找;未找到工作区时再尝试 SOW_DIR。显式 -C 不会禁用这条回退。
  • Repository:-r NAME、当前路径所属 Repository,或唯一已配置 Repository。
  • Dist:-d NAME,可重复;只有命令能够唯一确定范围时才可省略。

-C 指定的是发现起点,不保证该目录本身就是最终 Workspace Root。用 sow config check -C DIR 查看解析后的工作区;必须固定操作对象的脚本应指定明确的物理工作区根及 -r NAME。 存在歧义时直接报错;SOW 不会随便挑选 Repository 或 Dist。

下一步