![rpm 模拟 - 复杂的 rpm 构建](https://linux22.com/image/130673/rpm%20%E6%A8%A1%E6%8B%9F%20-%20%E5%A4%8D%E6%9D%82%E7%9A%84%20rpm%20%E6%9E%84%E5%BB%BA.png)
假设我想制作一个 RPM,它可以提供带有自己的 OpenSSL 的 Apache Web 服务器:
/mydir/apache_postfix1
/mydir/openssl_postfix1
configure --prefix=/mydir/openssl
由于 Apache mod_ssl 需要真正的 OpenSSL 安装,因此我必须安装 OpenSSL make
,以便 Apache可以实际编译。make install
/mydir/openssl
mod_ssl
configure --with-ssl=/mydir/openssl
在构建服务器(Jenkins)上这是不可想象的,因为它没有对其作业目录之外的任何内容的权限。但我需要使用 OpenSSL 构建 Apache 并将其打包到 RPM 中(以提供后缀多个 Apache,每个 Apache 都有自己的 OpenSSL)。
所以我认为这mock
就是解决方案(与我们获得任何用户/安装权限相比,它更有可能安装在构建服务器上)。
但我还没有找到关于如何使用模拟来使用 rpmbuilds 完整功能的完整文档。
我尝试过mock -r epel-7-x68_64 example.src.rpm
,但它正在寻找/builddir/build/SPECS/example.spec
,所以失败了......为什么?它从哪里得到这个文件?
这只是一个例子,真正的问题由 7 个独立的软件包组成,这些软件包应该相互配置/编译,以便它们充当单个服务......并打包到单个 RPM 中,以便 Red Hat Satellite 交付到 >200服务器...而不实际将它们安装在构建服务器上...
任何帮助或可用文档/示例的链接都非常值得赞赏!
答案1
最好的文档来源是模拟源代码, 这官方 rpm 文档, 这rpm 打包指南,以及任何推荐的进一步文档。至于您发布的示例,您的example.src.rpm
包似乎在正确的位置没有合适的规范文件供模拟使用。
模拟将采用 src.rpm 文件的输入进行重建,或者您可以使用规范文件和源目录来构建源 rpm (SRPM)。通过一些额外的配置,您甚至可以直接在源代码签出中使用模拟。一旦你安装了模拟并且配置了一个用户来使用它(如果你尝试以root身份使用,模拟会抱怨,非特权用户需要在模拟组中),使用起来相当简单:
yumdownloader --source openssl
mkdir rpm-results
mock -r epel-7-x68_64 --resultdir=rpm-results openssl-*.src.rpm
这将重建提供 OpenSSL 的发行版并将生成的包放置在 rpm-results 目录中。要更改发行版提供的软件包,您需要安装 src.rpm,进行更改,然后构建生成的 rpm 文件:
yumdownloader --source openssl
rpm -ivh openssl-*.src.rpm
# usually this installs to ~/rpmbuild
# make your changes to ~/rpmbuild/SOURCES/* and ~/rpmbuild/SPEC/openssl.spec as necesary
mkdir rpm-results
mock -r epel-7-x68_64 --resultdir=rpm-results --buildsrpm ~/rpmbuild/SPEC/openssl.spec
mock -r epel-7-x68_64 --resultdir=rpm-results rpm-results/openssl-*.src.rpm
我不确定较新的版本是否不需要两步构建(SRPM => RPM),但这就是我们在我的商店中使用模拟的方式。您可能希望/需要为您尝试重建的每个包执行此操作。我不建议像您要求的那样将所有内容打包到一个包中,但从技术上讲没有什么可以阻止您这样做。您只需要制作自己的规范文件,将所有内容组合在一起或使用不同的工具,例如氟甲基丙烯酸甲酯。
答案2
我是 Mock 的维护者,所以我应该给你一个答案。但我真的不能,因为你没有具体说明到底是什么问题。
我只能详细说明 Mock 的工作原理并解决您的一些困惑。
当你调用 时mock -r fedora-27-x86_64
,Mock 就可以了(跳过一些无聊的细节):
dnf install --installroot /var/lib/mock/fedora-27-x86_64/root @buildsys-build
这将在单独的目录中安装最小系统。在这个答案中,我将进一步将其称为/var/lib/mock/fedora-27-x86_64/root
$CHROOT。模拟将提取您的
example.src.rpm
.特别是它会将规格文件放入$CHROOT/builddir/build/SPECS
并将 tar 球放入$CHROOT/builddir/build/SOURCES
.Mock 将解析您的规范文件并将 BuildRequires 中列出的所有包安装到 $CHROOT 中。 (这是以 root 身份完成的)。
然后 Mock 将 chroot() 到 $CHROOT 并在那里运行
rpmbuild -ba /builddir/build/SPECS/example.spec
。这是以非特权用户身份完成的(UID 等于您的 UID)。这样做是因为运行 rpmbuild 一直不被鼓励,并且可能会导致严重的问题。
因此,如果您想在 chroot 中安装一些附加软件包,您不应该通过调用 yum/dnf install 从 spec 文件中执行此操作(特别是因为 rpm 不可重入)。但是您应该在 BuildRequires 中指定这些包,并提供包含这些包的存储库。
mockchain -a REPOS
您可以使用(模拟链是模拟之上的薄层)或通过以下方式提供存储库:
cp /etc/mock/fedora-27-x86_64.cfg ~/my-custom-fedora-27-x86_64.cfg
#add your repository to ~/my-custom-fedora-27-x86_64.cfg
mock -r ~/my-custom-fedora-27-x86_64.cfg example.src.rpm
如果您有 7 个相互依赖的 src.rpm 包,那么最好的方法可能是调用mockchain 1.src.rpm 2.src.rpm .... 7.src.rpm
,mockchain 将为结果创建一个临时存储库,并尝试在while at-least-one-package-build do another loop
.
如果您具体说明您的实际问题是什么,那么我可以提供更具体的答案。