Create RPM Package from Source Code

RPM adalah singkatan dari Red Hat Package Manager. Ini dikembangkan oleh Red Hat dan terutama digunakan pada sistem operasi Linux berbasis Red Hat (Fedora, CentOS, RHEL, dll.).

RPM package menggunakan ekstensi .rpm dan berisi kumpulan file seperti berikut:

  • Binary files (nmap, stat, xattr, ssh, sshd, and so on).
  • Configuration files (sshd.conf, updatedb.conf, logrotate.conf, etc.).
  • Documentation files (README, TODO, AUTHOR, etc.).

Membuat RPM package akan memudahkan dalam menginstal package seperti nginx beserta tambahan module yang telah di compile sebelumnya sehingga tidak harus compile secara berulang jika ingin diinstal di mesin atau server yang berbeda.

Install rpmdevtools

Instal rpmdevtools dan dependensinya

yum install rpmdevtools gcc gcc-c++ make automake autoconf rpm-build

Create rpmbuild structure

Untuk membuat package dengan rpmbuild, buat struktur direktori menggunakan perintah

rpmdev-setuptree
# tree ~/rpmbuild
/root/rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

Build RPM

Download source rpm.

yumdownloader --downloaddir /root/nginx-build nginx

Extract package RPM.

rpm2cpio nginx-1.24.0-1.el8.ngx.rpm | cpio -dium

Saya asumsikan Anda sudah menginstall tambahan modul mungkin seperti brotli, pagespeed, atau lainnya.

Lalu pindahkan file biner nginx beserta library modulenya ke /root/nginx-build

cp -p /usr/sbin/nginx /root/nginx-build/usr/sbin/nginx
cp -rp /usr/share/nginx/modules /root/nginx-build/usr/share/nginx/modules
Pastikan path biner, module, seluruh konfigurasi sudah sesuai dengan environment nginx Anda.

Buat file rpm spec seperti contoh berikut.

nano /root/rpmbuild/SPECS/nginx.spec
Name:                   nginx
Summary:                Nginx 1.24.0

Version:                1.24.0
Release:                1

Group:                  BisaCloud
License:                Not Applicable
URL:                    https://bisacloud.com
SOURCE0:                %{name}-%{version}-%{release}.tar.gz
BuildRoot:              %{_tmppath}/%{name}-%{version}-%{release}-root

%description
we are learning how to create rpm package in Linux

%global debug_package %{nil}

%prep
%setup -q

%build
#Empty

%install
rm -rf %{buildroot}
mkdir -p %{buildroot}
cp -a * %{buildroot}


%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root,-)
/usr/share/nginx/modules/ngx_http_brotli_filter_module.so
/usr/share/nginx/modules/ngx_http_brotli_static_module.so
/usr/share/nginx/modules/ngx_http_geoip2_module.so
/usr/share/nginx/modules/ngx_http_modsecurity_module.so
/usr/share/nginx/modules/ngx_http_passenger_module.so
/usr/share/nginx/modules/ngx_pagespeed.so
/usr/sbin/nginx

%changelog
* Mon Oct 16 2023 - v1.24.0-1
- Tambah module

Buat archive .tar.gz dari folder /root/nginx-build.

tar -czf /root/rpmbuild/SOURCES/nginx-1.24.0-1.tar.gz /root/nginx-build/*

Build RPM package.

rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec

Jika berhasil maka file RPM dapat ditemukan pada folder RPMS.

# tree ~/rpmbuild/
/root/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
│   └── x86_64
│       └── nginx-1.24.0-1.x86_64.rpm
├── SOURCES
│   └── nginx-1.24.0-1.tar.gz
├── SPECS
│   └── nginx.spec
└── SRPMS
    └── nginx-1.24.0-1.src.rpm