How can I fix "RPM Build Error: Bad exit status"

How can I fix "RPM Build Error: Bad exit status"

我正在尝试在 CentOS8 容器中创建和构建一个 go rpm 包。根据 运行 rpmbuild -ba onboarding.spec 命令,我收到此错误:

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.nAad2g
+ umask 022
+ cd /home/tiagoribeiro/rpmbuild/BUILD
+ cd /home/tiagoribeiro/rpmbuild/BUILD
+ rm -rf onboarding-1.0
+ /usr/bin/gzip -dc /home/tiagoribeiro/rpmbuild/SOURCES/onboarding-1.0.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd onboarding-1.0
/var/tmp/rpm-tmp.nAad2g: line 41: cd: onboarding-1.0: No such file or directory
error: Bad exit status from /var/tmp/rpm-tmp.nAad2g (%prep)


RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.nAad2g (%prep)

我一直在 +- 关注 this 在线文档,而且大部分都是复制的。不明白为什么我会收到此错误。这是我的规范文件:

Name:           onboarding
Version:        1.0
Release:        1%{?dist}
Summary:        golang api
License:        GPLv3
Source0:        %{name}-%{version}.tar.gz
BuildRequires:  systemd-rpm-macros
Provides:       %{name} = %{version}

%description
small go app

%global debug_package %{nil}
%prep
%autosetup

%build
go build -v -o %{name}

%install
install -Dpm 0755 %{name} %{buildroot}%{_bindir}/%{name}
install -Dpm 644 %{name}.service %{buildroot}%{_unitdir}/%{name}.service

%post
%systemd_post %{name}.service

%preun
%systemd_preun %{name}.service

%files
%dir %{_sysconfdir}/%{name}
%{_bindir}/%{name}
%{_unitdir}/%{name}.service

%changelog

这是我的 rpmbuild 文件树:

/home/tiagoribeiro/rpmbuild/
├── BUILD
│   ├── main.go
│   └── onboarding.service
├── BUILDROOT
├── RPMS
├── SOURCES
│   ├── onboarding-1.0.tar.gz
├── SPECS
│   ├── onboarding.spec
└── SRPMS

我需要更改什么才能构建此包?

解压分发文件 onboarding-1.0.tar.gz 并不是创建具有默认名称(%{name}-%{version},在本例中为 onboarding-1.0)的目录。看起来 tarball 根本不包含目录,这是一种糟糕的形式。您有两个主要选择:

  1. 重新打包源代码,使其包含所需的目录:

    cd ~
    mkdir onboarding-1.0
    tar -C onboarding-1.0 -xf ~/rpmbuild/SOURCES/onboarding-1.0.tar.gz
    tar czf rpmbuild/SOURCES/onboarding-1.0.tar.gz onboarding-1.0
    

  2. 通过向 %autosetup 宏调用添加 -c 选项,指示 rpmbuild 自行创建所需目录:

    %prep
    %autosetup -c
    

如果您首先自己构建 tarball,我会选择选项 (1),但如果您使用其他人提供的 tarball,我会选择选项 (2)。