DeveloperWiki:如何成为打包者
准备与设置
安装软件包
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 同步数据库列出软件包的重建顺序。
- arch-signoff — 在终端中交互式地为 testing 仓库的软件包签核。
- arch-repro-status — 在终端中交互式地列出你的软件包的可复现状态,并能够查看每个不可复现软件包的构建日志和 diffoscope 输出。
- archlinux-contrib — Arch Linux 中使用的贡献脚本集合。
工作流程
检出/更新本地软件包仓库
检出现有软件包
$ pkgctl repo clone packagename
--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 配置文件。更改与构建
强制使用 干净的 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
为相应的 staging 环境构建 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。否则,软件包可能会与目标系统上不存在的依赖项链接。这将把软件包及其签名上传到你用户 ~/staging 目录在 repos.archlinux.org 上的仓库特定位置,并在软件包的 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 将在一个二进制仓库之间移动一个软件包。
要将相同 pkgbase 的软件包从 core、extra、gnome-unstable、kde-unstable、staging,或者 core-testing 和 extra-testing 移到另一个仓库,请使用:
$ pkgctl db move source_repository target_repository pkgbase...
例如,将 foo 和 bar 的 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),你可以撤销它。
从服务器仓库的暂存位置移除软件包
$ ssh repos.archlinux.org "rm staging/extra/example-1.0.0-any.pkg.tar.zst*"
之后,请再次继续 签名、上传和提交。