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 une opération anodine, 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 dernières évolutions d'empaquetage de la distribution. 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 nouvellement orpheliné, il convient de vérifier que les tickets de bugzilla ouverts contre ce paquet puissent être fermés, soit par une mise à jour produite par les développeurs du logiciel (appelés Upstream pour les intîmes), soit par une mise à jour du paquet produite par le packageur. Le seul ticket ouvert concerne une évolution d'empaquetage, que je vais donc devoir résoudre avec 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 donc 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 par le passé peuvent être récupérées. Dans le cas présent vu que je suis son nouveau propriètaire le cas ne se pose pas mais je tenais à le signaler. Comme d'habitude, on clône le dépôt à code source de checkdns 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 spécifier de compte FAS). Aussitôt on vérifie que la version du logiciel empaquetée est bien la dernière version du logiciel parue :

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 bien 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 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 fournissants 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 en 0640. Le rapporteur donne même un exemple 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. En l'occurence 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 conformément à la guideline.

--- 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/%{_s
 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 maintenance, il contient pas mal de tags qui ont été rendu obsolètes par l'évolution de l'empaquetage 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.
  • La racine de construction (BuildRoot) n'a plus besoin d'être nettoyée au début de la section %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 partie %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_BUI
 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 || use
 :
 
 %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 || use
 * 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, très utile lorsque le fichier doit être renommé. Par contre les répertoires sont ignorés, 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 peut 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 depuis le contenu du dépôt Git, 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 faut ajouter l'option -p :

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

Et enfin on builde 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 sans risque. Dans notre dépôt local on change de branche :

$ fedpkg switch-branch f20

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

$ git merge master

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

$ 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', mais avec cette option dès que la tâche est lancée sur Koji la commande rend automatiquement le prompt en 10". Lorsqu'il y a plusieurs branches à mettre à jour c'est une option qui 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 ligne à compléter, mais bon... Pour changer nous allons le faire en une commande par branche (f20 et f19), ce qui est beaucoup plus rapide. Concrètement, avec la commande il faut marquer le paquet construit comme étant paquet de mise à jour pour le dépôt, cette commande peut être lancée n'importe où, pas besoin d'être dans le dépôt Git pour la lancer (à l'inverse de `fedpkg update`). En revanche, le fait de ne pas avoir le petit formulaire interractif nous oblige à fournir toutes les informations nécessaire du premier coup. Dans le cas de checkdns il faut spécifier le numéro du bug fixé 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 où le paquet doit aller avec cette marque (dépôt updates-testing).

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 aussi marqué. Attention, je tiens à rappeler que seuls les paquets construits depuis leurs dépôts à code source Git (donc avec la commande `fedpkg build` uniquement) peuvent être marqués en tant que mise à jour potentielle par Bodhi.