Introduction

La chronique continue, avec cette fois-ci la mise à jour d'un paquet que je viens de récupérer du dépôt. Son propriètaire précédent ne montrant plus signe de vie, ses paquets sont devenus "orphelins" et sont automatiquement retirés du dépôt s'ils ne trouvent pas un nouveau propriètaire. Ces événements sont annoncés sur la liste de diffusion de développement du Projet Fedora. Récupérer un ancien paquet n'est pas quelque chose d'anodin, car même si le paquet est déjà fait, il est resté un certain temps sans aucune maintenance et donc n'a pas suivi les évolutions de la distribution en matière de packaging. Les tickets du bugzilla s'empilent sur son dos tandis que la dernière activité des développeurs du logiciel remonte à 2005 (dans le jargon on dit que « Upstream est mort »). Avant de se porter acquéreur d'un paquet tout juste rendu orphelin, il convient de vérifier que les tickets de bugzilla ouverts à l'encontre de ce paquet puissent être fermés, soit par une mise à jour produite par les développeurs du logiciel (que l'on appelle "Upstream"), soit par une mise à jour du paquet produite par le packageur. Le seul ticket ouvert concerne un problème d'empaquetage, que je vais donc devoir résoudre en réalisant cette mise à jour.

Prérequis

Toujours avoir le groupe de paquets Empaqueteur Fedora installé sur votre machine.

# yum install @rpm-development-tools

Récupération des sources du paquet

Même si le paquet est marqué comme "orphelin", et qu'il est retiré du dépôt, son code source restera toujours accessible. Ainsi, les sources de n'importe quel paquet qui a été présent au moins une fois dans le dépôt fedora peuvent être récupérées. Dans le cas présent, vu que je suis son nouveau propriètaire, checkdns n'a pas eu le temps d'être retiré du dépôt, mais je tenais à le signaler. Comme d'habitude, on va clôner le dépôt à code source sur le disque dur :

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

Si vous ne possédez pas votre propre compte FAS, l'option -a de la commande est obligatoire (-a pour "anonyme", sans utiliser de compte FAS). Aussitôt, on vérifie que la version du logiciel empaqueté est bien la dernière version du logiciel mise en ligne par son développeur :

casper@blackbird:~/fedora-scm/checkdns$ egrep 'URL|Version|Source0' checkdns.spec
Version:        0.5
URL:            http://www.enderunix.org/checkdns/
Source0:        http://www.enderunix.org/checkdns/%{name}-%{version}.tar.gz

Si j'ai également fait apparaitre l'URL du tarball, c'est parce que le site en PHP a un comportement un peu étrange, du coup je voulais vérifier la présence du fichier et d'un éventuel nouveau tarball. Il s'avère que tout est en ordre, le paquet contient déjà la dernière version du logiciel.

Les modifications du RPM

Certes, cette mise à jour n'implique pas beaucoup le logiciel empaqueté, mais l'opération de taille consiste à faire le ravalement de façade du paquet, en résolvant en premier lieu le ticket du bugzilla.

Fixer le bug

Le rapporteur du bug nous informe d'un changement approuvé par le Comité d'Empaqueteur Fedora concernant les paquets qui contiennent des tâches Cron. Ces paquets doivent désormais avoir une dépendance sur le paquet crontabs lorsqu'ils ajoutent une tâche dans le répertoire /etc/cron.d/, et les fichiers de tâche doivent avoir les permissions configurées en 640 (rw-r-----.). Le rapporteur donne même un example de patch appliqué sur le paquet Cacti en pièce jointe du ticket. Du coup, on incrémente le tag Release du paquet, et on applique les changements imposés par la nouvelle Guideline d'empaquetage des fichiers de tâche Cron. C'est à dire qu'on ajoute une dépendance sur le paquet crontabs qui possède le répertoire %{_sysconfdir}/cron.d/, et on ajuste les permissions du fichier de tâche Cron en 640.

--- checkdns.spec.orig  2014-02-25 01:58:14.926521141 +0100
+++ checkdns.spec       2014-02-25 01:58:55.330904343 +0100
@@ -1,6 +1,6 @@
 Name:          checkdns
 Version:       0.5
-Release:       14%{?dist}
+Release:       15%{?dist}
 Summary:       A Domain Name Server analysis and reporting tool

 Group:         Applications/Internet
@@ -11,7 +11,7 @@ Source1:      checkdns.cron
 Patch0:        checkdns-0.5.config_location.patch
 BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-Requires:      httpd, bind
+Requires:      httpd, bind, crontabs
 Requires(pre): shadow-utils

 %description
@@ -45,7 +45,7 @@ install -p checkdns $RPM_BUILD_ROOT/%{_sbindir}
 install -d $RPM_BUILD_ROOT/%{_sysconfdir}
 sed -e '/html_output_dir/s@usr/local/apache/htdocs@var/www/html@' -e '/lang_file/s@local/@@' checkdns.conf-dist > $RPM_BUILD_ROOT/%{_sysconfdir}/checkdns.conf
 install -d $RPM_BUILD_ROOT/%{_sysconfdir}/cron.d
-install -p -m 0644 %{SOURCE1} $RPM_BUILD_ROOT/%{_sysconfdir}/cron.d/%{name}
+install -p -m 0640 %{SOURCE1} $RPM_BUILD_ROOT/%{_sysconfdir}/cron.d/%{name}
 install -d $RPM_BUILD_ROOT/%{_localstatedir}/www/html/%{name}
 install -p -m 0644 checkdns.css $RPM_BUILD_ROOT/%{_localstatedir}/www/html/%{name}
 install -d $RPM_BUILD_ROOT/%{_datadir}/%{name}
@@ -70,6 +70,10 @@ getent passwd checkdns >/dev/null || use
 %config(noreplace) %{_localstatedir}/www/html/%{name}/checkdns.css

 %changelog
+* Tue Feb 25 2014 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxxxx> - 0.5-15
+- Add requirement on crontabs (Fix RHBZ #947058)
+- Fix modes of cron job file in %%install section
+
 * Sat Aug 03 2013 Fedora Release Engineering <rel-eng@xxxxxxxxxxxxxxxxx> - 0.5-14
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild

Supprimer les tags obsolètes

Ce paquet est resté très longtemps sans aucune maintenance, il contient pas mal de tags qui ont été rendu obsolètes par l'évolution de l'empaquetage des logiciels sous Fedora. Le plus flagrant étant le tag BuildRoot qui n'est plus nécessaire depuis Fedora 10. Petite visite historique du paquet et nettoyage de fond en comble sont au programme :

  • Le tag Group était obligatoire, maintenant il ne l'est plus.
  • Le tag BuildRoot est carrément ignoré.
  • La racine de construction (BuildRoot) n'a plus besoin d'être nettoyée au début de la section %install.
  • La section %clean n'a plus lieu d'être car elle est automatisée pendant l'exécution de %install.
  • La ligne %defattr indique les propriètaire et groupe par défaut (root:root), elle n'est donc plus nécéssaire depuis que ce standard est inclus automatiquement dans la section %files.

Mais le ravallement de façade n'est pas tout à fait terminé...

--- checkdns.spec.orig  2014-02-25 02:02:19.251839258 +0100
+++ checkdns.spec       2014-02-25 02:07:40.471855789 +0100
@@ -3,13 +3,11 @@ Version:      0.5
 Release:       15%{?dist}
 Summary:       A Domain Name Server analysis and reporting tool
-Group:         Applications/Internet
 License:       GPLv2+
 URL:           http://www.enderunix.org/checkdns/
 Source0:       http://www.enderunix.org/checkdns/%{name}-%{version}.tar.gz
 Source1:       checkdns.cron
 Patch0:        checkdns-0.5.config_location.patch
-BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

 Requires:      httpd, bind, crontabs
 Requires(pre): shadow-utils
@@ -39,7 +37,6 @@ export CFLAGS
 make %{?_smp_mflags}

 %install
-rm -rf $RPM_BUILD_ROOT
 install -d $RPM_BUILD_ROOT/%{_sbindir}
 install -p checkdns $RPM_BUILD_ROOT/%{_sbindir}
 install -d $RPM_BUILD_ROOT/%{_sysconfdir}
@@ -51,8 +48,6 @@ install -p -m 0644 checkdns.css $RPM_BUILD_ROOT/%{_localstatedir}/www/html/%{name}
 install -d $RPM_BUILD_ROOT/%{_datadir}/%{name}
 cp -rp lang $RPM_BUILD_ROOT/%{_datadir}/%{name}
-%clean
-rm -rf $RPM_BUILD_ROOT

 %pre
 getent passwd checkdns >/dev/null || useradd -d \
@@ -60,7 +55,6 @@ getent passwd checkdns >/dev/null || useadd -d \
 :

 %files
-%defattr(-,root,root,-)
 %doc AUTHORS ChangeLog COPYING INSTALL LICENSE README THANKS TODO
 %config(noreplace) %{_sysconfdir}/checkdns.conf
 %config(noreplace) %{_sysconfdir}/cron.d/%{name}
@@ -73,6 +67,8 @@ getent passwd checkdns >/dev/null || useradd -d \
 * Tue Feb 25 2014 Matthieu Saulnier <fantom@xxxxxxxxxxxxxxxxx> - 0.5-15
 - Add requirement on crontabs (Fix RHBZ #947058)
 - Fix modes of cron job file in %%install section
+- Remove obsoletes tags in spec file
+- Remove %%clean section in spec file

 * Sat Aug 03 2013 Fedora Release Engineering <rel-eng@xxxxxxxxxxxxxxxxx> - 0.5-14
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild

Cleanup de la section %install

Pourquoi faire en deux commandes l'équivalent d'une seule commande ? La commande install permet de créer le répertoire parent et d'y placer un fichier en une seule passe. C'est très utile lorsque le nom du fichier source est différent du nom du fichier installé sur le système. Par contre les répertoires sont ignorés (il n'y a pas la récursivité), la commande cp devra être utilisée à la place.

--- checkdns.spec.orig  2014-02-25 02:37:57.972868958 +0100
+++ checkdns.spec       2014-02-25 03:27:48.157016352 +0100
@@ -37,14 +37,11 @@ export CFLAGS
 make %{?_smp_mflags}

 %install
-install -d $RPM_BUILD_ROOT/%{_sbindir}
-install -p checkdns $RPM_BUILD_ROOT/%{_sbindir}
+install -D -p %{name} $RPM_BUILD_ROOT/%{_sbindir}/%{name}
 install -d $RPM_BUILD_ROOT/%{_sysconfdir}
 sed -e '/html_output_dir/s@usr/local/apache/htdocs@var/www/html@' -e '/lang_file/s@local/@@' checkdns.conf-dist > $RPM_BUILD_ROOT/%{_sysconfdir}/checkdns.conf
-install -d $RPM_BUILD_ROOT/%{_sysconfdir}/cron.d
-install -p -m 0640 %{SOURCE1} $RPM_BUILD_ROOT/%{_sysconfdir}/cron.d/%{name}
-install -d $RPM_BUILD_ROOT/%{_localstatedir}/www/html/%{name}
-install -p -m 0644 checkdns.css $RPM_BUILD_ROOT/%{_localstatedir}/www/html/%{name}
+install -D -p -m 0640 %{SOURCE1} $RPM_BUILD_ROOT/%{_sysconfdir}/cron.d/%{name}
+install -D -p -m 0644 %{name}.css $RPM_BUILD_ROOT/%{_localstatedir}/www/html/%{name}/%{name}.css
 install -d $RPM_BUILD_ROOT/%{_datadir}/%{name}
 cp -rp lang $RPM_BUILD_ROOT/%{_datadir}/%{name}
@@ -69,6 +66,7 @@ getent passwd checkdns >/dev/null || use
 - Fix modes of cron job file in %%install section
 - Remove obsoletes tags in spec file
 - Remove %%clean section in spec file
+- Cleanup %%install section in spec file

 * Sat Aug 03 2013 Fedora Release Engineering <rel-eng@xxxxxxxxxxxxxxxx> - 0.5-14
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild

Ajout de la Description en français

J'ai pour habitude de traduire la description de mes paquet en français, mais ça fera l'objet de la prochaine mise à jour.

Essais de construction

Avant de mettre en ligne les changements (commit + push), on doit toujours tester si le paquet se construit correctement. Certains packageurs utilisent Mock, personnellement mon mock est hors-service depuis un moment, du coup j'utilise Koji en remplacement. Pour celà, il faut créer un SRPM basé sur le contenu du dépôt Git sur notre disque dur, tout simplement avec la commande :

casper@blackbird:~/fedora-scm/checkdns$ fedpkg srpm

Puis lancer le build du SRPM sur l'infrastructure de construction de Fedora :

casper@blackbird:~/fedora-scm/checkdns$ koji --user=fantom build --scratch --nowait f21 /home/casper/fedora-scm/checkdns/checkdns-0.5-15.fc21.src.rpm

Si tous les tests passent, alors on peut commiter et pusher les changements, et bien sûr on construit le paquet pour les différentes branches de Fedora depuis le Git en ligne. Vu que les changements sont mineurs, on va les appliquer jusqu'à la branche F19 (en partant de Rawhide). Pour commiter et pusher en une seule commande, il suffit d'ajouter l'option -p :

casper@blackbird:~/fedora-scm/checkdns$ fedpkg commit -m "Fix RHBZ #947058" -p

Et enfin on lance la contruction pour la branche Rawhide.

Construction pour f20 et f19

Les modifications que nous venons de valider avec la construction du paquet Rawhide peuvent être appliquées aux autres branches, mais ce n'est pas toujours possible. Dans notre dépôt Git local, on change de branche :

$ fedpkg switch-branch f20

Puis on applique les changements réalisés dans la branche master (la branche en perpétuel développement, assignée à Rawhide) :

$ git merge master

Les changements sont appliqués seulement dans notre dépôt Git local, il convient de les pousser en ligne avant de pouvoir demander la construction du paquet à partir du dépôt Git en ligne (ce qui est plutôt logique) :

$ fedpkg push

On peut désormais construire le paquet pour f20 :

$ fedpkg build --nowait

L'option --nowait est utile lorsqu'on travaille à la chaîne. En effet, sans cette option, la commande ne rend le prompt du terminal seulement à la fin de la construction du paquet. Du coup le terminal est monopolisé pour 5 à 10 minutes. Mais avec cette option, dès que la tâche est lancée sur Koji, la commande rend automatiquement le prompt en 10 secondes. Lorsqu'il y a plusieurs branches à mettre à jour, ça permet vraiment de gagner du temps.

Création de l'update Bodhi

Dans le précédent billet, nous avons utilisé la commande fedpkg update qui lance un editeur en mode console. Éditeur au choix défini par la variable d'environnement $EDITOR :

$ echo $EDITOR
emacs -nw

L'inconvénient de cette méthode est qu'il faut remplir à la main le petit formulaire, certes il n'y a que 2 lignes à compléter, mais bon... Pour changer nous allons le faire en une commande à lancer une fois pour chaque branche (F20 et F19), ce qui est beaucoup plus rapide. Concrètement, la commande va servir à marquer le paquet construit comme étant paquet de mise à jour à destination du dépôt. Cette commande peut être lancée n'importe où, pas besoin d'être dans le dépôt Git local pour la lancer (ce qui n'est pas le cas pour fedpkg update). En revanche, le fait de ne pas avoir le petit formulaire interractif nous oblige à fournir toutes les informations nécessaires du premier coup. Dans le cas de checkdns, il faut spécifier le numéro du bug résolu par l'update (#947058), le type d'update (avancement, sécurité, bugfix), le commentaire décrivant l'update pour les testeurs, et bien sûr la destination du paquet (dépôt updates-testing en premier lieu, puis ensuite dépôt updates).

casper@blackbird:~$ bodhi -u fantom -n -b 947058 -t bugfix -N "Fix RHBZ #947058" -R testing checkdns-0.5-15.fc20
Creating a new update for checkdns-0.5-15.fc20
Update successfully created
================================================================================
checkdns-0.5-15.fc20
================================================================================
Release: Fedora 20
Status: pending
Type: bugfix
Karma: 0
Request: testing
Bugs: 947058 - Add a missing requirement on crontabs for the cron job to
: the spec file
Notes: Fix RHBZ #947058
Submitter: fantom
Submitted: 2014-02-25 03:20:43
Comments: bodhi - 2014-02-25 03:21:00 (karma 0)
This update has been submitted for testing by fantom.

https://admin.fedoraproject.org/updates/checkdns-0.5-15.fc20

Pour F19, il suffit de remplacer fc20 par fc19, et le paquet correspondant sera marqué. Attention, je tiens à rappeler que seuls les paquets construits depuis leurs dépôts à code source Git (donc avec la commande fedpkg build) peuvent être marqués en tant que mise à jour par Bodhi.