跳转至内容

DeveloperWiki:如何成为打包者

来自 ArchWiki
提示 仔细遵循 Arch 软件包指南

准备与设置

安装软件包

确保你已安装 devtoolsnamcap 软件包。

SSH 配置

如果你在 SSH Agent 中有多个 SSH 密钥,你需要确保正在使用正确的密钥来联系 Arch 服务器。另外,当你的本地用户名与 Arch 服务器上使用的用户名不同时,你也需要处理这个问题。

示例 ~/.ssh/config 片段

Host repos.archlinux.org
	User archie
	IdentityFile ~/.ssh/id_arch
	IdentitiesOnly yes

另外,请确保在 Gitlab 中设置你的 SSH 密钥

Host gitlab.archlinux.org
	User git
	IdentityFile ~/.ssh/id_arch
	IdentitiesOnly yes
提示 顺便你也可以添加你的打包者 GPG 密钥,以便在 Gitlab 上显示签名的“已验证”标签。有关这方面的信息,请参阅 [1]

makepkg 配置

请确保使用正确的 PACKAGERGPGKEY 变量配置你的 ~/.makepkg.conf。错误的签名或缺失的 PACKAGER 将阻止你的软件包进入仓库。

PACKAGER="Archie <archie@archlinux.org>"
GPGKEY="0x0123456789abcdef"

辅助脚本 (可选)

下面的打包辅助脚本可以从 archlinux-tools 组安装。

  • arch-rebuild-order — 使用本地 pacman 同步数据库列出软件包的重建顺序。
  • arch-signoff — 在终端中交互式地为 testing 仓库的软件包签核。
  • arch-repro-status — 在终端中交互式地列出你的软件包的可复现状态,并能够查看每个不可复现软件包的构建日志和 diffoscope 输出。
  • archlinux-contrib — Arch Linux 中使用的贡献脚本集合。

工作流程

检出/更新本地软件包仓库

检出现有软件包

$ pkgctl repo clone packagename
提示 默认情况下,这会通过 SSH 克隆。因此,如果你没有 GitLab 账户,你需要通过指定 --protocol 参数来通过 HTTPS 克隆:pkgctl repo clone --protocol=https

更新现有的、先前已检出的软件包

$ cd packagename
$ git pull

添加新软件包

此步骤仅在首次将新软件包添加到仓库时需要。

$ pkgctl repo create --clone new-package
$ cd new-package
$ cp /usr/share/pacman/PKGBUILD.proto PKGBUILD
$ $EDITOR PKGBUILD
$ $EDITOR .nvchecker.toml
$ git add .
提示 pkgctl version setup 会尝试通过分析 PKGBUILD 中指定的 source 数组来自动创建 .nvchecker.toml 配置文件。
警告 dbscripts 不支持具有不同分割包架构的软件包。

更改与构建

强制使用 干净的 chroot 来构建你的软件包。pkgctl build 会自动完成此操作。

$ pkgctl build --edit some-package

在 PKGBUILD 和软件包上运行 namcap

注意 当使用 pkgctl build 时,此步骤会自动完成。
$ namcap PKGBUILD
$ namcap some-package-1.0-1-x86_64.pkg.tar.zst

在软件包上运行 checkpkg

注意 当使用 pkgctl build 时,此步骤会自动完成。

在包含你新构建软件包的目录中运行,以获得与当前仓库中软件包版本相比的文件列表差异。

$ checkpkg
注意 当首次将软件包添加到仓库时(例如,从 AUR 导入到 extra),可以跳过此步骤。

在识别到的 soname 更改上运行 sogrep

注意 当使用 pkgctl build 时,此步骤会自动完成。

如果 checkpkg 识别到 package 的库 package.so 存在共享对象名称 (soname) 更改,则必须重建直接依赖它的软件包。

要识别主稳定仓库(即 coreextra)中哪些软件包依赖于 package 中的给定库,请使用 sogrep(请参阅 sogrep(1))。

$ for repo in core extra; do for lib in $(find-libprovides package | sed 's/=.*//g'); do sogrep -r $repo $lib; done; done | sort | uniq

为相应的 staging 环境构建 package(通过遵循 工作流程 的其余步骤),并为已识别的依赖项创建一个 TODO,以便其维护者可以针对 package 的新版本重建它们。

注意 如果 staging 环境中的任何软件包阻止了针对 package 的重建,请首先与 软件包维护者 和/或 开发者 同步。

使用 devtools 进行签名、上传和提交

一旦你对软件包满意,你需要确保你的所有更改都已在仓库中跟踪。运行

$ git status

some-package 目录中,并仔细检查输出。例如,如果你添加了一个新的 some-package.install 文件,你需要告诉 git 跟踪该文件,例如:

$ git add some-package.install

永远不要将二进制软件包、makepkg 日志等添加到仓库!

当你准备好继续时,你可以运行 devtools 脚本来签名、上传和提交你的工作:

$ pkgctl release --message "update to 1.2.3, add post_upgrade hook to fix permissions"

请尽量写简洁的提交信息。如果软件包只是一个上游更改,那是可以的,但如果进行了更复杂的更改,请通过编写适当的提交信息告知我们。

警告 如果你在 testing 仓库中构建,发布时务必也指定 --testing。否则,软件包可能会与目标系统上不存在的依赖项链接。

这将把软件包及其签名上传到你用户 ~/staging 目录在 repos.archlinux.org 上的仓库特定位置,并在软件包的 git 仓库上创建一个已签名的版本标签。

更新仓库

使用 db-update 将根据被调用的内容找到特定仓库的新软件包。

要将已上传的软件包发布到 coreextragnome-unstablekde-unstablestaging,或者 core-testingextra-testing,使用:

$ pkgctl db update

其他操作

移除软件包

使用 pkgctl db remove 将从特定的二进制仓库中移除一个软件包。

要从任何 官方仓库 中移除一个软件包,请使用:

$ pkgctl db remove reponame libfoo

在仓库之间移动软件包

使用 db-move 将在一个二进制仓库之间移动一个软件包。

要将相同 pkgbase 的软件包从 coreextragnome-unstablekde-unstablestaging,或者 core-testingextra-testing 移到另一个仓库,请使用:

$ pkgctl db move source_repository target_repository pkgbase...

例如,将 foobarpkgbasescore-testing 移动到 core

$ pkgctl db move core-testing core foo bar

杂项

避免频繁输入密码

在使用 pkgctl 和其他 devtools 时,会建立很多 SSH 连接。对于某些设置,这意味着即使在使用 SSH 密钥和 SSH Agent 时,你也需要多次解锁密钥或需要硬件令牌。你可以按如下方式解决这个问题:

将此添加到你的 ~/.ssh/config

Host gitlab.archlinux.org
    ControlMaster auto
    ControlPath /run/user/%i/ssh-%r@%h:%p
    ControlPersist 15m

输入你的密码,并保持该会话打开直到完成。所有到 Gitlab 的 SSH 会话现在都将通过此连接隧道传输。

故障排除

推送到错误的仓库

如果你发现自己意外地将软件包推到了错误的仓库(例如,运行 pkgctl release 时将 --testing 误设为 --staging,针对 example-1.0.0-any.pkg.tar.zst),你可以撤销它。

注意 这仅适用于尚未完成 仓库更新 的情况。如果仓库已更新,请参阅 #在仓库之间移动软件包

从服务器仓库的暂存位置移除软件包

$ ssh repos.archlinux.org "rm staging/extra/example-1.0.0-any.pkg.tar.zst*"

之后,请再次继续 签名、上传和提交