GNU/Linux >> Belajar Linux >  >> Linux

Tips lainnya untuk mengemas perangkat lunak Linux Anda dengan RPM

Jika Anda menggunakan Red Hat Enterprise Linux (RHEL) atau Fedora, Anda akan segera menggunakan dnf (atau yum ) untuk menginstal paket perangkat lunak. Red Hat Package Manager (RPM) adalah alat manajemen perangkat lunak yang paling penting pada distribusi Linux ini. Artikel ini menunjukkan bagaimana Anda dapat memanfaatkan kerangka kerja ini untuk mendistribusikan aplikasi Anda sendiri.

Mudah-mudahan, Anda memiliki kesempatan untuk membaca artikel Valentin Bajrami tentang topik yang sama. Saya akan mengulangi beberapa konsep yang sama di sini dan mengilustrasikan beberapa masalah yang mungkin Anda temukan di sepanjang jalan. Saya juga akan menggunakan dua contoh yang lebih kompleks dan mengidentifikasi beberapa masalah yang mungkin Anda temukan saat mengemas aplikasi asli.

Artikel ini menunjukkan cara menentukan cara mengompilasi dan mengemas aplikasi asli Anda sendiri untuk distribusi. Dalam artikel lanjutan, saya akan menjelaskan cara mengemas aplikasi pihak ketiga yang tidak memiliki paket RPM, atau jika ada, Anda ingin menyesuaikannya.

Prasyarat meliputi:

  • Anda memiliki pengetahuan dasar tentang cara menggunakan RPM untuk menanyakan paket dan menginstal atau menghapus paket. Jika belum, kenali dulu konsep-konsep ini, lalu kembali ke sini untuk bersenang-senang.
  • Anda telah menginstal Make, Git, GCC, dan Java, karena Anda memerlukannya untuk menyelesaikan latihan yang disertakan di sini. Itu tidak wajib, tapi alangkah baiknya jika kamu berlatih saat aku bergerak.

Untuk menginstal Make, GCC, Java 11, dan Git menggunakan pengelola paket DNF, jalankan:

$ sudo dnf install \
make gcc-10 java-11-openjdk-headless git

Kemas perangkat lunak Anda sendiri menggunakan RPM

Artikel ini menggunakan proyek open source kecil yang disebut jdumpertools untuk langkah ini.

Di terminal Linux Anda, klon jdumpertools dan kemudian kompilasi (Anda telah menginstal Make dan compiler GCC, kan?):

$ git clone [email protected]:josevnz/jdumpertools.git
$ cd jdumpertools
$ make all

$ ls -l jdu jutmp *.so
-rwxrwxr-x 1 josevnz josevnz 32728 Oct  3 16:40 jdu
-rwxrwxr-x 1 josevnz josevnz 32752 Oct  3 16:40 jutmp
-rwxrwxr-x 1 josevnz josevnz 29024 Oct  3 16:40 libjdumpertools.so

Kemudian Anda dapat menjalankan salah satu program yang dihasilkan. Misalnya, coba jdu (versi sederhana dari du perintah yang mencetak hasil dalam format JSON):

$ LD_LIBRARY_PATH=$PWD $PWD/jdu /
[{"partition": "/", "free_space": 462140129280.000000, "total_space": 510405902336.000000}]

Sejauh ini, sangat baik.

File jdumpertools.spec di direktori ini adalah file spesifikasi RPM yang mengontrol cara mengompilasi dan mengemas jdumpertools menggunakan RPM.

Selanjutnya, instal beberapa alat pendukung sebelum pindah ke pembuatan file RPM.

Instal blok penyusun RPM

Dapatkan rpmdevtools yang diperlukan utilitas dengan menjalankan:

$ sudo dnf install rpm-build rpmdevtools

Kemudian siapkan kotak pasir untuk membuat RPM menggunakan rpmdevtools . Jangan pernah menggunakan root untuk langkah ini melainkan akun Linux pribadi atau pengembang Anda (ini akan melewati -d tanda debug):

$ rpmdev-setuptree -d
josevnz       /home/josevnz    /home/josevnz/.rpmmacros
/home/josevnz/rpmbuild/RPMS    /home/josevnz/rpmbuild/SOURCES     /home/josevnz/rpmbuild/SPECS
/home/josevnz/rpmbuild/SRPMS   /home/josevnz/rpmbuild/BUILD

Ini tampilan yang lebih bagus:

$ tree ~/rpmbuild
/home/josevnz/rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

5 directories, 0 files

Saat ini, Anda hanya perlu memperhatikan dua direktori:SOURCES dan SPECS . Saya akan menjelaskan yang lain nanti.

Ada juga file baru bernama ~/.rpmmacros . Anda dapat meletakkan atau mengganti beberapa makro khusus di sana untuk menghindari tugas yang berulang saat membangun paket RPM. File ini penting karena menambatkan rpmbuild lingkungan dengan direktori home Anda.

Kemas aplikasi Anda

Pertama, buat tar file kode sumber di ~/rpmbuild/SOURCES direktori:

VERSION=v0.1
NAME=jdumpertools
TARFILE=$(NAME)-$(VERSION).tar.gz
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)

Biasanya tar file berisi skrip dan kode sumber yang akan Anda kompilasi dalam proses pengemasan.

Selanjutnya, buat RPM spec mengajukan. Sekali lagi, rpmdevtools memberikan permulaan, seperti ini:

$ rpmdev-newspec ~/rpmbuild/jose-package.spec
/home/josevnz/rpmbuild/jose-package.spec created; type minimal, rpm version >= 4.16.

$ cat  ~/rpmbuild/jose-package.spec
Name:           jose-package
Version:        
Release:        1%{?dist}
Summary:        

License:        
URL:            
Source0:        

BuildRequires:  
Requires:       

%description

%prep
%autosetup

%build
%configure
%make_build

%install
rm -rf $RPM_BUILD_ROOT
%make_install


%files
%license add-license-file-here
%doc add-docs-here

%changelog
* Sun Oct 03 2021 Jose Vicente Nunez <[email protected]>
- 

Jangan khawatir jika Anda tidak dapat memahami file ini sekarang. Salin jdumpertools.spec file ke ~/rpmbuild/SPECS direktori:

$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS

Dan buat sumber dan file RPM biner:

$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.spec
setting SOURCE_DATE_EPOCH=1609718400
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.kBlIwO
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd /home/josevnz/rpmbuild/BUILD
+ rm -rf jdumpertools
+ /usr/bin/gzip -dc /home/josevnz/rpmbuild/SOURCES/jdumpertools-v0.1.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd jdumpertools
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
[...]
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uEyCyL
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd jdumpertools
+ rm -rf /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0

Hasil akhirnya adalah dua file:RPM sumber dan RPM biner.

Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm

Apa yang terjadi selama pemasangan RPM

Jadi apa yang terjadi ketika Anda menginstal setiap RPM khusus Anda?

  1. Menginstal RPM sumber akan membuat tar file dan spec file di rpmbuild direktori. Ini memungkinkan Anda untuk mengkompilasi ulang aplikasi, membuat perbaikan pada spec RPM file, dll.
    $ ls rpmbuild/{SPECS,SOURCES}
    rpmbuild/SOURCES:
    jdumpertools-v0.1.tar.gz
    
    rpmbuild/SPECS:
    jdumpertools.spec
  2. Jika Anda menginstal RPM biner, maka Anda sebenarnya menginstal aplikasi:
    $ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
    Verifying...                ################ [100%]
    Preparing...                ################ [100%]
    Updating / installing...
       1:jdumpertools-v0.1-1.fc33  ################ [100%]
  3. Konfirmasi bahwa paket yang diinstal ada:
    $ rpm -qi jdumpertools
    Name        : jdumpertools
    Version     : v0.1
    Release     : 1.fc33
    Architecture: x86_64
    Install Date: Sun 03 Oct 2021 06:32:50 PM EDT
    Group       : Unspecified
    Size        : 95002
    License     : Apache License 2.0
    Signature   : (none)
    Source RPM  : jdumpertools-v0.1-1.fc33.src.rpm
    Build Date  : Sun 03 Oct 2021 06:27:11 PM EDT
    Build Host  : dmaf5.home
    URL         : https://github.com/josevnz/jdumpertools
    Summary     : Programs that can be used to dump Linux usage data in JSON format.
    Description :
    
    Jdumpertools is a collection of programs used to dump Linux usage data in JSON format to be ingested by other tools.
    
    * jdu: Similar to UNIX 'du' command.
    * jutmp: UTMP database dumper

Catatan :Pembaca yang penasaran mungkin membuka Makefile dan melihat target yang disebut rpm :

rpm: all
    test -x /usr/bin/rpmdev-setuptree && /usr/bin/rpmdev-setuptree|| /bin/mkdir -p -v ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
    /usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
    /usr/bin/rpmbuild -ba jdumpertools.spec

Ini adalah jalan pintas yang nyaman untuk menyiapkan rpmbuild kotak pasir, tar file setelah dikompilasi dengan make , dan mengemasnya menggunakan rpmbuild memerintah. Jangan ragu untuk menghubungi make rpm dan lihat apa yang terjadi.

[ Dapatkan kiat lainnya dengan mengunduh lembar contekan skrip shell Bash. ]

Saya menunjukkan kepada Anda perintah dan alat yang digunakan untuk menghasilkan file RPM, tetapi sekarang saatnya untuk menulis spec RPM berkas.

Buat file spesifikasi untuk alat jdumper

Bekerja dengan file spesifikasi memerlukan pengisian beberapa tag metadata serta menjelaskan bagaimana Anda akan mengompilasi atau mengemas aplikasi. Jdumpertools adalah aplikasi ANSI C sederhana, jadi buka paket sumber, kompilasi, salin ke area perantara (~/rpmbuild/BUILDROOT ), lalu mengemasnya untuk didistribusikan.

Pertama, lihat file spesifikasi RPM:

Name:           jdumpertools
# TODO: Figure out a better way to update version here and on Makefile
Version:        v0.1        
Release:        1%{?dist}
Summary:        Programs that can be used to dump Linux usage data in JSON format. 

License:        Apache License 2.0
URL:            https://github.com/josevnz/jdumpertools
Source0:        %{name}-%{version}.tar.gz

BuildRequires:  bash,tar,gzip,rpmdevtools,rpmlint,make,gcc >= 10.2.1
Requires:       bash

%global debug_package %{nil}

%description

Jdumpertools is a collection of programs you can use to dump Linux usage data in JSON format to be ingested by other tools.

* jdu: Similar to UNIX 'du' command.
* jutmp: UTMP database dumper

%prep
%setup -q -n jdumpertools

%build
make all

%install
rm -rf %{buildroot}
/usr/bin/mkdir -p %{buildroot}/%{_bindir}
/usr/bin/cp -v -p jdu jutmp %{buildroot}/%{_bindir}
/usr/bin/mkdir -p %{buildroot}/%{_libdir}
/usr/bin/cp -v -p libjdumpertools.so %{buildroot}/%{_libdir}

%clean
rm -rf %{buildroot}

%files
%{_bindir}/jdu
%{_bindir}/jutmp
%{_libdir}/libjdumpertools.so
%license LICENSE
%doc README.md


%changelog
* Mon Jan  4 2021 Jose Vicente Nunez <[email protected]> - 0.1
- First version being packaged

Tinjau apa yang penting di sini:

  • Metadata, termasuk versi, nama, dan Sumber0; Anda dapat menggunakan variabel atau makro
  • Buka paket sumber di %prep bagian menggunakan %setup makro (panduan RPM memiliki banyak detail tentang flag)
  • Membangun Membutuhkan :Anda harus mencantumkan dependensi yang Anda butuhkan untuk membangun paket. Ini tidak dapat dideteksi secara dinamis.
  • %build bagian:Kompilasi dengan make
  • %instal bagian:Salin apa yang Anda perlukan agar program berfungsi (program, perpustakaan, dll.)
  • %file bagian:Di mana Anda dapat menentukan apakah file adalah dokumen (%doc ), file lisensi (% lisensi ), atau file biasa

Juga penting:

  • Saya menonaktifkan pembuatan kode debug selama pengemasan dengan %global debug_package %{nil} .
  • changelog mendokumentasikan apa yang berubah dengan versi paket baru ini.

Periksa kesalahan dalam file spesifikasi dengan rpmlint

Anda tidak ingin mengetahui dengan susah payah bahwa RPM Anda tidak sempurna. Oleh karena itu, ada baiknya untuk memeriksa kesalahan yang jelas atau cara untuk meningkatkan RPM Anda:

$ sudo dnf install rpmlint

Sekarang periksa spec RPM berkas:

$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec 
/home/josevnz/rpmbuild/SPECS/jdumpertools.spec: W: invalid-url Source0: jdumpertools-v0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 1 warnings.

Dokumentasi rpmlint mengatakan bahwa Sumber0 harus berupa URL yang terdefinisi dengan baik (nilainya harus berupa URL HTTP, HTTPS, atau FTP publik yang valid). Jangan khawatir tentang peringatan ini.

Bagaimana dengan RPM itu sendiri?

$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: summary-ended-with-dot C Programs that can be used to dump Linux usage data in JSON format.
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
jdumpertools.x86_64: E: description-line-too-long C Jdumpertools is a collection of programs that can be used to dump linux usage data in JSON format, so it can be ingested by other tools.
jdumpertools.x86_64: W: incoherent-version-in-changelog 0.1 ['v0.1-1.fc33', 'v0.1-1']
jdumpertools.x86_64: W: invalid-license Apache License 2.0
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jdu
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jutmp
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-soname /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-manual-page-for-binary jdu
jdumpertools.x86_64: W: no-manual-page-for-binary jutmp
1 packages and 0 specfiles checked; 1 errors, 10 warnings.

Sepuluh peringatan dan satu kesalahan. Beberapa mudah diperbaiki:

  • Lisensi harus dalam format tertentu
  • Halaman manual diperlukan untuk program, jadi saya menulis yang sangat sederhana dengan troff
  • Sertakan soname di perpustakaan

Setelah perbaikan, hanya satu peringatan yang tersisa:

$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm 
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
The value of this tag appears to be misspelled. Please double-check.

Peringatan ini mengingatkan Anda bahwa kata du tampaknya salah eja. Namun, ini hanya referensi ke perintah yang valid, jadi Anda dapat mengabaikan peringatan tersebut.

Sekarang tingkatkan RPM dengan versi yang ditingkatkan:

$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm

Saya menggunakan rpm perintah untuk membuatnya lebih jelas bahwa saya telah memutakhirkan paket dari versi disk lokal alih-alih versi baru dari repositori. Jika mau, Anda dapat melakukan hal yang sama dengan dnf :

$ sudo dnf install --upgrade \
~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm

Apa yang Anda pelajari, dan apa yang selanjutnya

Perangkat lunak pengemasan dengan RPM terlihat menakutkan pada awalnya, tetapi dengan sedikit kesabaran, Anda akan sampai di sana dalam waktu singkat. Saat Anda mengalami masalah, Anda juga akan menemukan cara yang tepat untuk meningkatkan kode Anda. Berikut adalah beberapa sumber dan rekomendasi akhir:

  • Tolong bantu diri Anda sendiri dan dapatkan salinan Panduan Pengemasan RPM yang ditulis oleh Adam Miller, Maxim Svistunov, dan Marie Doleželová. Ini sangat lengkap dan terorganisir dengan baik. Serius, lakukan sekarang; itu bagus.
  • Panduan Pengemasan RPM resmi dan panduan RPM Fedora juga lengkap dengan detailnya; jauhkan mereka dari bookmark.
  • Gunakan rpmlint. Anda akan terkejut betapa banyak hal kecil yang dapat Anda tangkap dan perbaiki sebelum mengirimkan paket RPM Anda.
  • Tidak cukup? Fedora memiliki daftar trik yang dapat Anda gunakan saat mengemas perangkat lunak.
  • Masih penasaran? Anda pasti harus melihat pedoman Pengemasan RPM.

Linux
  1. 3 tips untuk mencetak dengan Linux

  2. 4 tips untuk mendapatkan kerabat yang lebih tua secara online dengan Linux

  3. Pelajari lebih lanjut tentang sistem Linux Anda dengan inxi

  1. 10 Perangkat Lunak Pendidikan Linux Terbaik untuk Anak Anda

  2. Perangkat Lunak Lukisan Terbaik untuk Linux

  3. Panduan Pemula untuk Manajemen Perangkat Lunak Linux dengan RPM

  1. Tip dan trik menggunakan CUPS untuk mencetak dengan Linux

  2. 5 tips untuk memulai dengan keamanan server Linux

  3. Konfigurasi DNS dengan perintah Linux, bangun lab dalam lima menit, dan tips lainnya untuk sysadmin