【问题标题】:creating an RPM package from binary file doesn't package the files into an archive从二进制文件创建 RPM 包不会将文件打包到存档中
【发布时间】:2020-06-09 13:12:40
【问题描述】:

我正在尝试从 node 项目创建一个 RPM 包,并使用 pkg 打包成二进制文件。
我在/root/rpmbuild 中创建了一个rpmbuild 骨架。
二进制包被复制到/root/rpmbuild/SOURCES。 我在/root/rpmbuild 中创建了一个menlolab-runner.service 文件。

我将跳过 .spec 文件中的 %prep%build 部分。在安装部分,二进制文件被复制到/usr/bin 文件夹。在%post 部分,服务文件被复制到/etc/systemd/system/

%define version %(cat package.json | jq -r '.version')
%define release 1
%define buildroot /root/rpmbuild/BUILDROOT/

Name: %{name}
Version: %{version}
Release: %{release}
Summary: menlolab-runner

Group: Installation Script
License: MIT
Source0: runner
AutoReqProv: no

%description
The agent deployed on private and public infrastructure to manage tasks.

%global debug_package %{nil}

%prep

%build

%pre
getent group menlolab-runner >/dev/null || groupadd -r menlolab-runner
getent passwd menlolab-runner >/dev/null || useradd -r -g menlolab-runner -G menlolab-runner -d / -s /sbin/nologin -c "menlolab-runner" menlolab-runner

%install
mkdir -p %{buildroot}%{_bindir}/
mkdir -p %{buildroot}%{_unitdir}

cp runner %{buildroot}%{_bindir}/menlolab-runner
cp /root/rpmbuild/menlolab-runner.service %{buildroot}%{_unitdir}

%post
systemctl enable %{_unitdir}/menlolab-runner.service
chmod ugo+x /usr/bin/menlolab-runner
mkdir -p '/etc/menlolab-runner/'
chown -R 'menlolab-runner:menlolab-runner' '/etc/menlolab-runner'
chmod 700 '/etc/menlolab-runner'
mkdir -p '/var/lib/menlolab-runner/'
chown -R 'menlolab-runner:menlolab-runner' '/var/lib/menlolab-runner/'
mkdir -p '/var/lib/menlolab-runner/jobs/'
chown -R 'menlolab-runner:menlolab-runner' '/var/lib/menlolab-runner/jobs/'
chmod 700 '/var/lib/menlolab-runner/jobs/'
mkdir -p '/var/log/menlolab-runner/'
chown -R 'menlolab-runner:menlolab-runner' '/var/log/menlolab-runner/'
mkdir -p '/var/cache/menlolab-runner/'
chown -R 'menlolab-runner:menlolab-runner' '/var/cache/menlolab-runner/'
groupadd docker
usermod -aG docker menlolab-runner

%clean
rm -rf %{buildroot}

%files
%{_bindir}/menlolab-runner
%{_unitdir}/menlolab-runner.service

%defattr(644, menlolab-runner, menlolab-runner, 755)

我的问题是.rpm 在执行rpmbuild -ba /path/to/spec/file 后不包含任何文件。

我认为这是因为我在 %files 部分中没有条目。我不确定要在本节中添加什么。如果我在那里添加二进制文件的路径,我会收到以下错误:

error: File not found: /root/rpmbuild/BUILDROOT/menlolab-runner-0.2.5a2-1.x86_64/root/rpmbuild/SOURCES/runner

【问题讨论】:

    标签: docker centos binaryfiles rpmbuild rpm-spec


    【解决方案1】:

    在您的%install 部分,您必须将文件放入$RPM_BUILD_ROOT,例如:

    %install
    cp runner $RPM_BUILD_ROOT%{_bindir}/menlolab-runner
    

    随后,%files 部分应列出已安装的文件,相对于 $RPM_BUILD_ROOT,例如:

    %files
    %{_bindir}/menlolab-runner
    

    【讨论】:

    • 我知道$RPM_BUILD_ROOT 用于维护安装层次结构,%{_bindir} 相当于/usr/bin'. But the resulting command cp runner /root/rpmbuild/BUILDROOT/menlolab-runner-0.2.5a2-1 .x86_64/usr/bin/menlolab-runner`对我来说毫无意义。你介意澄清一下吗?
    • 也许this 会有所帮助?这背后的想法是您正在抽象安装目录,为此,您首先将 rpmbuild 安装到该 buildroot 目录中,然后在文件部分中指定安装到 buildroot 的哪些文件需要打包。最好通过查看现有的规范文件来学习。最好安装一个服务。 SystemD 单元文件应该使用它们自己的一组宏来安装,例如docs
    • 好的,但是menlolab-runner-0.2.5a2-1.x86_64 来自哪里,不应该是/root/rpmbuild/BUILDROOT/user/bin/menlolab-runner。我假设Sources 链接到/root/rpmbuild/SOURCES?还是我需要在cp 期间提供到runner 的完整路径?
    • 这只是“它的工作原理”。见here。 buildroot 是特定于一个包的,所以一个包会有一个,而另一个包会有不同的。
    • 它们的格式实际上是由一个宏决定的,您可以验证它,例如rpm -E %{buildroot} 将产生 /root/rpmbuild/BUILDROOT/%{NAME}-%{VERSION}-%{RELEASE}.x86_64。实际上,我建议您查看 mock 来构建您的软件包。我通常使用“平面文件”方法,而所有源和规范文件都位于一个目录中。使用mock 这是可能的。此外,mock 允许您在 chroot 中构建以提供更一致的打包。
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2010-11-27
    • 2010-12-07
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多