Reproducible builds/Status
Arch Linux 正在不断地重建 core 和 extra 软件包,并有一个 状态页面。该页面包含不良软件包的状态以及需要修复的内容。
问题
常规
- 所有使用 pacman < 5.2 构建的软件包都需要重建,以解决文件顺序问题和 btrfs 大小 bug。对于文件顺序问题,可以通过在镜像目录上运行以下单行命令来找到受影响的 extra 软件包。
for i in /srv/ftp/extra/os/x86_64/*.pkg.tar.??; do
bsdtar -tf $i | grep "^\." > pkg-order
sort pkg-order > sort-order
if ! diff pkg-order sort-order &>/dev/null; then
echo $i;
fi
rm pkg-order sort-order
done
文件顺序重建 FTBFS
accounts-qml-module-0.7-2-x86_64.pkg.tar.xz archboot-2019.03-1-any.pkg.tar.xz cmark-0.29.0-1-x86_64.pkg.tar.xz gtk-sharp-2-2.12.45-2-x86_64.pkg.tar.xz guile1.8-1.8.8-7-x86_64.pkg.tar.xz java11-openjfx-11.0.3.u1-1-x86_64.pkg.tar.xz java11-openjfx-doc-11.0.3.u1-1-x86_64.pkg.tar.xz java11-openjfx-src-11.0.3.u1-1-x86_64.pkg.tar.xz java8-openjfx-8.u202-3-x86_64.pkg.tar.xz java8-openjfx-doc-8.u202-3-x86_64.pkg.tar.xz java8-openjfx-src-8.u202-3-x86_64.pkg.tar.xz java-openjfx-13.u14-1-x86_64.pkg.tar.xz java-openjfx-doc-13.u14-1-x86_64.pkg.tar.xz java-openjfx-src-13.u14-1-x86_64.pkg.tar.xz jdk10-openjdk-10.0.2.u13-2-x86_64.pkg.tar.xz jre10-openjdk-10.0.2.u13-2-x86_64.pkg.tar.xz jre10-openjdk-headless-10.0.2.u13-2-x86_64.pkg.tar.xz jsonrpc-glib-3.34.0-1-x86_64.pkg.tar.xz libva-vdpau-driver-0.7.4-4-x86_64.pkg.tar.xz liferea-1.12.7-1-x86_64.pkg.tar.xz linux-atm-2.5.2-6-x86_64.pkg.tar.xz mono-tools-4.2-2-x86_64.pkg.tar.xz npapi-sdk-0.27.2-2-any.pkg.tar.xz nss_ldap-265-7-x86_64.pkg.tar.xz openjdk10-doc-10.0.2.u13-2-x86_64.pkg.tar.xz openjdk10-src-10.0.2.u13-2-x86_64.pkg.tar.xz pam_ldap-186-6-x86_64.pkg.tar.xz portaudio-1:19.6.0-6-x86_64.pkg.tar.xz qtav-1.13.0-1-x86_64.pkg.tar.xz
包含 JAR 文件的软件包
JAR 文件包含每个文件的修改时间戳,这使得它们不可重现。根据构建系统,有不同的解决方案可用。
Ant
目前没有对可重现构建的支持,请参阅 上游功能请求。
Gradle
开箱即用,应支持可重现构建。
Maven
支持 project.build.outputTimestamp 属性,该属性可以设置为一个固定的时间戳。最新版本的 Maven 插件会尊重此属性来创建可重现的工件。该属性应在项目的 pom.xml 文件中设置,如果上游尚未设置,您可以使用类似以下命令的命令在编译时定义它:
mvn -Dproject.build.outputTimestamp="$SOURCE_DATE_EPOCH" clean package
可能需要修补项目的 pom.xml 以将插件更新到支持可重现构建的较新版本,请参阅 Maven 可重现构建指南以了解最低要求版本以及更多信息,例如其他必要的配置选项。
示例软件包(包括更新 Maven 插件版本的补丁):junit-system-rules。
OpenJDK jar 命令
内置的 OpenJDK jar 程序将 从 OpenJDK 15 版本开始支持 SOURCE_DATE_EPOCH。
strip-nondeterminism
作为最后的手段,Debian 的 strip-nondeterminism 能够从各种文件类型(包括 JAR)中剥离不可重现的元数据,例如文件时间戳。它并非万能的(例如,构建系统可能在 JAR manifest 中包含额外的不可重现元数据,strip-nondeterminism 会移除其中一些,但不是全部),只有在没有原生支持可重现构建的情况下才应作为最后的手段使用。
strip-nondeterminism --timestamp "$SOURCE_DATE_EPOCH"
KDE Kdeveloper 项目文件
KDE 创建的 Package App 模板 .tar.bz2 文件,当使用 repro 重现时,tar 文件和用户 ID 会不同,这可能是 repro 的一个 bug。https://gist.githubusercontent.com/jelly/570313f56ee59be7674ad4cc002232e7/raw/b85536690c48b23ce97650e8db8f0ca18c2dbf1a/gistfile1.txt
Doxygen 文档构建与 graphviz-2.44.0-2
graphviz 缺少 libpng 的依赖,导致 dot 中的 PNG 生成不可用,因为 graphviz 在 libpng 可用之前安装,因此未将其标记为需要 dlopen。所有依赖 doxygen 进行文档生成的软件包,以及以下 diff,都需要重建。
│ │ --rw-r--r-- 0 root (0) root (0) 20234 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser.html │ │ --rw-r--r-- 0 root (0) root (0) 265 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser__inherit__graph.map │ │ --rw-r--r-- 0 root (0) root (0) 32 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser__inherit__graph.md5 │ │ --rw-r--r-- 0 root (0) root (0) 3136 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser__inherit__graph.png │ │ +-rw-r--r-- 0 root (0) root (0) 19961 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser.html │ │ +-rw-r--r-- 0 root (0) root (0) 598 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser__inherit__graph.dot
[core]
| 软件包 (Package) | 问题 | 解决方案/补丁 | 负责人 | 已解决 |
|---|---|---|---|---|
| linux | 已签名模块 | none | none | 否 |
| linux-docs | 大量问题 - 顺序、链接、... | none | none | 否 |
| linux-headers | /usr/lib/modules/*/build/vmlinux diff[死链 2021-11-15—HTTP 404] |
none | none | 否 |
| linux-lts | 同 linux | none | none | 否 |
| linux-lts-docs | 同 linux-docs | none | none | 否 |
| linux-lts-headers | 同 linux-headers | none | none | 否 |
[extra]
| 软件包 (Package) | 问题 | 解决方案/补丁 | 负责人 | 已解决 |
|---|---|---|---|---|
| ant | .jar 文件差异 | none | none | 否 |
| ant-doc | 大量时间戳(javadoc),以及 .zip 文件差异 | none | none | 否 |
| asymptote | HTML 和 Info 中的日期。PDF 文档差异(日期?) | none | none | 否 |
| autogen | man 页中的时间戳,sr/share/autogen/libopts-42.1.17.tar.gz 中的文件所有权不同,以及 usr/bin/autogen 中的一个小的二进制差异 |
需要 export MAN_PAGE_DATE=... 和 configure --enable-timeout=70 | none | 否 |
| bigloo | uname 和到处都是的时间戳 | none | none | 否 |
| breezy | 3.0.2.3-3 使用 repro 和 makechrootpkg 均可重现 | 工具问题? | none | 否 |
| clisp | IP 地址;ps 文档中的时间戳,可能还有更多 | none | none | 否 |
| deluge | .pyc 文件,.egg 文件 | none | none | 否 |
| doxygen-docs | 大量 PDF 文件存在差异 | none | none | 否 |
| ecl | uname、时间戳、gzip、大量其他二进制差异 | none | none | 否 |
| eclipse-ecj | .jar 文件 | none | none | 否 |
| efitools | /usr/share/efitools/efi/LockDown.efi 存在二进制差异 |
none | none | 否 |
| efl | 大量二进制差异 | none | none | 否 |
| emacs | usr/bin/emacs 中的二进制差异 |
none | none | 否 |
| firefox | 是 firefox;PGO? | none | none | 否 |
| libbluray | usr/share/java/{libbluray{,-awt}-j2se-1.2.0.jar 中的文件属性(?)差异 |
none | none | 否 |
| libgtop | /usr/bin/libgtop_server2 中的 uname |
none | none | 否 |
| libmp4v2 | usr/include/mp4v2/project.h & usr/lib/libmp4v2.so.2.0.0 中的时间戳 |
none | none | 否 |
| lirc | YAML 文件中的时间戳,usr/share/lirc/lirc-0.10.1.tar.gz 中有大量时间戳差异,repro 导致 poll() 检测问题,makerepropkg 中未发现 |
patch | none | 否 |
| r | 文件中大量时间戳,gzip 时间戳,随机(?)生成的 /tmp/ 路径,二进制差异... |
none | none | 否 |
| zabbix-agent2 | /usr/bin/zabbix_agent2 中的时间戳 |
none | none | 否 |
[multilib]
| 软件包 (Package) | 问题 | 解决方案/补丁 | 负责人 | 已解决 |
|---|---|---|---|---|
| lib32-keyutils | 二进制文件包含构建日期 | 建议 | none | 否 |