fakeroot 和软件包构建

fakeroot 和软件包构建

我们开发了网络发布/订阅通信套件。它在许多不同的应用程序和领域中使用,最显著的是国际空间站 (ISS) 上的有效载荷。Ubuntu 是我们的主要开发和部署系统。我们所有的代码都打包得很好。在构建软件包的过程中,我想运行每个代码库中包含的测试套件。然而...

我们的通信协议使用 Avahi,而 Avahi 又使用 DBus。因此我们的测试使用 DBus。在构建包时,会调用“fakeroot”来解决许多问题。但是,它引入了一个我无法解决的问题。当我们的测试在没有 fakeroot 的情况下运行时,我们会看到类似以下内容:

[pid  3286] sendto(12, "AUTH EXTERNAL 31303030\r\n", 24, MSG_NOSIGNAL, NULL, 0) = 24
[pid  3286] read(12, "OK 38b4600ae82865f9eba81cb700000"..., 2048) = 37

当使用 fakeroot 运行相同的测试时,我们会看到如下内容:

[pid  3280] sendto(12, "AUTH EXTERNAL 30\r\n", 18, MSG_NOSIGNAL, NULL, 0) = 18
[pid  3280] read(12, "REJECTED EXTERNAL DBUS_COOKIE_SH"..., 2048) = 46

事实证明,DBus 身份验证只是使用用户 UID 的字符串表示的 ASCII 码。正常运行时,UID 为 1000,“1”为 31,“0”为 30;因此 UID 1000 的身份验证令牌为 31303030。在 fakeroot 下,程序认为其 UID 为 0 并发送令牌 30。这被拒绝,整个混乱失败。

这是连接到系统 DBus 而不是会话 DBus,所以我不能在 fakeroot 中启动一个新实例。我查看了我们的代码、Avahi 代码和 DBus 代码,没有找到任何方法可以解决这个问题。

所以最后的问题是 - 有没有办法在不使用 fakeroot 包装器的情况下在软件包构建过程中运行测试?我真的希望测试能够运行,因为代码被提交给具有各种 Linux 发行版和版本的 buildbot 系统。这比仅在我的开发系统上运行测试提供了更好的测试覆盖率。

答案1

确实有一些测试套件在 fakeroot 下运行时会出现混乱。你可以禁用 fakeroot,如下所示debian/rules

override_dh_auto_test:
            env -u LD_PRELOAD dh_auto_test

如果您的测试套件只是“make check”,并且您使用了相当现代的包装,那么这是正确的。要点是 unset $LD_PRELOAD

但请注意,您可以不是依赖于在软件包构建期间运行的系统 D-BUS。在使用 的构建环境中,初始化脚本等通常被禁用policy-rc.d,因此如果您的测试需要系统总线,则它们需要自行启动一个(dbus-launch 和export DBUS_SYSTEM_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS)。

相关内容