Bonjour cher lecteur,

Cet article concerne les packageurs, il a pour objectif d'introduire l'API mise en place autour de ce thème.

Problématique

Ne trouvez vous pas que certaines étapes dans le processus de mises à jour des paquets pourrait être automatiser ? Il faut bien reconnaitre qu'il y a un certain nombre de tache commune et répétitives!

  • récupération des sources si elles ne sont pas là
  • récupérer la dernière révision lorsque l'on passe par un cvs
  • les mettres dans une archive .tar.xz
  • faire un fedpkg switch-branch suivis d'un fedpkg pull afin d'etre à jour
  • effectuer un bump de la release
  • ajouter le changelog
  • faire un build local
  • si tout va bien ajouter les sources au repo fedora avec fedpkg new-sources
  • puis faire une construction sur les serveurs fedora

Et enfin soumettre la mise à jour.

En plus certaines étapes sont à refaire pour chaque branche fedora ( f18, f19 … )

Refaites toutes ces étapes pour chaque paquets …

Afin de me faciliter la vie et passer moins de temps sur ce qui est automatisables j'ai conçu une API entièrement en bash pour cette problématique. L'API convient actuellement à mes paquets. J'estime qu'elle couvre par conséquent une bonne partie des paquets de chacun par rapport aux fonctionnalités déjà présente.

Utilisation

$ ./builder.sh -h
builder.sh [options]
    -h --help                                                 Display this message
    -v --verbose                                            Increase the verbosity
    -f --force                                                 Build rpm even package do not get an update
    -l --login                                                  Fas user name ( not used yet )
    -m --mail                                                 Mail to put into changelog
    -n --name                                               Real name to put into changelog
    -f --force <package name>                    Force to build the given package
    -b --branch <script name> <branch>    Specified for a script which branch to use (override branch list)
    --branchList <"branch1 branch2 …">     Global branch list to used
$ ./builder.sh -l bioinfornatics -m 'bioinfornatics at fedoraproject dot org' -n 'Jonathan MERCIER' --branchList 'f18 f19'

builder output

En une seule commande tous mes paquets ont récupérés la dernière version puis si besoin effectuer une construction locale. Si cette entière s'est terminé correctement une compilation sur les serveurs fedora est effectué.

Il est également possible de stocker certain nombre de paramètre dans un fichier de config afin de faciliter la réutilisation. Les chemins qui sont tenté dans l'ordre sont:

  1. $HOME/.config/builder/config
  2. /etc/builder/config

Les paramètres envoyé depuis la ligne de commande écraseront ceux définis dans le fichier de config

Exemple:

[GLOBAL]
name=<real name>
login=<login>
mail=<mail>
branchList=f18 f19
[BRANCH]
ldc=f19
derelict=f18

Principe

Le principe est simple « mettre dans un script bash toutes les commandes que vous réaliser habituellement »

Exemple simple pour le paquet earth-and-moon-backgrounds

#!/usr/bin/env bash
# earth-and-moon-backgrounds
. "$(dirname $0)"/common.sh
declare originalDir sourceFile
 
init 'earth-and-moon-backgrounds'
 
for sourceFile in "${sourcesFiles}"; do
    if [[ ! -f "${sourceFile}" ]] ; then
        curl -s -o "${sourceFile}" http://bioinfornatics.fedorapeople.org/$(basename "${sourceFile}")
    fi
done
 
localBuild
 
remoteBuild
  • On charge la bibliothèque de fonction common.sh
  • Déclaration des variables bash qui vont être utilisé ( c'est plus propres :-) )
  • La fonction init va :
    • Récupérer le dépôt fedora du paquet earth-and-moon-backgrounds si besoin
    • Se mettre dans une branche (f18, f19 …)
    • Récupérer la dernière version de cette dernière
    • Enregistrer dans un tableau sourcesFiles les fichiers sources listé dans le fichier spec
  • Pour chacune des sources. Téléchargement de ces dernières si elles sons pas présentes
  • Construction du paquet sur la machine local via localBuild
  • Si la construction locale du rpm est effectué avec sucés alors la fonction remoteBuild demandera une construction sur les serveurs de fedora

Exemple pour le paquet gtkd

#!/usr/bin/env bash
# gtkd
. "$(dirname $0)"/common.sh
 
declare gtkd_revision alphatag
 
init 'gtkd'
gitGetRepo 'git://github.com/gtkd-developers/GtkD.git'
gitExtractSnapDate
gitExtractRev
gtkd_revision="${revision}"
alphatag="${snapdate}"git"${gtkd_revision}"
 
gitArchive "${package_name}-${alphatag}" "${package_name}-${alphatag}" "${SOURCES}"
 
udpateSpec "Update to rev ${gtkd_revision}"    \
            '%global[[:blank:]]*snapdate[[:blank:]]*(.*)'       "${snapdate}"       \
            '%global[[:blank:]]*gtkd_revision[[:blank:]]*(.*)'  "${gtkd_revision}"
localBuild
 
remoteBuild "Updating to rev ${gtkd_revision}"
  • On charge la bibliothèque de fonction common.sh
  • Déclaration des variables bash qui vont être utilisé ( c'est plus propres :-) )
  • La fonction init va :
    • Récupérer le dépot fedora du paquet gtkd si besoin
    • Se mettre dans une branche
    • Récupérer la dernière version
    • Enregistrer dans un tableau sourcesFileds les fichiers sources listé dans le fichier spec
  • gitGetRepo va récupérer le dépôt gtkd s'il n'existe pas puis récupérer les dernières mise à jour
  • gitExtractSnapDate récupère la date du dernier comit et la stock dans la variable snapdate
  • gitGetRepo va récupérer le dépot gtkd s'il n'existe pas puis récupérer les dernières mise à jour
  • gitExtractRevo va récupérer la révision du projet et stock dans la variable revision
  • gitArchive créer une archive .tar.xz
    • paramètre n°1 correspond au chemin à partir duquel on archive ( afin de gérer les sous modules git )
    • paramètre n°2 correspond au nom de l'archive
  • udpateSpec va bumper le spec avec le commentaire donné en premier argument si besoin
    • les autres paramètres sont des règles accompagné de la valeur de remplacement si la règle est vrai (Exemple: ' %global snapdate 20130510' -> ' %global snapdate 20130516' )
  • Construction du paquet sur la machine local via localBuild si besoin
  • Si la construction locale du rpm est effectué avec succès alors la fonction remoteBuild demandera une construction sur les serveurs de fedora si besoin

Les logs du workflow sont mis dans $HOME/rpmbuild/LOG/ afin de consulter le déroulement de ce dernier.

Les scripts quant a eux sont placé dans $HOME/rpmbuild/SCRIPT.

Les sources sont accessible ici: https://github.com/bioinfornatics/package_workfow

Il vous reste plus qu'a lancer un fedpkg update :-)