DeveloperWiki:如何成为软件包维护者

来自 ArchWiki

遵循软件包准则

软件包准则可以在 Arch Linux 文档中找到,请严格遵守。

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 syncdb 列出软件包的重建顺序。
  • arch-signoff — 在您的终端中交互式地从 testing 签核软件包。
  • arch-repro-status — 在您的终端中交互式地列出软件包的可重现状态,并能够查看每个不可重现软件包的构建日志和 diffoscope 输出。
  • archlinux-contrib — Arch Linux 中使用的 contrib 脚本集合。

工作流程

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

检出现有软件包

$ pkgctl repo clone packagename
提示: 默认情况下,这会通过 SSH 克隆,因此如果您没有 GitLab 帐户,则需要通过 HTTPS 克隆,方法是指定 --protocol 参数: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 时,这是自动完成的。

如果 checkpkgpackage 的库 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

package 的各自暂存环境构建(通过遵循工作流程中的其余步骤),并创建一个包含已识别依赖项的 TODO,以便他们的维护者可以针对新版本的 package 重建它们。

注意: 如果当前 暂存 环境中的任何软件包阻止了针对 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。否则,软件包可能会链接到目标系统上不存在的依赖项。

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

更新仓库

使用 db-update 将为一组仓库查找新软件包,具体取决于调用的是哪个仓库。

要将上传的软件包发布到 coreextragnome-unstablekde-unstablestagingcore-testingextra-testing,请使用

$ pkgctl db update

其他操作

移除软件包

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

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

$ pkgctl db remove reponame libfoo

在仓库之间移动软件包

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

要在 coreextragnome-unstablekde-unstablestagingcore-testingextra-testing 之间移动相同 pkgbase 的软件包,请使用

$ pkgctl db move source_repository target_repository pkgbase...

例如,要将 pkgbases foobar 的软件包从 core-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 会话都将通过此连接进行隧道传输。

故障排除

推送到错误的仓库

如果您发现自己不小心将软件包推送到了错误的仓库(例如,针对 example-1.0.0-any.pkg.tar.zst 运行了带有 --testing 而不是 --stagingpkgctl release),您可以撤消它。

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

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

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

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