DeveloperWiki:如何成为软件包维护者
遵循软件包准则
软件包准则可以在 Arch Linux 文档中找到,请严格遵守。
准备和设置
安装软件包
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
makepkg 配置
确保使用正确的 PACKAGER
和 GPGKEY
变量配置您的 ~/.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
--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
配置文件。更改和构建
强制性使用干净的 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
在已识别的 soname 更改上运行 sogrep
pkgctl build
时,这是自动完成的。如果 checkpkg 在 package
的库 package.so
中识别出共享对象名称(也称为 soname)更改,则必须重建直接依赖于它的软件包。
为了识别哪些软件包在主要稳定仓库(即 core 和 extra)中依赖于 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
重建它们。
使用 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
。否则,软件包可能会链接到目标系统上不存在的依赖项。这会将软件包及其签名上传到 repos.archlinux.org 上您用户 ~/staging
目录中特定于其仓库的位置,并为软件包 git 仓库上的版本创建一个签名标签。
更新仓库
使用 db-update
将为一组仓库查找新软件包,具体取决于调用的是哪个仓库。
要将上传的软件包发布到 core、extra、gnome-unstable、kde-unstable、staging 或 core-testing 和 extra-testing,请使用
$ pkgctl db update
其他操作
移除软件包
使用 pkgctl db remove
将从特定二进制仓库中移除软件包。
要从任何 官方仓库 中移除软件包,请使用
$ pkgctl db remove reponame libfoo
在仓库之间移动软件包
使用 db-move
将在两个二进制仓库之间移动软件包。
要在 core、extra、gnome-unstable、kde-unstable、staging 或 core-testing 和 extra-testing 之间移动相同 pkgbase
的软件包,请使用
$ pkgctl db move source_repository target_repository pkgbase...
例如,要将 pkgbases
foo
和 bar
的软件包从 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
而不是 --staging
的 pkgctl release
),您可以撤消它。
从仓库服务器上的暂存位置移除软件包
$ ssh repos.archlinux.org "rm staging/extra/example-1.0.0-any.pkg.tar.zst*"
之后,再次继续签名、上传和提交。