19.012012

Paketerzeugung vereinheitlicht: fpm

Überblick

fpm bemüht sich, ein altes Dilemma der vernünftigen Systemadministration an der Wurzel zu packen, und systematisch zu lösen: Es muss ad hoc Software installiert werden – am besten gestern – für die kein Paket für das Zielsystem existiert.

Für jedes Zielsystem sind dabei andere Werkzeuge mit unterschiedlichen Optionen zu benutzen, um wirklich ein sauberes Paket zu erstellen.

Für fpm stehen zwei Dinge orthogonal zueinander: Zu packende Quellen und das Paketformat.

  • Quellen
    1. Verzeichnisse
    2. Dateien
    3. Ruby-Gems
    4. Pythonmodule
    5. RPMs
    6. npm install
    7. tar-Archive
  • Paketformate
    1. DEBs
    2. RPMs
    3. Puppet
    4. Solaris

Mit mehr als siebzig Forks auf github und regelmäßigen Einbindungen von Mergeanfragen ist fpm ein Projekt, dass lebendig genug erscheint, dass man bei eigenen Pakete erstellenden Projekten/Notwendigkeiten darauf zurückzugreifen ernsthaft in Betracht ziehen sollte; eigene Bugfixes werden nicht im Nirvana verschwinden.

Installation

fpm ist in Ruby geschrieben, und kann als Gem installiert werden. Hier wär es sicher ganz schön, wenn fpm auf sich selber losgelassen würde und Pakete für einige der gängigsten Systeme zur Verfügung stünden.

gem install fpm

Anwendung

Leider und natürlich wird es fast immer nötig sein, spezielle Scripte und Pfade für unterschiedliche Zielsysteme angeben zu müssen -- d.h. der Wechsel des Zielsystems ist nicht mit einem Ändern des -t Parameters getan. Allerdings muss man sich keine verrückten Paketverwaltungssyntaxen mehr merken.

fpm läßt sich leichter automatisieren, als die Sammlung der dahinter liegenden systemspezifischen Werkzeuge.

Node Pakete, per npm install, lassen sich mit fpm-npm packen -- warum hier nicht -s npm ausreicht, ist wohl ein Geheimnis des Autors – ich hätte es schöner gefunden, die npm/json-Magie wäre vor mir versteckt und die Häßlichkeit der unterschiedlichen Behandlung von npm install und den anderen Quelltypen würde nicht auf der Kommandozeile sondern in fpm liegen.

Abstraktion

fpm bietet folgende Optionen an, die vom gewünschten Paketformat unabhängig sind, so dass "das richtige passiert"™:

  • -p, –package PACKAGEFILE The package file to manage
  • -n, –name PACKAGENAME What name to give to the package
  • -v, –version VERSION version to give the package
  • –iteration ITERATION (optional) Set the iteration value for this package ('release' for RPM).
  • –epoch EPOCH (optional) Set epoch value for this package.
  • -d, –depends DEPENDENCY
  • –category SECTION_OR_GROUP
  • –provides PROVIDES
  • –conflicts CONFLICTS
  • –replaces REPLACES
  • –config-files PATH (optional) Treat path as a configuration file.
  • -a, –architecture ARCHITECTURE
  • -m, –maintainer MAINTAINER
  • –post-install SCRIPTPATH Add a post-install action. This script will be included in the resulting package
  • –pre-install SCRIPTPATH Add a pre-install action. This script will be included in the resulting package
  • –pre-uninstall SCRIPTPATH Add a pre-uninstall action. This script will be included in the resulting package
  • –post-uninstall SCRIPTPATH Add a post-uninstall action. This script will be included in the resulting package
  • –description DESCRIPTION Add a description for this package.
  • –url URL Add a url for this package.

Konkretisierung

Für einige Paketformate stehen spezielle Optionen zur Verfügung:

gem

  • –gem-bin-path DIRECTORY The directory to install gem executables
  • –gem-package-prefix PREFIX Prefix for gem packages
  • –gem-gem PATH_TO_GEM The path to the 'gem' tool (defaults to 'gem' and searches your $PATH)

Pythonmodul

  • –python-bin PYTHON_BINARY_LOCATION The path to the python you want to run. Default is 'python'
  • –python-easyinstall EASY_INSTALL_PATH The path to your easy_install tool. Default is 'easy_install'
  • –python-pypi PYPI_SERVER PyPi Server uri for retrieving packages. Default is 'http://pypi.python.org/simple'
  • –python-package-prefix PREFIX Prefix for python packages

DEBs

  • –deb-ignore-iteration-in-dependencies For = dependencies, allow iterations on the specified version. Default is to be specific.
  • –deb-pre-depends DEPENDENCY Add DEPENDENCY as Pre-Depends.
  • –deb-custom-control FILEPATH Custom version of the Debian control file.

Beispiel: bitlbee

Ich habe BitlBee aus dem Bazaar Repository gebaut und in bitlbee-install installiert. Dies Verzeichnis habe ich in die Datei bitlbee.tar.gz gepackt (tar cfvz ../bitlbee.tar.gz .). Dann kann ich folgendermaßen ein DEB-Paket bauen:

fpm -t deb 
    -n bitlbee 
    -v 3.0.5 
    --iteration 1 
    --config-file /usr/local/etc/bitlbee/bitlbee.conf 
    --config-file /usr/local/etc/bitlbee/motd.txt 
    -m "Tom Regner"
    -a i686 
    -s tar bitlbee.tar.gz

Das entstandene Paket könnte sicher mit noch mehr Informationen gefüllt werden, aber es macht deutlich, wie man fpm benutzen kann.

http://www.joocom.de/blog/wp-content/uploads/wpid-fpm_deb1.png