构建包并检查它们的可重复性。

reprotest的Python项目详细描述


reprotest
==


reprotest在不同的环境中两次生成相同的源代码,然后检查每个生成生成的二进制文件是否存在差异。如果找到任何选项,
然后使用"diffoscope(1)"`(如果不可用,则使用"diff(1)"`)详细显示这些选项,以便以后进行分析。

请参阅下面的"命令行示例"部分,以启动
,并对所有命令行
选项进行更详细的说明。同样的信息也可以在
``/usr/share/doc/reprotest/readme.rst``或类似文件中找到。raw::manpage

.\"下面的黑客去掉了python"usage"消息,转而支持
.\"我们在doc/$(package)中手动定义的概要。h2m.0
.ss位置参数:
.\"end懔u of懔description懔header

预设:在空服务器(/tmp)中生成当前目录

$reprotest。
$reprotest。-vv--null-d对于非常详细的输出

但他们热衷于添加更多内容。如果我们不知道如何构建文件或
目录,您可以向我们发送有关添加此智能的修补程序-请参见reprotest.presets python模块,并调整现有逻辑。

同时,您可以使用cli的其他部分来构建任意内容。
您需要提供两个强制参数,即build要运行的命令和要在运行生成后测试的生成项目文件/模式。例如::

$reprotest'python3 setup.py bdist''dist/*.tar.gz'

这在当前工作目录`.``上运行命令。要在位于其他位置的
项目上运行它,请执行以下操作:

$reprotest-c'python3 setup.py bdist'../path/to/other/project'dist/*.tar.gz'

这两个调用是等效的;您可以为您的用例选择最方便的调用。在shell中使用时:

*如果build命令有空格,则需要引用它们,例如
``reportest"dpkg buildpackage-b--no sign"[..]`.

*如果要使用多个build artifact模式,或者如果要
使用shell通配符作为模式,则还需要引用它们,例如,
``reprotest[..]"*.tar.gz*.tar.xz"`.


*如果您的构建工件的名称中有空格,则需要
引用这两个值,例如,`````一个文件的名称中有空格.gz"``对于单个
工件,或者```一个目录1"/*"dir 2"/*"``对于多个模式。

若要获得有关cli的更多帮助,包括有关可选
参数及其作用的文档,请运行:

$reprotest--help




在虚拟服务器中运行
=等等,您可以这样运行它们::

$reprotest'python3 setup.py b dist_wheel''dist/*.whl'--qemu/path/to/qemu.img
$reprotest'dpkg buildpackage-b--no sign'/*.deb'--schroot unstable-amd64

有关
"位置参数"部分的"虚拟服务器参数"部分中出现在顶部的
参数的列表,请参见`--help``。


对于每个虚拟服务器(例如"schroot"),您可以看到它支持哪些额外参数:


$reprotest--help schroot

您可能需要
发出额外的命令,以便设置您的build虚拟服务器内部的依赖关系。例如,要了解"debian
目录"预设的外观,如果使用完整的cli运行它::

"debian目录"预设
$reprotest。--schroot unstable-amd64-sbuild
这完全等同于:
$reprotest-c auto。--schroot unstable-amd64-sbuild
在非预设的完整cli中,这大致类似于:
$reprotest\
--testbed init'apt get-y--no install建议安装\
disorderfs faketime locales所有sudo util linux;\
测试-c/dev/fuse mknod-m 666/dev/fuse c 10 229;\
测试-f/etc/mtab ln-s../proc/self/mounts/etc/mtab'\
--testbed build pre'apt get-y--no install建议使用build dep./'\
--build命令'dpkg buildpackage--no sign-b'\
. \
'../*.deb'\
--\
schroot unstable-amd64-sbuild


需要使用`--testbed init``参数来设置基本工具,而这些工具需要重新测试,以便在第一时间进行更改。不管构建的是什么包,这个
都应该是相同的,但是根据使用的是什么虚拟服务器,这个
可能会有所不同。

接下来,我们有``--testbed build pre```,然后是`--build command``(或`-c``)。对于我们的debian目录,我们使用``apt`安装构建依赖项-获取``,
然后我们使用``dpkg buildpackage(1)``运行实际的构建命令本身。

然后,我们有``source`根``和``artifact`模式``。对于
可再现性,我们只对二进制包感兴趣。

最后,我们指定这将发生在"schroot"
带有参数"unstable-amd64-sbuild"的虚拟服务器中。

Y次。这就是为什么为新的包类型添加新的预设值是好的。

它告诉reprotest将构建产品存储到`./artifacts``中以供以后分析;还调整了"debian-dsc"预设值
,以便使用我们的"实验工具链"https://wiki.debian.org/reproductbuilds/experitaltoolchain>;`:

$reprotest--store dir=artifacts \
--自动预设expr'.prepend.testbed_init("apt get install-y wget;\
echo deb http://reproduble.alioth.debian.org/debian/./>;>/etc/apt/sources.list;\
wget-q-o-https://reproduble.alioth.debian.org/reproduble.asc apt key add-;\
apt get update;apt get upgrade-y;"'\
./bash庠4.4-4.0~reproducele1.dsc\
--\
schroot unstable-amd64-sbuild

或者,可以克隆unstable-amd64-sbuild chroot,将repo添加到克隆的chroot中,然后使用此chroOT代替"unstable-amd64-sbuild"。
这将允许您省略上面的long``--auto preset expr``标志。



config file
====


您还可以通过配置文件提供重新测试的选项。这是一个类似于"auto"预设的省时措施;不同之处在于
它们更适合于适合您个人目的的本地构建。(可以在同一版本中同时使用预设和配置文件。)

config文件采用与命令行界面完全相同的选项,
,但附加的限制是节名必须与--help输出中给定的选项匹配。如果且仅当相同的
命令行选项允许空白时,才允许空白。最后,无法通过此机制提供
位置参数。默认情况下,reprotest不加载任何配置文件。您可以告诉它使用`--config file``或`-f``命令行选项加载一个
。如果给它一个
目录,比如`.``,那么t将在该目录中加载"`.reprotestrc`"。

内核
locales
exec路径
time
timezone
umask
store\u dir=
/home/foo/build/reprotest工件

[diff]
diffoscope\u arg=
--调试



通常,diffoscope在比较目录时,也会比较这些目录中
文件的元数据-文件权限、所有者等。

但是,根据具体情况,此文件系统级元数据可能或
可能不打算分发到其他系统。例如:(1)对于大多数发行版的包构建器,我们不关心输出包文件的元数据;只将文件内容分发给其他系统。另一方面,(2)当运行类似"make install"的东西时,我们确实关心元数据,因为这是将在另一个系统上重新创建的内容。

ata``默认为diffoscope。如果
您发现正在对案例(2)使用reprotest,则应将
`--diffoscope args=--no exclude directory metadata``传递给reprotest,以告诉
diffoscope不要忽略元数据,因为它将被分发,因此应该是可复制的。否则,可能会得到假阳性结果。



名称的完整列表
在--variations的--help文本中提供。

r/>@$variation
启用变体,将其参数(见下文)重置为默认值。

$variation.$param=$value
$variation.$param+=$value
$variation.$param-=$value
将$value设置为/to/from$param参数的当前值$variation。
接受参数的变量是:

domain_host.使用一个整数,是否将sudo(1)与unshare(1)一起使用来更改
系统主机名和域名。0表示不使用sudo;任何非零值
表示使用sudo。默认值为0,但不建议这样做,如果生成失败,请参阅"更改域名和主机名"了解详细信息。
environment.variables
一个分号分隔的有序集,指定
reprotest应尝试更改的环境变量。默认为"represtest_capture_capture_capture_环境"。
>支持基于regex的语法,例如


-pid=>d{1,6}
-home=
-home=(/-(go python;)path=(/<特殊情况:

-$varname=(空rhs)告诉reportest删除变量
-$varname=.{0}以告诉reportest实际设置一个空值
-\\x2c和\\x3b以分别匹配或生成,和。
user_group.available
一个分号分隔的有序集,指定表示Otest可以"sudo(1)""to"。默认值为空,在这种情况下变化是一个禁止操作,你会看到一个警告。每个
用户+组都应以$user:$group的形式给出,其中任何一个组件
都可以省略,否则如果没有冒号,则它将被解释为只
一个$user,没有$group变量。
time.faketimes
一个分号分隔的有序集,指定可能的``faketime(1)``要使用的时间
描述符。默认值为空,在这种情况下,我们随机选择一个
时间:现在(如果"source_root"中的最新文件modtime比大约半年还旧)或将来超过半年。


``faketime(1)``有可能冻结它,但我们还不支持它;它有更高的机会导致生成失败或错误行为。


此外,为
--变量设置的最后一个值被视为第零个--变量参数。例如::



表示vary+all(变量的默认值)和-user_group(变量的给定值),而::


reprotest--variations=-all,locales--variations=home,time--vary=timezone--vary=-time

vary home、time(变量的最后一个给定值)、时区和时间(变量的给定多个值),即home和时区。



向系统发送。它还假设其他软件可能在同一个
系统上运行,因此它不执行会影响
其他进程的系统级修改。由于这些假设,在不同级别的脏东西上使用黑客实现了一些变化,如下所述。


这可能允许在这些上下文中进行更平滑的操作。
但是,对于"空"(默认)虚拟U服务器的假设将保持不变。

多线程或多处理。如果您确信您的
生成不受此影响(并且良好的生成不应该受此影响),您可以给
--最小CPU=99999以使用两个生成的所有可用内核。

很可能是您的构建必须执行与系统相关的操作,而不是只处理位和字节。这是因为它运行在一个单独的名称空间
中,您的非特权用户看起来像是"根",但这会阻止
文件系统识别真正的"根"用户拥有的文件,以及其他
的东西。这是unshare(1)的一个限制,不可能在重新测试时不费很大力气就解决这个问题。


因此,建议使用sudo=1运行此变体。要避免
密码提示,请参阅下面的"避免sudo(1)密码提示"部分。

在虚拟服务器内运行时:

非sudo方法将失败,并显示"不允许操作",即使您编辑了
`/proc/sys/kernel/unprivileged\u userns\u clone``。原因目前尚不清楚。

sudo方法仅在采取措施避免sudo密码提示时才起作用,
因为容器没有输入此密码的方法。

结果),
您使用的每个用户都需要在"fuse"组中。通过以root用户身份运行'usermod
-ag fuse$otheruser`来完成此操作。

要避免sudo(1)密码提示,请参见"av"一节oid sudo(1)password
提示"below."

time
---


"time"变量使用"faketime(1)",有时*会导致奇怪和难以诊断的问题。在过去,这包括:

-生成需要无限长的时间;但这应该在最新版本的reprotest中修复。

-生成的结果与由./configure scripts
导致的异常巨大的差异不同。这仍会影响
bash,可能还会影响使用autotools的某些其他包。

-由于证书过期错误和/或其他与时间相关的安全错误,生成访问网络失败。(自由/开源软件的透明构建首先不应该访问网络,但它不在reprotest的审核或阻止范围之内。)


如果您发现您真正认为不应该存在的差异,请尝试传递
`--variations=-time``进行重新测试,和/或检查r在
https://tests.represeable-builds.org/上的结果,该网站使用不同的(更可靠的)
机制来改变系统时间。




避免sudo(1)密码提示
=以下为实验性
溶液,易碎且不清洁。你必须自己决定是否值得你的用例:


$reprotest——打印sudoers\
——variations=user_group.available+=来宾生成器,域主机。使用sudo=1\
sudo editor=tee visudo-f/etc/sudoers.d/本地reprotest

设置您实际要使用的变体。显然,不要为此目的选择特权用户,例如根用户。

(使用通配符简化输出,将打开对系统上任何内容的无密码访问,因为这里的通配符匹配空白。我不知道sudo作者是怎么想的。)


不,这一点都不好-欢迎使用建议和修补程序。


例如,对于schroot,您应该(1)登录到源schroot并
创建一个空文件`/etc/sudoers.d/local reprotest`(这很重要),然后
(2)添加以下行:

/etc/sudoers.d/local-reprotest/etc/sudoers.d/local-reprotest none bind 0

chroot的fstab.

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Google应用程序引擎FreeMarker模板java。安全AccessControlException   在Java中,空字符串(“”)如何存储在内存中?   java如何使用PUT进行创建   java无法构造com的实例。谷歌。云数据存储。钥匙   Java递归中的堆栈溢出错误   java通过结构化设计模式重构冗余代码   javascript使用Selenium IDE 2.9.1上传文件   JAVAutil。扫描仪在Java中将文本文件加载到对象中   这个JAVA程序的时间复杂度是多少   java Springboot+tomcat+ssh=连接链路故障   矢量Java不安全操作   用于Java不同生成代码的协议缓冲区gRPC protobuf生成器   java OSGi为什么我的包命名为“unknown0.0.0”和MANIFEST。MF文件被覆盖了吗?   java日期保持为空(Android)   使用stax解析器java解析xml   java有一种方法可以在运行时确定对象是否是使用Lambdaj创建的。关于()方法?