Comment utiliser FPM pour créer facilement des packages dans plusieurs formats

introduction

Les formats de packaging utilisés par différentes distributions de Linux peuvent constituer un problème pour les développeurs de logiciels souhaitant publier leurs projets de manière facilement consommable. Debian et Ubuntu s’appuient sur les paquets + .deb +, tandis que Fedora et RedHat utilisent tous deux des systèmes de packaging de style + .rpm +. Ceux-ci sont incompatibles et les outils nécessaires pour les créer peuvent être assez difficiles à utiliser pour ceux qui ne sont pas familiers avec les excentricités de chacun.

Alors que les responsables de paquet pour les distributions font le gros du travail pour les paquets inclus dans les référentiels officiels, si vous envisagez de publier des logiciels pour ces distributions sur votre propre site ou devez créer des paquetages pour votre organisation, vous voudrez généralement les fournir vous-même. Cela impliquait traditionnellement d’apprendre le fonctionnement d’au moins quelques outils pour chacune des familles d’emballages.

Pour minimiser les complications de ce processus, un outil appelé + fpm + a été créé. Avec + fpm, vous pouvez facilement créer les fichiers` + .deb` et + .rpm sans avoir à connaître les commandes des outils de packaging qu’il utilise. Dans ce guide, nous verrons comment utiliser + fpm + pour créer des paquets de formats différents en utilisant un serveur Ubuntu 14.04.

Installation de FPM

La méthode principale de distribution de l’outil + fpm + lui-même est celle d’une gemme Ruby. Nous pouvons préparer notre système à installer + fpm + en installant à la fois les packages de développement Ruby et les outils de création de logiciels nécessaires à la compilation de logiciels supplémentaires.

Commencez par mettre à jour votre cache de paquet local, puis procédez aux installations prérequises:

sudo apt-get update
sudo apt-get install ruby-dev build-essential

Une fois les packages ci-dessus installés, vous pouvez acquérir le package + fpm + lui-même en tapant:

sudo gem install fpm

Ceci installera + fpm + au niveau du système et le rendra disponible à tout utilisateur du système. Il est recommandé de créer des packages en tant qu’utilisateur normal, non root. Ceci est plus sûr en cas d’erreur d’emballage pouvant affecter votre système.

Vous devriez maintenant avoir l’exécutable + fpm + disponible sur votre système. Vous pouvez le vérifier en consultant les informations d’aide abondantes de l’outil:

fpm --help
Intro:

 This is fpm version 1.2.0

 If you think something is wrong, it's probably a bug! :)
 Please file these here: https://github.com/jordansissel/fpm/issues

 You can find support on irc (#fpm on freenode irc) or via email with
 [email protected]

Usage:
   fpm [OPTIONS] [ARGS] ...
. . .

Vous pouvez maintenant commencer à construire des packages.

Familiarisation avec les fonctionnalités de base de FPM

L’outil + fpm + est assez efficace pour vous dire ce dont il a besoin pour compléter la construction d’un paquet. Pour avoir une idée des exigences les plus élémentaires, vous pouvez appeler la commande sans argument:

fpm
Missing required -s flag. What package source did you want? {:level=>:warn}
Missing required -t flag. What package output did you want? {:level=>:warn}
No parameters given. You need to pass additional command arguments so that I know what you want to build packages from. For example, for '-s dir' you would pass a list of files and directories. For '-s gem' you would pass a one or more gems to package from. As a full example, this will make an rpm of the 'json' rubygem: `fpm -s gem -t rpm json` {:level=>:warn}
Fix the above problems, and you'll be rolling packages in no time! {:level=>:fatal}

Cette sortie nous indique les bases de ce que nous devons fournir pour créer un paquet. Un appel typique ressemblera à ceci dans sa forme de base:

fpm -s  -t

La source peut être de plusieurs types. Le type de source dictera également la manière dont le nom ou l’emplacement de la source est passé à la commande. Nous discuterons des formats d’entrée et de sortie possibles dans la section suivante.

Certains formats nécessiteront des utilitaires auxiliaires supplémentaires associés au type de package individuel à installer pour la conversion. Puisque nous avons déjà installé Ruby essentials afin de faire fonctionner + fpm + et que nous utilisons un système Ubuntu, il devrait être possible de convertir un fichier gem Ruby en un paquet + .deb +.

Choisissons une gemme couramment utilisée, comme + bundler +. Nous pouvons créer un package + .deb + à partir du package + bundler + situé sur rubygems.org en tapant:

fpm -s gem -t deb bundler
Created package {:path=>"rubygem-bundler_1.6.5_all.deb"}

Un fichier appelé + rubygem-bundler_1.6.5_all.deb + a été créé dans le répertoire local (votre numéro de version peut être différent). Nous pouvons maintenant installer ceci comme n’importe quel autre paquetage + .deb +:

sudo dpkg -i rubygem-bundler_1.6.5_all.deb

Lorsque vous vérifiez la liste des gems installés, vous verrez que nous avons maintenant un bundle disponible:

gem list
*** LOCAL GEMS ***

arr-pm (0.0.9)
backports (3.6.0)

cabin (0.6.1)
childprocess (0.5.3)
clamp (0.6.3)
ffi (1.9.3)
fpm (1.2.0)
json (1.8.1)

Nous aurions tout aussi bien pu utiliser un format de source ou de sortie différent, mais ceux-ci nécessitent des outils supplémentaires sur notre système pour convertir les formats. Nous en discuterons plus tard.

Formats source et cible

L’outil + fpm + peut fonctionner avec plusieurs formats source et cible différents. Celles-ci ont chacune leurs propres exigences et fonctionnalités.

Dans le cas où il existe un index de package en ligne relativement standard pour un format (tel que rubygems.org pour les fichiers de gem Ruby), + fpm + est capable de rechercher automatiquement l’index et de télécharger les fichiers nécessaires. Il recherchera d’abord une correspondance dans le répertoire actuel, puis recherchera dans l’index si aucune correspondance locale n’est trouvée.

Les types de sources suivants sont actuellement pris en charge:

Source Type Source Description How to Pass Source Name or Location Additional Packages Needed

dir

Directory or files

Pass the absolute or relative path(s) of the project files on the local filesystem.

(none)

tar

A tarball source package

Pass the path to the location of the tarball (compressed or uncompressed) on the local filesystem.

(none)

gem

A Ruby gem

Pass the name of a Ruby gem that can be find on www.rubygems.org. It will be auto-downloaded to create the package.

ruby, rubygems-integration

python

A Python package

Pass the name of a Python package as you would pass it to easy_install. Names are searched for in the Python Package Index and auto-downloaded to create the package.

python-setuptools

pear

A PHP extension

Pass the name of a PHP extension or application found on pear.php.net. The appropriate files will be auto-downloaded when creating the package.

php-pear

cpan

A Perl module

Pass the name of a Perl module as found at cpan.org. The files will be auto-downloaded and used to build the package.

cpanminus

zip

A zipped directory structure

Pass the location on the local filesystem of a zip file containing the package.

zip

npm

A Node.js module

Pass the name of a Node module as specified on npmjs.org. The package will be auto-downloaded and used to make the output package.

npm

osxpkg

An OS X package

Pass the location on the local filesystem of an OS X package (this will only work on OS X systems with pkgbuild in their path).

pkgbuild (only available for OS X systems)

empty

(no source)

Used to create a package without any actual packages. This is used most often for meta-packages that only contain dependencies.

(none)

deb

A .deb package

Pass the location of a .deb file on the local filesystem.

(none on Debian-based systems)

rpm

An .rpm package

Pass the location of an .rpm file on the local filesystem.

rpm

Il existe également de nombreuses options pour les formats d’emballage cible que vous souhaitez créer. Le tableau ci-dessous décrit certaines des différentes options:

Output Type Output Description Additional Packages Needed

deb

A Debian-style package that can be installed on Debian or Ubuntu systems.

(none on Debian-based systems)

rpm

A RedHat-style package that can be installed on CentOS, Fedora, or RedHat systems.

rpm

zip

A zip file containing the directory and file structure of the input package.

zip

tar

A tarball (compressed or uncompressed) of the directory structure of the input package.

(none)

dir

A directory in which to extract the inputted package.

(none)

sh

A self-extracting .sh file. This is a shell script with a bzipped tar file that will be extracted when run.

(none)

osxpkg

A package file for OS X. You must be working on an OS X installation with pkgbuild installed to create these packages.

pkgbuild (only available for OS X systems)

solaris

A package suitable for installing on a Solaris system. You must have pkgproto and pkgmk installed, which are only available on Solaris machines.

pkgproto, pkgmk (only available on Solaris systems)

pkgin

A package suitable for installing on BSD systems. You must have the pkg_create package installed, which is only available on BSD systems.

pkg_create (only available on BSD systems)

puppet

A puppet module that can be used to install on various systems. ().

(cannot test in non-working state)

Comme vous pouvez le constater, certains formats pour les spécifications source et cible exigent que vous utilisiez un système d’exploitation spécifique. Comme nous présentons cet outil sur Ubuntu 14.04, les formats de source + osxpkg + et les formats de sortie + osxpkg +, + solaris + et `+ pkgin + 'ne seront pas disponibles.

Modification du comportement de FPM avec des options

En utilisant les informations des tableaux de la section ci-dessus, vous devriez pouvoir créer des packages de base en utilisant les paramètres par défaut + fpm +. Cependant, la plupart du temps, vous souhaiterez fournir des informations supplémentaires afin de mettre en forme le package résultant.

Les options doivent être spécifiées avant les arguments source qui spécifient l’emplacement ou le nom du package d’origine.

Il y a many différentes options disponibles pour + fpm +. Nous ne couvrirons que quelques-uns des plus courants ci-dessous. Pour une liste complète, consultez la commande + fpm --help +.

Voici quelques options courantes que vous voudrez peut-être utiliser:

  • * -C *: spécifiez un répertoire à modifier avant de rechercher des fichiers.

  • * –Prefix *: chemin d’accès au répertoire spécifiant l’emplacement d’installation des fichiers du package résultant.

  • * -p *: nom et chemin du paquet. Cela peut remplacer le nom de fichier du fichier de package résultant.

  • * -n *: nom que vous souhaitez utiliser pour le package. C’est le nom affiché dans les outils de packaging de votre plate-forme.

  • * -v *: Le numéro de version que vous souhaitez utiliser pour votre paquet.

  • * –Iteration *: informations de version pour le package. Le nom de la distribution pour ce numéro varie, mais il s’agit généralement d’un moyen de suivre la version du package, par opposition à la version de l’application.

  • * –License *: nom de la licence du package. Cela inclura le type de licence dans les métadonnées du package, mais n’inclura pas le fichier de licence associé dans le package lui-même.

  • * –Category *: La catégorie à laquelle appartient ce paquet. Ceci peut être utilisé pour organiser le paquet dans les dépôts.

  • * -d *: Ceci peut être utilisé plusieurs fois pour spécifier les dépendances du paquet.

  • * –Provides *: Ceci peut être utilisé pour spécifier la fonctionnalité système fournie par ce paquet. Ceci est généralement utilisé quand il y a plus d’un choix pour répondre à une exigence.

  • * –Conflicts *: Utilisé pour spécifier les packages qui ne doivent pas être installés.

  • * –Replaces *: Utilisé pour spécifier les packages à supprimer lors de l’installation de ce package.

  • * –Config-files *: Utilisé pour marquer les fichiers du paquet en tant que fichiers de configuration. Généralement, les gestionnaires de paquets les laisseront intacts lors de la suppression du paquet.

  • * –Directories *: Marque un répertoire comme appartenant au paquet.

  • * -a *: spécifiez l’architecture du package.

  • * -m *: écrase le champ responsable de la maintenance du paquet. Par défaut, ceci utilisera + username @ host + pour ce champ.

  • * -e *: Consultez et modifiez manuellement le fichier de spécifications avant de générer le paquet. Ceci peut être utilisé pour modifier n’importe lequel des paramètres par défaut utilisés pour les spécifications du paquet.

  • * –Description *: Définissez la description du package.

  • * –After-install *, * –before-install *, * –after-remove *, * –before-remove *: Fichiers de script à exécuter au moment opportun.

Il existe également de nombreuses options spécifiques aux formats de conditionnement que vous sélectionnez. Pour une liste complète, consultez l’aide.

Personnalisation des packages

Si vous souhaitez personnaliser davantage de détails et ne souhaitez pas la traduction directe d’un format dans votre format de sortie, vous devrez peut-être adopter un flux de travail différent.

Ce processus reflètera un peu plus étroitement les emballages traditionnels, mais apportera également les avantages de pouvoir produire rapidement plusieurs formats de sortie. Nous pouvons illustrer le processus général ci-dessous, en supposant que l’application en question utilise les processus de compilation et d’installation +. / Configure +, + make +, + + make install + `standard.

Pour commencer, installez toutes les dépendances dont vous avez besoin pour le paquet. Ensuite, récupérez le paquet source du projet sur son site Web et placez-le dans un répertoire de travail:

mkdir ~/build
cd ~/build
wget

Maintenant, vous pouvez extraire le fichier et le changer dans le répertoire résultant:

tar xzvf .tar.gz
cd

Dans ce répertoire, vous aurez les fichiers source de l’application que vous souhaitez empaqueter. Vous avez maintenant la possibilité d’affiner les fichiers et de configurer certaines options.

La manière habituelle de spécifier des options pendant le processus de construction consiste à utiliser le script +. / Configure + inclus. Consultez la documentation du projet pour connaître les options de compilation disponibles. Vous pouvez les spécifier en appelant le script + configure + avec vos options:

./configure --= --= -- ...

Cela créera ou modifiera les fichiers lus par la commande + make + lors de la construction du paquet. Nous pouvons maintenant créer les fichiers d’installation réels en tapant:

make

Au lieu d’installer ces fichiers que nous avons configurés sur notre système, nous les installerons dans un répertoire factice vide dans lequel nous pourrons construire un vrai paquet. Créez un répertoire pour installer le paquet sur:

mkdir -p /tmp/

Nous pouvons étiqueter ce nouveau répertoire comme emplacement d’installation racine en passant l’option + DESTDIR + à + ​​make install +:

make DESTDIR=/tmp/ install

Notre paquet a maintenant été installé proprement dans un répertoire squelette vide. Il a créé toute la structure de répertoire nécessaire, mais il n’y a rien de non lié au paquet dans ce répertoire.

C’est votre deuxième occasion de personnaliser votre configuration. Si vous souhaitez inclure des fichiers supplémentaires dans la hiérarchie pour l’installation, vous pouvez maintenant les ajouter à l’emplacement approprié dans cette structure.

Lorsque vous êtes prêt, vous pouvez utiliser + fpm + pour créer le fichier de package approprié. Par exemple, nous pouvons transmettre des informations de version et une description du paquet dans notre commande + fpm +. Nous pourrions également lister les informations de dépendance ou donner des détails supplémentaires qui affecteront la création des méta-fichiers de packaging.

Nous pouvons utiliser la structure de répertoires pour créer plusieurs formats d’emballage. Par exemple, nous pourrions alors créer un paquetage + .deb + en tapant:

fpm -s dir -t deb -C /tmp/ --name  --version  --iteration  --depends  --description "A sample package" .

Cela créera un paquet nommé + nom-projet_1.0.0-1_amd64.deb + dans le répertoire actuel.

Vous pouvez ensuite modifier quelques options pour créer un package + .rpm + (en supposant que vous ayez installé le package + rpm + à partir des référentiels):

fpm -s dir -t  -C /tmp/project --name project_name --version 1.0.0 --iteration 1 --depends  --description "A sample package" .

Cela créera un paquet nommé + nom_projet-1.0.0-1.x86_64.rpm + dans votre répertoire actuel.

Comme vous pouvez le constater, il est assez facile de créer des paquets personnalisés avec + fpm +. La plupart des tâches difficiles sont toujours prises en charge par l’outil.

Conclusion

Utiliser + fpm + peut vous simplifier la vie lorsque vous tentez de créer des packages à utiliser sur votre infrastructure ou que vous distribuez des packages de votre projet téléchargeables publiquement. Bien que cela ne soit peut-être pas la solution idéale pour l’emballage des dépôts d’une distribution réelle en raison de problèmes de politique générale, ses avantages sont intéressants dans de nombreux scénarios.

Related