问题标签 [binary-reproducibility]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
caching - 一个脚本的词汇,无论它在哪里运行,它都会产生相同的输出
我想要一些关于使用什么词汇来描述以下内容的建议。拥有正确的词汇将使我能够搜索与概念相关的工具和想法
我想说一个脚本是 SomeWord 如果无论它在哪里运行,它都会产生相同的输出。
例如,以下脚本不是SomeWord:
因为当然这取决于它在哪里执行。
而以下(如果它运行没有错误)预计将始终产生相同的输出:
一个更有用的示例是加载和运行 docker 或奇异容器的方式,以保证正在使用非常特定的容器映像。例如,通过其内容哈希检索奇点图像。
SomeWord 脚本的优点是:(a) 它们可以在远程系统上安全运行,而无需担心环境;(b) 它们的输出可以被缓存。
docker - 真正可复制的 Docker 容器?
有一种称为可重复构建的安全趋势,其目的是有一种方法来创建输出二进制文件的位精确副本,以便用户可以验证在 Internet 上找到的版本是否可信。Docker 社区中是否有类似的运动和工具?根据我的理解,即使在容器化 Linux 发行版中使用版本固定,时间戳也会使这成为问题。有没有办法解决这个问题并创建一个可读的 Dockerfile,它不是从头开始构建的,可以确定性地描述依赖关系并且以面向未来的方式?
.net - 使用 NuGet 包确保可重现的构建
我有一个名为 .NET 的应用程序Application
。
此应用程序依赖于两个 NuGet 包:
Database
, 版本 2.*Logging
, 版本 3.*
该Database
软件包依赖于两个附加软件包:
DTO
, 版本 1.*DAL
, 版本 4.*
目前,Application
使用这些具体的包版本:Database
2.1Logging
版、3.1 版。
我构建我的Application
,NuGet 解析并下载依赖项,所以我得到DTO
版本 1.5 和DAL
版本 4.0。我将我Application
的安装包放入并交付给我的客户。我在 git 中用app-1.0
.
所以我的客户得到以下二进制文件:
Application.exe
, 版本 1.0Database.dll
, 2.1 版Logging.dll
, 版本 3.1DTO.dll
, 1.5 版DAL.dll
, 4.0 版
一年后,客户提交了一个我需要彻底分析的错误。为了重现该问题,我需要与客户相同的二进制文件,因此我检查了标签app-1.0
并想要构建我的应用程序。
同时,在 NuGet 源上更新了DAL
和包:最新版本为 1.7,版本为 4.5。DTO
DTO
DAL
我的问题是:
- 当我现在构建我的应用程序时,NuGet 是否会将
Database
依赖关系解析为最新的可用版本?我也得到了DTO 1.7
,DAL 4.5
而不是DTO 1.5
andDAL 4.0
(用于构建app-1.0
)? - 如果是,我如何使用 NuGet 确保我的版本的二进制重现性?
- 如果不是,NuGet 如何解决“正确”的引用?
image - Pytorch - 无法实现重现性
我正在使用 Pytorch 训练图像分类器模型。在训练它时,我无法设置种子。我已经利用了所有的选择,但仍然没有得到任何一致的结果。请帮助我。
我正在使用它,但我的模型仍然不一致。
c++ - 如何让 GCC 创建校验和相同的构建?
在我工作的公司中,有一个复杂的工业 ARM 架构路由器项目,主要由许多带有 Linux 内核的 C 和 C++ 应用程序组成。目前我们正在准备认证和认证组织希望我们向他们发送所有源文件和生成的根文件系统映像的二进制校验和。当然,我们发送给他们的校验和和他们在构建后将获得的图像校验和应该是相同的。
我尝试在同一主机上连续构建相同的应用程序(我选择了busybox)两次,并得到了两个不同的校验和。我尝试使用答案https://superuser.com/a/1092566/851200(-frandom-seed=123
作为编译标志传递)来解决它 - 没有帮助。
如果我可以在同一主机上两次使用相同的校验和构建相同的应用程序 - 我认为问题实际上将得到解决,因为我们可以对认证组织说“在 Ubuntu 18.04.3 上使用 GCC 7.5.0-3ubuntu1~18.04 和 ARM GNUEABI GCC 构建软件4.8.5 从我们提供给您的资源等构建”和基础软件将是相同的,并且在相同的系统案例上构建将是相同的。但也许我错过了什么。
有人可以帮助我吗?
更新:
我试图查看使用生成的二进制文件有什么不同,arm-linux-gnueabi-readelf -a
并在同一台机器上为busybox获得了以下两个顺序构建的差异:
然后我检查了 GCC 手册页并查看If style is omitted, "sha1" is used ... The "md5" and "sha1" styles produces an identifier that is always the same in an identical output file
. 所以默认值应该没问题并且产生相同Build ID
的,但事实并非如此。
apt - 可重现的 Debian 安装
有没有办法创建一个干净的基于 Debian 的映像(我希望它用于容器,但它也可能用于虚拟),并自定义选择软件包,只要安装的软件包和 debconf 参数,这些软件包将是二进制完全相同的是相同的?
这基本上有两种用途:
- 可以独立验证指定其包含的软件包的确切版本的图像(使用快照或重建软件包,只要 Debian 设法使这些构建可重现)
- 轻松检查是否有任何包有新版本,因为可以简单地每晚重建映像,并且只有在包中有实际更改时其校验和才会更改。
它可以从 debian 发布的基础镜像(例如 docker 镜像debian:stable
)和 apt 或使用 debootstrap(IIRC 基本 Debian 镜像也使用 debootstrap 构建)或其他合适的构建器构建。
python-3.x - 如何使python源代码的编译可重现
在我的机器上安装 jsonpickle 后( pip install jsonpickle==1.4.1 --no-compile ),我注意到子文件夹中文件的编译pandas.py
并不ext
总是可重现的。
在ext
子文件夹中,我执行了以下 bash 代码将所有.py
文件编译为.pyc
文件:
python -m compileall -d somereldir --invalidation-mode checked-hash
这在子目录中创建了一个pandas.cpython-37.pyc
文件。__pycache__
然后在__pycache__
子目录中执行:
xxd pandas.cpython-37.pyc > hex1.hex
如果我再次执行上述步骤并将 hexdump 写入hex2.hex
,我注意到有两行不匹配。
我执行了几次,似乎有两个“版本”的.pyc
文件,有时它们匹配,有时它们不匹配。
因此,我有几个问题:
- 为什么文件有差异
.pyc
? - 如何确保编译的
.pyc
文件始终相同。 - 我检查了其他一些 python 库,它们都生成了可重现的
.pyc
文件,那么这个pandas.py
文件有什么不同呢?
c++ - 更改构建路径的 CMake / G++ 可重现构建问题
很长一段时间以来,我一直在调查我为 Debian 打包的软件所遇到的可重现构建问题,但成功率有限。当构建路径更改时,再现性会受到影响,结果是以下差异(使用 diffoscope 报告)。
代码本身是 C++,构建基础设施基于 CMake。它由一个静态库和一个可执行文件组成。
提前感谢任何可以帮助解决此问题的提示。
静态库的 CMakeList 文件:
可执行文件的 CMakeList 文件:
另请注意,debian/rules 设置了一个标志,将触发使用-ffile-prefix-map=OLD=NEW
差异(diffoscope 输出):
java - 使用 jlink 可重现的构建
简化的 JDK(使用 创建jlink
)是我们应用程序的一部分。JDK 映像所需的模块很少更改。不幸的是,生成一个新的 JDK 映像(具有完全相同的jlink
参数)会导致不同的输出,因此客户端必须在差异升级期间一次又一次地下载相同的文件,这是不必要的。
这是一个 PoC:
(我在多个构建服务器上使用类似于 JDK 实例的jdk-15a
和目录。)jdk-15b
在这种情况下,有没有办法从字节到字节的相同输出(可重现的构建)jlink
?
使用的JDK版本:
android - 是否可以检查源代码是否与 App 版本匹配?
德国 (SAP / Telekom) 建立了一个 Corona-App。它在Android Store中可用,代码在 Github 上。
是否可以检查 Github 上的代码是否与 Android Store 中的代码匹配?