easyfpm

Methods and scripts for those who want to use fpm to make scripts packages

The aim of easyfpm is to facilitate the work of administrators and permit to deliver their scripts as packages.

help of the script

this is given by --help parameter

Usage easyfpm [options]
        --config-file [string]       Configuration file's path
                                      (can be declared multiple times, declarative order is priority order)
        --label [list by comma]      Labels to work with
                                      (can be declared multiple times)
        --pkg-name [string]          Package name
        --pkg-type [string]          Package type
        --pkg-version [string]       Package version, example 1.0
        --pkg-src-dir [string]       Package source dir
        --pkg-mapping [string]       Package install map file
        --pkg-prefix [string]        Package installation prefix
        --pkg-output-dir [string]    Destination dir for packages
        --pkg-description [string]   Package description
        --pkg-arch [string]          Package architecture
        --pkg-content [string]       source elements to package
        --pkg-user [string]          Owner of package's elements
        --pkg-group [string]         Group of package's elements
        --template-activated [yes|no]
                                     Activate fpm templating mode
        --template-value [string key:value]
                                     Couple key:value for fpm templating
        --pkg-preinst [string]       Path to pre-install package script
        --pkg-postinst [string]      Path to post-install package script
        --pkg-prerm [string]         Path to pre-delete package script
        --pkg-postrm [string]        Path to post-delete package script
        --pkg-iteration [string]     Package iteration
        --pkg-epoch [integer]        Package epoch value
        --easyfpm-pkg-changelog [string]
                                     Path to an easyfpm format changelog file
        --pkg-vendor [string]        Package vendor name
        --pkg-url [string]           Package vendor url
        --pkg-license [string]       Package license
        --pkg-config-files [string]  Files or directories considered as conf in the targeted OS
                                      (can be declared multiple time)
        --pkg-depends [string]       Package dependancie
                                      (can be declared multiple times)
        --pkg-suffix [string]        Package suffix
        --pkg-changelog [string]     Package changelog (in the wanted format for the package)
        --pkg-force [yes|no]         Force package generation even if the same name exists
        --pkg-category [string]      Category for this package
        --pkg-provides [string]      A tag of what provides this package
                                      (can be declared multiple times)
        --pkg-conflicts [string]     Other packages that conflict with that one
                                      (can be declared multiple times)
        --pkg-recommends [string]    Other package to recommend
                                      (can be declared multiple times)
        --pkg-suggests [string]      Other package to suggests
                                      (can be declared multiple times)
        --pkg-directories [string]   Mark recursively a directory on the targeted system as being owned by the package
                                      (can be declared multiple times)
        --pkg-maintainer [string]    The maintainer of this package
        --pkg-compression [string]   The compression to use with this package (may not be possible)
        --pkg-priority [string]      The package 'priority' (depends of the targetted package type
        --pkg-replaces [string]      Other packages this package replace
                                      (can be declared multiple times)
    -v, --verbose                    Verbose mode
        --debug                      Debug mode
    -n, --dry-run                    Do not exec fpm, juste print what would be done
        --version                    Display version and quit
        --label-list                 Display the availables labels and quit
        --help                       Display help and quit

Example of config file

this config file can be found in easyfpm/doc/samples/easyfpm.cfg

#############################
# easyfpm sample conf
#############################

#
# All of these parameters can be overloaded on command-line with --key value
# Example : --pkg-name easyfpm
#
# All the params with an uniline value (see fpm doc) can be templated on this script with {{key}}
# Example : pkg-mapping={{pkg-src-dir}}/_easyfpm/mapping.conf
#

#
# For each couple value key, the priority for value is :
# 1) the --key value given in command line
# 2) the key=value present in a [section]
# 3) the key=value in global section (before any [section] declaration)
#

#
# Package name
pkg-name=easyfpm

#
# Description
#
pkg-description="Tool wrapper for fpm"
pkg-description="aimly used to packages scripts"

#
# Package metadata
#
pkg-vendor=Erwan SEITE
pkg-url=https://github.com/wanix/easyfpm
pkg-licence=GPLv2


#
# Root dir for target system
# Default : /
#
pkg-prefix=/usr/local

#
# Source directory
#  If --pkg-src-dir is given on command line, this value has no effect
#pkg-src-dir=

#
# aimed arch
# 
pkg-arch=all

#
# If pkg-mapping is given, pkg-content has no effect, see the mapping example
#
#pkg-mapping={{pkg-src-dir}}/_easyfpm/mapping.conf

#
# user or group for the packaged file
#  They MUST exists on the host which make the package
#  default by fpm : root
#pkg-user=myname
#pkg-group=mygroup

#
# If template-activated is "yes", fpm will manage its templating (it is not the easyfpm one !)
template-activated=no

#
# See fpm doc for templating use in your packages' scripts
#template-value=oracle_group=dba

#
# Packages scripts if needed, see samples
#
#pkg-preinst={{pkg-src-dir}}/_easyfpm/pre-install.sh
#pkg-postinst={{pkg-src-dir}}/_easyfpm/post-install.sh
#pkg-prerm={{pkg-src-dir}}/_easyfpm/pre-delete.sh
#pkg-postrm={{pkg-src-dir}}/_easyfpm/post-delete.sh


#
# Package version
#  Given by command line for my use
#pkg-version=

#
# See fpm doc for this two values
#
pkg-iteration=1
#pkg-epoch=0


#
# If easyfpm-pkg-changelog is given AND pkg-changelog is not for a package generation,
# then easyfpm will generate a changelog in the format waited by the package (easyfpm-tranlatecl)
# The easyfpm changelog have a simple specific format (aim : administrators who make scripts)
easyfpm-pkg-changelog={{pkg-src-dir}}/changelog


#
# Which files can be seen as conf file on the target system
#
pkg-config-files={{pkg-prefix}}/MONMODULECLIENT/cfg


#############################
# Specific sections
#############################
#
# With the command line, you can make only the wanted sections with --label
# Example: --label debian6 --label debian7
# By default, easyfpm make all sections given


[debian6]
#Specific section for debian (the name I choose, not asked by easyfpm)

#
# Package type
#
pkg-type=deb

#
# Dependancies
pkg-depends=ruby1.9.1
pkg-depends=libruby-unixconfigstyle >= 1.0.0
pkg-depends=libruby-ptools >= 1.2.4
pkg-depends=libruby-fpm >= 1.1.0

#
# Suffix in the package name (concat with iteration for fpm)
#
pkg-suffix=-squeeze

[debian7]
#For Debian7 (not the same ruby name in depends)
pkg-type=deb
pkg-depends=ruby >= 1.9.1
pkg-depends=libruby-unixconfigstyle >= 1.0.0
pkg-depends=libruby-ptools >= 1.2.4
pkg-depends=libruby-fpm >= 1.1.0
pkg-suffix=-wheezy

Example of mapping file

this config file can be found in esasyfpm/doc/samples/easyfpm.cfg

#
# This is a mapping sample
#
# source file (root dir is pkg-src-dir) => destination (root dir is pkg-prefix)
#

#This example suppose we want to package an apache specific configuration
# Tree on dev
# myapp
#   conf.d/myapp.conf
#   site/<php code>
#   doc
# 
# the pkg-source-dir is /home/packager/retrieve/myapp
# the pkg-prefix is /

conf.d/myapp.conf => etc/apache2/site-available/myapp.conf
site => app/httpd/www/myapp
doc => usr/share/doc/myapp

Example of use

This tool can be used to make multiple packages in one shot. I made for my company a wrapper which get a module in our CSV, look for an _easyfpm dir an then execute easyfpm with _easyfpm/easyfpm.cfg as config file.

consider the following module:

ExampleModule
  |
  ---> _easyfpm
        |
        ---> easyfpm.cfg
        ---> mapping_exampleModule.conf
        ---> pre-install.sh
        ---> post-delete.sh
        ---> post-install.sh
  ---> bin
        |
        ---> EM_doMyJob.sh
        ---> EM_verifyIt.sh
  ---> cfg
        |
        ---> EM_doMyJob.conf
  ---> cron.d
        |
        ---> EM_doMyJob

To deploy this module, I want to verify the existence of user exmoduser and create it if it not exists.This is done by pre-install.sh To uninstall this module, I delete all the files from it and remove the user exmoduser. This last action is done by post-delete.sh.

I want to deploy bin/.sh in /exploit/bin/ I want to deploy cfg/.conf in /exploit/cfg/ I want to deploy cron.d/* in /etc/cron.d/ This mapping is done by mapping_exampleModule.conf

I want the file deployed in bin to be executable and owned by exmoduser and the config files in /exploit/cfg/ should be readable by exmoduser, this is done by post-install.sh

The wrapper is easy to use for admins, they launche on the build machine the following command:

makePackage --module ExampleModule --version 1.0

this command get the tag 1.0 of module ExampleModule on our git server an after launch easyfpm with a command like this : easyfpm --config-file /packaging/cfg/makepackages/default-easyfpm.conf --config-file /packaging/tempodata/ExampleModule/_easyfpm/easyfpm.cfg --pkg-src-dir /packaging/tempodata/ExampleModule --pkg-version 1.0 --pkg-output-dir /packaging/output

After few seconds, we have 5 new packages generated in /packaging/output:

  • ExampleModule_1.0-1_all-squeeze.deb
  • ExampleModule_1.0-1_all-wheezy.deb
  • ExampleModule-1.0-1.el5.noarch.rpm
  • ExampleModule-1.0-1.el6.noarch.rpm
  • ExampleModule-1.0-1.el7.noarch.rpm

Projects using easyfpm: