跳转至内容

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 配置

请确保在您的 ~/.makepkg.conf 中配置正确的 PACKAGERGPGKEY 变量。错误的签名或缺失的 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 时,此操作会自动完成。

如果 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 的)。否则,软件包可能会与目标系统中不存在的依赖项链接。

这将把软件包及其签名上传到您用户在 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 将在两个二进制仓库之间移动软件包。

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

$ pkgctl db move source_repository target_repository pkgbase...

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

故障排除

推送到错误的仓库

如果您不小心将软件包推送到错误的仓库(例如,运行 pkgctl release 时使用了 --testing 而不是 --staging,对象是 example-1.0.0-any.pkg.tar.zst),您可以撤销它。

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

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

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

之后,继续进行 签名、上传和提交