Introduction

Cet article inaugure une petite chronique dont l'idée m'est apparue pendant l'exécution de tâches répétitives (ie: mon travail IRL). J'ai en effet réalisé que le Web foisonne d'éléments pour la construction initiale de paquets RPM, d'ordre théorique (wikis, documentations...) et d'ordre pratique (articles de blog, paquets du dépôt Fedora...). Sauf que, un paquet RPM est voué à évoluer dès sa création, les modifications provenants du programme empaqueté ou paquet en lui-même pour correspondre aux évolution du système d'empaquetage global. On ne pousse pas un paquet dans le dépôt puis on l'oublie. En se tournant vers le Web à la recherche de divers éléments, j'ai vu que la partie théorique est certes correctement abordée (wiki fedoraproject), mais que la partie pratique était juste absente. Devant ce vide, je me suis dit qu'avec mes quelques paquets il fallait tenter quelque chose... Cette chronique a plusieurs objectifs, donner une illustration pratique du processus de mise à jour afin de suciter la curiosité chez les néohpytes (oui le Projet Fedora manque de packagers pour les paquets préexistant, c'est un fait avéré), et afin de suciter la critique chez les empaqueteurs experts. Car ma technique est loin d'être parfaite, il y a toujours une occasion pour s'améliorer.

Prérequis

Avoir le groupe de paquets Fedora Packager installé sur votre machine

# yum install @rpm-development-tools

Récupération des sources du paquet

Chaque paquet du dépôt Fedora possède un petit dépôt de code source dans lequel le propriètaire du paquet peut travailler. Ce petit dépôt est visitable en ligne ici pour Easybashgui, il contient les fichiers nécessaires à la construction du RPM à savoir le fichier SPEC et l'archive source du programme empaqueté, et il utilise le système de contrôle de version GIT. On ne dit pas « télécharger » un dépôt mais « cloner », nous allons donc cloner le dépôt du paquet Easybashgui sur notre disque dur:

casper@blackbird:~/fedora-scm$ fedpkg clone -a easybashgui

L'option -a signifie « anonyme » juste parce que les accès aux dépôts sont contrôlés par les comptes FAS. La première chose à vérifier est que le paquet embarque bien la dernière version du logiciel:

casper@blackbird:~/fedora-scm/easybashgui$ egrep 'URL|Version' easybashgui.spec
Version:        8.0.1
URL:            https://sites.google.com/site/easybashgui/

Rendons-nous sur le site à l'url indiquée. Sur la page Download on voit que la version actuelle du logiciel est la 10.0.0, il est temps de mettre à jour le paquet.

Récupération des sources du logiciel

Comme nous venons de le voir, les sources du logiciel sont hébergées sur la plateforme d'hébergement Github, qui offre un système de téléchargement de l'archive source assez spécial. En fait Github dispose lui-aussi d'un système de contrôle de version, avec la possiblité d'associer un commit à un tag. Ici le commit (court) est « ad4222f », et le tag est défini arbitrairement par le développeur qui indique ici la version de son logiciel. Il nous manque encore une information avant de pouvoir commencer, la version longue de l'identifiant du commit, que l'on obtient en cliquant sur l'identiant court: ad4222f0082adc877a35c0f3984b2cc7c8319d9b. Après cette petite navigation dans Github, nous disposons de toutes les information requises pour modifier le SPEC.

casper@blackbird:~/fedora-scm/easybashgui$ head -1 easybashgui.spec                                                                                                     
%global commit f39fd3b22e7af267613d35de659b94c3f55b9fb1

On peut remplacer l'ancien commit qui indiquait la version 8.0.1 par le nouveau:

casper@blackbird:~/fedora-scm/easybashgui$ sed -i s/f39fd3b22e7af267613d35de659b94c3f55b9fb1/ad4222f0082adc877a35c0f3984b2cc7c8319d9b/ easybashgui.spec

On met à jour le tag « Version »:

casper@blackbird:~/fedora-scm/easybashgui$ sed -i 's/Version:        8.0.1/Version:        10.0.0/' easybashgui.spec

Et enfin on ajoute une entrée au %changelog:

--- easybashgui.spec.orig       2014-01-20 01:18:32.637223701 +0100
+++ easybashgui.spec    2014-01-20 01:19:52.216888031 +0100
@@ -78,6 +78,9 @@ chmod 644 easybashgui_test.sh
 
 
 %changelog
+* Mon Jan 20 2014 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxx> - 10.0.0-1
+- Update to 10.0.0
+
 * Tue Aug 06 2013 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxx> - 8.0.1-1
 - Update to 8.0.1
 - Upstream has moved sources on github

Avec ces modifications, nous pouvons désormais télécharger l'archive à la version du logiciel souhaitée avec l'outil « spectool »:

casper@blackbird:~/fedora-scm/easybashgui$ spectool -g -S easybashgui.spec

Maintenant commence le travail d'investigation pour savoir ce qui a changé dans le logiciel qu'il faut répercuter et adapter dans le RPM. J'ai pour habitude de copier l'archive dans ~/Téléchargements/ pour l'extraire et pouvoir fouiller en profondeur dedans.

L'évolution du logiciel

Jusqu'à la version 8.0.1 je n'utilisais pas le Makefile fourni car il était partiellement erroné (au niveau des modes des fichiers), aujourd'hui il apparait que tout est OK pour les modes des fichiers sources, nous allons donc désormais l'utiliser. Dans la partie %install du SPEC il va falloir tout remplacer par la commande « make install ».

On voit aussi que le développeur a trié ses fichiers sources dans les répertoires icons/ lib/ scr/ ce qui n'était pas le cas dans la version précédente. Du coup, la commande 'sed' dans la partie %prep du SPEC va être cassée. Sauf que, en cherchant dans l'archive, le fichier "easybashgui_test.sh" manque à l'appel, en conséquence nous allons supprimer la commande 'sed' qui n'a plus lieu d'exister.

Du coté des fichiers qui vont être installés par le RPM, le nom de certains fichiers installés a changé, par exemple l'ancien "easydialog.sh" se nomme désormais "easydialog". L'emplacement des deux fichiers de bibliothèque a également changé. Tous ces changements seront répercutés sur la section %files du SPEC.

Et enfin malgrès le développement intensif de cette bibliothèque, les dépendances indispensables à son bon fonctionnement (tag Requires dans le SPEC) semblent inchangés.

Les modifications du RPM

On ouvre son éditeur de texte préféré et on modifie le fichier SPEC dans l'ordre précédemment énoncé.

La partie %install

--- easybashgui.spec.orig       2014-01-20 01:56:56.976175885 +0100
+++ easybashgui.spec    2014-01-20 23:46:11.130181100 +0100
@@ -44,27 +44,7 @@ sed -i "s@#!/usr/bin/env bash@@" easybas
 
 
 %install
-# Install binaries :
-mkdir -p %{buildroot}%{_bindir}/
-install -pm 755 %{name}                     \
-                %{name}-debug               \
-                easydialog.sh               \
-                %{buildroot}%{_bindir}/
-# Install lib files :
-mkdir -p %{buildroot}%{_libexecdir}/%{name}/
-install -pm 755 %{name}.lib                          \
-                easybashlib                          \
-                %{buildroot}%{_libexecdir}/%{name}/
-# Install shared files :
-mkdir -p %{buildroot}%{_datadir}/%{name}/
-install -pm 644 Ok.xpm                            \
-                Attenzione.xpm                    \
-                %{buildroot}%{_datadir}/%{name}/
-# Install man file
-mkdir -p %{buildroot}%{_mandir}/man1/
-install -pm 644 %{name}.1* %{buildroot}%{_mandir}/man1/
-# Fix mode of easybashgui_test.sh :
-chmod 644 easybashgui_test.sh
+make install DESTDIR=%{buildroot}
 
 
 %files

La partie %prep

--- easybashgui.spec.orig       2014-01-20 23:49:16.987846224 +0100
+++ easybashgui.spec    2014-01-20 23:54:40.296437416 +0100
@@ -35,8 +35,6 @@ lancé ou non.
 
 %prep
 %setup -qn %{name}-%{commit}
-# Remove shebang from easybashgui_test.sh :
-sed -i "s@#!/usr/bin/env bash@@" easybashgui_test.sh
 
 
 %build

La partie %files

Cette partie mérite quelques explications avant de balancer le diff. En effet si on lit le Makefile on aperçoit que les fichiers de documentation (README, EasyBashGUI-license) sont installés par le 'make install'. Rien d'extraordinaire en soi, sauf que dans cette partie existe déjà une macro sensée copier automatiquement ces fichiers doc dans le répertoire /usr/share/doc/ et d'assigner la proprièté de ces fichier au paquet. La copie des fichiers de la macro %doc fait un peu doublon avec le Makefile, mais il faut toutefois que la proprièté des fichiers soit assignée au paquet. Pour cela nous allons simplement ajouter le répertoire des fichiers doc à la liste des fichiers dont le paquet est propriètaire, et enlever la macro %doc. Pour la traduction des macros de chemin de fichier, c'est par ici (juste au cas où).

--- easybashgui.spec.orig       2014-01-21 00:55:31.425925488 +0100
+++ easybashgui.spec    2014-01-21 01:00:31.694894978 +0100
@@ -46,13 +46,13 @@ make install DESTDIR=%{buildroot}
 
 
 %files
-%doc README EasyBashGUI-license easybashgui_test.sh
 %{_bindir}/%{name}
 %{_bindir}/%{name}-debug
-%{_bindir}/easydialog.sh
+%{_bindir}/easydialog
 %{_datadir}/%{name}/
-%{_libexecdir}/%{name}/
+%{_prefix}/lib/%{name}/
 %{_mandir}/man1/%{name}.1*
+%{_docdir}/%{name}/
 
 
 %changelog

La partie %changelog

Ah tiens, plus haut j'ai omis de préciser... que toutes nos modifications doivent être consciencieusement consignées dans le Changelog du paquet. Alors pas la peine d'écrire un roman, il faut être bref et précis. En voici un exemple:

--- easybashgui.spec.orig       2014-01-21 01:10:16.772114046 +0100
+++ easybashgui.spec    2014-01-21 01:16:30.220338188 +0100
@@ -58,6 +58,10 @@ make install DESTDIR=%{buildroot}
 %changelog
 * Mon Jan 20 2014 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxx> - 10.0.0-1
 - Update to 10.0.0
+- Use makefile instead of scriplet in %%install section
+- Remove sed statement in %%prep section
+- Remove %%doc macro in %%files section
+- Update %%files section according the makefile
 
 * Tue Aug 06 2013 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxx> - 8.0.1-1
 - Update to 8.0.1

Vous aurez remarqué que dans le changelog j'ajoute un « % » avant chaque nom de section, c'est juste pour que ces macros ne soit pas interprétées au moment de la construction du paquet. Alors ça y est, nous allons enfin pourvoir le construire ce paquet. Mais avant...

Enregistrement des modifications du GIT

N'oublions pas que nous sommes encore dans notre petit dépôt GIT et que toutes les modifications que nous venons d'apporter n'ont pas encore d'identifiant d'enregistrement. Mais avant il faut encore ajouter l'archive source aux fichiers « sources » (c'est comme ça qu'il s'appelle) et « .gitignore » du dépôt. L'archive sera également mise en ligne en une seule passe.

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg new-sources easybashgui-10.0.0-ad4222f.tar.gz

Et enfin on enregistre les changements, en ajoutant un message expliquant sommairement ces modifications:

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg commit -m "Update to 10.0.0 version"

Cet enregistrement n'est présent que sur notre disque dur, il faut donc synchroniser notre dépôt local avec le dépôt en ligne. Pour cela on dit qu'on « pousse » les modifications, d'où la commande suivante:

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg push

Construction du paquet pour Rawhide

Maintenant nos modifications sont mises en ligne, nous pouvons construire le paquet contenant la dernière version du logiciel, mais seulement pour la branche Rawhide. Explication. Tout ce que nous venons de faire était dans la branche "master" du GIT, cette branche est la première branche à être modifiée, et elle correspond à la branche en évolution permanante de Fedora, c'est à dire Rawhide. Si tout se passe bien dans cette branche, alors on peut copier les changement dans les branches plus anciennes telles que f20 puis f19.

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg build --nowait
Building easybashgui-10.0.0-1.fc21 for rawhide
Created task: 6432471
Task info: http://koji.fedoraproject.org/koji/taskinfo?taskID=6432471

Si le build a réussi, alors cette version du paquet sera présente d'office dans f21, f22, etc... jusqu'à ce que l'on remette à jour la branche master.

Faire une update pour f20

Si les changements du logiciel n'influancent pas de façon majeure l'expérience utilisateur et développeur d'une version de Fedora, alors nous pouvons produire une mise à jour pour cette version. Il faut que la version soit tout de même en court de support par le Projet, en l'occurence f20 et f19. Commençons par changer de branche dans notre dépôt local:

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg switch-branch f20

Puis on applique les changements fait dans la branche master aux fichiers de la branche f20, heureusement pour nous tout cela est fait automatiquement avec une seule commande:

casper@blackbird:~/fedora-scm/easybashgui$ git merge master

On n'oublie pas de synchroniser cette branche de notre dépôt local avec la branche du dépôt en ligne:

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg push

Et on peut enfin construire notre paquet. Cette branche n'étant pas une branche de test, les échecs de constructions sont plutôt rares, pour ma part c'était à chaque fois parce que j'avais poussé un peu précipitament les changements de master avant que sa reconstruction du paquet ne soit terminée.

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg build --nowait
Building easybashgui-10.0.0-1.fc20 for f20-candidate
Created task: 6436984
Task info: http://koji.fedoraproject.org/koji/taskinfo?taskID=6436984

Lorsque ce paquet sera construit, il sera taggé en tant que paquet candidat de mise à jour, ce qui signifie qu'il ne sera poussé dans aucun dépôt (updates-testing, updates) avant que je ne le déclare apte. Typiquement je dois remplir un petit descriptif qui permettra aux utilisateurs de connaître la nature de cette mise à jour (sécurité, avancement, etc..), les bugs qu'il corrige, et c'est ce formulaire assigné au paquet qui permettra aux testeurs de lui donner une note et un commentaire. C'est également cette étiquette qui permet de suivre la progression du paquet dans les différents dépôts (updates-testing, puis updates).

casper@blackbird:~/fedora-scm/easybashgui$ fedpkg update
Creating a new update for  easybashgui-10.0.0-1.fc20
Password for fantom:
Creating a new update for  easybashgui-10.0.0-1.fc20
Update successfully created
================================================================================
     easybashgui-10.0.0-1.fc20
================================================================================
    Release: Fedora 20
     Status: pending
       Type: enhancement
      Karma: 0
    Request: testing
      Notes: Update to 10.0.0
  Submitter: fantom
  Submitted: 2014-01-21 23:09:01
   Comments: bodhi - 2014-01-21 23:09:04 (karma 0)
             This update has been submitted for testing by fantom.

  https://admin.fedoraproject.org/updates/easybashgui-10.0.0-1.fc20

Après cette opération, le paquet est taggé en tant que paquet de mise à jour en attente. En attente avant d'effectivement intègrer le dépôt updates-testing, il y sera poussé sous 24/48h environ. Ce délai est nécessaire pour laisser le temps à la personne en charge de la clé de signature GPG du Projet Fedora d'aposer la signature sur ce paquet. D'ici 7 jours, si la mise à jour ne reçoit aucune note négative, je la pousserais dans le dépôt updates comme le veut le règlement des mises à jour de Fedora.

Et pour f19 ?

Renouveler l'opération pour f20 en adaptant :-D