Si vous utilisez Red Hat Enterprise Linux (RHEL) ou Fedora, vous vous retrouverez bientôt à utiliser dnf
(ou miam
) pour installer des packages logiciels. Red Hat Package Manager (RPM) est l'outil de gestion de logiciels le plus important sur ces distributions Linux. Cet article montre comment vous pouvez tirer parti de ce framework pour distribuer vos propres applications.
J'espère que vous avez eu la chance de lire l'article de Valentin Bajrami sur le même sujet. Je vais répéter certains des mêmes concepts ici et illustrer quelques problèmes que vous pourriez rencontrer en cours de route. Je vais également utiliser deux exemples plus complexes et identifier quelques problèmes que vous pouvez rencontrer lors de l'empaquetage d'applications natives.
Cet article vous montre comment déterminer comment compiler et empaqueter votre propre application native pour la distribution. Dans un article de suivi, j'expliquerai comment empaqueter des applications tierces qui n'ont pas de package RPM, ou si elles en ont, vous souhaitez le personnaliser.
Les prérequis incluent :
- Vous avez des connaissances de base sur l'utilisation de RPM pour interroger des packages et installer ou supprimer des packages. Si ce n'est pas le cas, familiarisez-vous d'abord avec ces concepts, puis revenez ici pour vous amuser.
- Make, Git, GCC et Java sont installés, car vous en aurez besoin pour effectuer les exercices inclus ici. Ce n'est pas obligatoire, mais ce serait bien si vous vous entraîniez pendant que j'avance.
Pour installer Make, GCC, Java 11 et Git à l'aide du gestionnaire de packages DNF, exécutez :
$ sudo dnf install \make gcc-10 java-11-openjdk-headless git
Empaquetez votre propre logiciel à l'aide de RPM
Cet article utilise un petit projet open source appelé jdumpertools pour cette étape.
Sur votre terminal Linux, clonez jdumpertools
puis compilez-le (vous avez installé Make et le compilateur GCC, n'est-ce pas ?) :
$ 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 3 octobre 16:40 jutmp-rwxrwxr-x 1 josevnz josevnz 29024 3 octobre 16:40 libjdumpertools.so
Ensuite, vous pouvez exécuter n'importe lequel des programmes générés. Par exemple, essayez jdu
(une version simplifiée du du
commande qui imprime les résultats au format JSON) :
$ LD_LIBRARY_PATH=$PWD $PWD/jdu /[{"partition":"/", "free_space":462140129280.000000, "total_space":510405902336.000000}]
Jusqu'ici, tout va bien.
Le fichier jdumpertools.spec de ce répertoire est le fichier de spécification RPM qui contrôle la façon de compiler et de conditionner jdumpertools
en utilisant RPM.
Ensuite, installez quelques outils de support avant de passer à la création du fichier RPM.
Installer les blocs de construction RPM
Obtenez les rpmdevtools
nécessaires utilitaires en exécutant :
$ sudo dnf install rpm-build rpmdevtools
Préparez ensuite le bac à sable pour créer des RPM à l'aide de rpmdevtools
. N'utilisez jamais root pour cette étape mais plutôt votre compte Linux personnel ou développeur (il passera le -d
drapeau de débogage):
$ rpmdev-setuptree -djosevnz /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
Voici une vue plus agréable :
$ tree ~/rpmbuild/home/josevnz/rpmbuild├── BUILD├── RPMS├── SOURCES├── SPECS└── Répertoires SRPMS5, 0 fichiers
Pour le moment, vous devez faire attention à seulement deux répertoires :SOURCES
et SPECS
. J'expliquerai les autres plus tard.
Il y a aussi un nouveau fichier appelé ~/.rpmmacros
. Vous pouvez y placer ou remplacer certaines macros spéciales pour éviter les tâches répétitives lors de la création de packages RPM. Ce fichier est important car il ancre le rpmbuild
environnement avec votre répertoire personnel.
Packagez votre application
Tout d'abord, créez un tar
fichier du code source dans le ~/rpmbuild/SOURCES
répertoire :
VERSION=v0.1NAME=jdumpertoolsTARFILE=$(NAME)-$(VERSION).tar.gz/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
Normalement le tar
Le fichier contient des scripts et du code source que vous compilerez dans le cadre du processus d'empaquetage.
Ensuite, créez un RPM spécification
dossier. Encore une fois, rpmdevtools
fournit une longueur d'avance, comme ceci :
$ rpmdev-newspec ~/rpmbuild/jose-package.spec/home/josevnz/rpmbuild/jose-package.spec créé ; Type Minimal, RPM Version> =4.16. $ Cat ~ / RPMBUILD / JOSE-PACKAGE.Specname:Jose-PackageVersion:Release:1% {? Dist} Résumé:Licence:URL:Source0:BuildRequires:Exige:% Description% Prep% autosetup%build%configure%make_build%installrm -rf $RPM_BUILD_ROOT%make_install%files%license add-license-file-here%doc add-docs-here%changelog* Sun Oct 03 2021 Jose Vicente Nunez -
Ne vous inquiétez pas si vous n'arrivez pas à donner un sens à ce fichier maintenant. Copiez le jdumpertools.spec
dans le fichier ~/rpmbuild/SPECS
répertoire :
$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS
Et créez une source et un fichier RPM binaire :
$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.specsetting SOURCE_DATE_EPOCH=1609718400Exécution(%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[...]Vérification de fichier(s) décompressé(s) :/usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64Écrit :/home/josevnz/rpmbuild/SRPMS/jdumpertools-v0. 1-1.fc33.src.rpmÉcrit :/home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpmExécution (%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++ travaux -p+ sortie 0
Le résultat final est deux fichiers :un RPM source et un RPM binaire.
Écrit :/home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpmÉcrit :/home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1. fc33.x86_64.rpm
Que se passe-t-il lors d'une installation RPM
Que se passe-t-il lorsque vous installez chacun de vos RPM personnalisés ?
- L'installation du RPM source crée le
tar
fichier et laspécification
fichier dans votrerpmbuild
annuaire. Cela vous permet de recompiler l'application, d'apporter des correctifs au RPMspec
fichier, etc.$ ls rpmbuild/{SPECS,SOURCES}rpmbuild/SOURCES:jdumpertools-v0.1.tar.gzrpmbuild/SPECS:jdumpertools.spec
- Si vous installez le RPM binaire, vous installez en fait l'application :
$ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpmVerifying ... ################ [100 %]Préparation... ################ [100 %]Mise à jour / installation ... 1:jdumpertools-v0.1-1.fc33 ################ [100 %]
:Apache License 2.0Signature :(none)Source RPM :jdumpertools-v0.1-1.fc33.src.rpmBuild Date :Sun 03 Oct 2021 06:27:11 PM EDTBuild Host :dmaf5.homeURL :https://github. com/josevnz/jdumpertoolsSummary :programmes pouvant être utilisés pour vider les données d'utilisation de Linux au format JSON. Commande 'du'.* jutmp :dumper de la base de données UTMP
Remarque :Les lecteurs curieux ont probablement ouvert le Makefile
et j'ai vu une cible appelée rpm
:
rpm :tous 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
C'est un raccourci pratique pour préparer un rpmbuild
bac à sable, tar
fichiers après leur compilation avec make
, et empaquetez-les en utilisant le rpmbuild
commande. N'hésitez pas à appeler make rpm
et voyez ce qui se passe.
[ Obtenez plus de conseils en téléchargeant l'aide-mémoire pour les scripts shell bash. ]
Je vous ai montré les commandes et les outils utilisés pour générer les fichiers RPM, mais maintenant il est temps d'écrire le RPM spécification
fichier.
Créer un fichier de spécification pour les outils jdumper
Travailler avec des fichiers de spécification nécessite de remplir plusieurs balises de métadonnées ainsi que de décrire comment vous allez compiler ou empaqueter l'application. Jdumpertools
est une simple application ANSI C, donc décompressez les sources, compilez-les, copiez-les dans une zone intermédiaire (~/rpmbuild/BUILDROOT
), puis conditionnez-les pour la distribution.
Tout d'abord, jetez un œil au fichier de spécification RPM :
Nom : jdumpertools# À FAIRE :Trouvez un meilleur moyen de mettre à jour la version ici et sur MakefileVersion : v0.1 Version : 1 %{?dist}Résumé : Programmes pouvant être utilisés pour vider les données d'utilisation de Linux dans JSON format. Licence : Licence Apache 2.0URL : https://github.com/josevnz/jdumpertoolsSource0 : %{name}-%{version}.tar.gzBuildRequires : bash,tar,gzip,rpmdevtools,rpmlint,make,gcc>=10.2. 1Nécessite : bash%global debug_package %{nil}%descriptionJdumpertools est un ensemble de programmes que vous pouvez utiliser pour vider les données d'utilisation de Linux au format JSON afin qu'elles soient ingérées par d'autres outils.* jdu :similaire à la commande UNIX 'du'.* jutmp :UTMP dumper de base de données%prep%setup -q -n jdumpertools%buildmake all%installrm -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}% cleanrm -rf %{buildroot}%files%{_bindir}/jdu%{_bindir}/jutmp%{_libdir}/libjdumpertools.so%license LICENSE%doc README.md%changelog* Lundi 4 janvier 2021 Jose Vicente Nunez - 0.1- Première version en cours de package
Passez en revue ce qui est important ici :
- Les métadonnées, y compris la version, le nom et Source0 ; vous pouvez utiliser des variables ou des macros
- Décompressez les sources dans le
%prep
section en utilisant la%setup
macro (le guide RPM contient de nombreux détails sur les drapeaux) - BuildRequires :Vous devez lister les dépendances dont vous avez besoin pour construire le package. Ceux-ci ne peuvent pas être détectés dynamiquement.
- %build section :Compiler avec
make
- %installer section :Copiez ce dont vous avez besoin pour que le programme fonctionne (programme, bibliothèques, etc.)
- %fichiers section :où vous pouvez spécifier si un fichier est un document (%doc ), fichier de licence (% licence ), ou un fichier normal
Important également :
- J'ai désactivé la création de code de débogage lors de l'empaquetage avec
%global debug_package %{nil}
. - Le
journal des modifications
documente ce qui a changé avec cette nouvelle version du package.
Vérifiez les erreurs dans le fichier de spécification avec rpmlint
Vous ne voulez pas découvrir à vos dépens que votre RPM n'est pas parfait. Par conséquent, il est bon de vérifier les erreurs évidentes ou les moyens d'améliorer vos RPM :
$ sudo dnf install rpmlint
Vérifiez maintenant le RPM spécification
fichier :
$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec /home/josevnz/rpmbuild/SPECS/jdumpertools.spec :W :URL invalide Source0 :packages jdumpertools-v0.1.tar.gz0 et 1 specfiles vérifiés ; 0 erreurs, 1 avertissements.
La documentation rpmlint indique que Source0 doit être une URL bien définie (la valeur doit être une URL HTTP, HTTPS ou FTP publique valide). Ne vous inquiétez pas de cet avertissement.
Qu'en est-il du RPM lui-même ?
$ make rpm...$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpmjdumpertools.x86_64:W:summary-ended-with-dot C Programmes pouvant être utilisés pour vider les données d'utilisation de Linux au format JSON.jdumpertools.x86_64 :W :orthographe-erreur %description -l en_US du -> dew, doe, Dujdumpertools.x86_64 :E :description-line-too-long C Jdumpertools est une collection de programmes qui peuvent être utilisés pour vider les données d'utilisation de Linux au format JSON, afin qu'elles puissent être ingérées par d'autres outils. fc33', 'v0.1-1']jdumpertools.x86_64 :W :licence non valide Apache License 2.0jdumpertools.x86_64 :W :binaire non dépouillé ou objet /usr/bin/jdujdumpertools.x86_64 :W :binaire non dépouillé -or-object /usr/bin/jutmpjdumpertools.x86_64 : W :unstripped-binary-or-object /usr/lib64/libjdumpertools.sojdumpertools.x86_64 : W :no-soname /usr/lib64/libjdumpertools.sojdumpertools.x86_64 : W :no-manual-page-for-binary jdujdumpertools.x86_64:W:no-manual-page-for-binary packages jutmp1 et 0 specfiles vérifiés ; 1 erreurs, 10 avertissements.
Dix avertissements et une erreur. Certains sont faciles à corriger :
- La licence doit être d'un format spécifique
- Les pages de manuel sont nécessaires pour les programmes, j'en ai donc écrit une très simple avec troff
- Inclure le soname dans la bibliothèque
Après les correctifs, il ne reste qu'un seul avertissement :
$ make rpm...$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm jdumpertools.x86_64 :W :erreur d'orthographe %description - l en_US du -> dew, doe, DuLa valeur de cette balise semble être mal orthographiée. Veuillez revérifier.
Cet avertissement vous avertit que le mot du
semble mal orthographié. Il s'agit simplement d'une référence à une commande valide, vous pouvez donc ignorer l'avertissement.
Maintenant, mettez à niveau le RPM avec la version améliorée :
$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
J'utilise le rpm
commande pour rendre plus évident que j'ai mis à niveau le package à partir d'une version de disque local au lieu d'une nouvelle version à partir d'un référentiel. Si vous préférez, vous pouvez faire la même chose avec dnf
:
$ sudo dnf install --upgrade \~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
Ce que vous avez appris et la suite
Un logiciel d'empaquetage avec RPM semble intimidant au premier abord, mais avec un peu de patience, vous y arriverez en un rien de temps. Lorsque vous rencontrez des problèmes, vous trouverez également des moyens appropriés d'améliorer votre code. Vous trouverez ci-dessous quelques ressources et recommandations finales :
- Faites-vous plaisir et procurez-vous un exemplaire du RPM Packaging Guide écrit par Adam Miller, Maxim Svistunov et Marie Doleželová. Il est très complet et bien organisé. Sérieusement, faites-le maintenant; c'est si bon.
- Le guide officiel d'empaquetage RPM et le guide Fedora RPM sont également pleins de détails ; gardez-les dans un signet.
- Utilisez rpmlint. Vous serez surpris du nombre de petites choses que vous pouvez détecter et corriger avant d'expédier vos packages RPM.
- Pas assez ? Fedora propose une liste d'astuces que vous pouvez utiliser lors de l'empaquetage de logiciels.
- Toujours curieux ? Vous devriez certainement jeter un coup d'œil aux directives d'empaquetage RPM.