Recommandations pour le parrainage de paquets Debian

Parrainer un paquet signifie l’uploader pour le compte d’une autre personne (qui se trouve être, la plupart du temps, un nouveau contributeur voulant devenir mainteneur de paquet). Le parrainage est réservé aux développeurs Debian, car ils sont réputés connaître les tenants et aboutissants de l’empaquetage. Cet article essaye ici de documenter ce processus, afin de s’assurer que le parrain effectue un travail satisfaisant, au regard des standards Debian.

Parrainer un paquet dans l’archive Debian n’est pas une tâche triviale. Cela suppose que vous ayez vérifié son empaquetage et jugé qu’il était du niveau de qualité attendu par Debian. Voyons voir ce que vous pouvez et devriez faire dans un tel cas :

Parrainer l’envoi initial

Parrainer un tout nouveau paquet requiert une analyse méthodique de son empaquetage : compiler le paquet et tester le logiciel proprement dit n’est absolument pas suffisant ! Vous devez ouvrir chaque fichier dans le répertoire debian à la recherche de problèmes potentiels. Voici une liste que vous pouvez utiliser pour réaliser cet audit :

  • Vérifier que l’archive TAR amont fournie est identique à celle distribuée par l’auteur amont (dans le cas où les sources ont été ré-empaquetées pour Debian, il vous faudra générer l’archive par vous-même) ;
  • Lancer lintian. Ce dernier remontera beaucoup de problèmes « habituels ». Vérifier que les overrides employés pour masquer des erreurs sont pleinement justifiés ;
  • Lancer licensecheck et vérifier que debian/copyright est correct et exhaustif. Rechercher les problèmes de licences (comme les fichiers dont l’en-tête comporte « All rights reserved », ou une licence non compatible avec les principes du logiciel libre selon Debian) ;
  • Compiler le paquet avec pbuilder (ou équivalent), afin de s’assurer que les dépendances de compilation soient complètes ;
  • Rechercher les erreurs dans debian/control : est-ce qu’il suit les bonnes pratiques ? Est-ce que la liste des dépendances est complète ?
  • Rechercher les erreurs dans debian/rules : est-ce qu’il suit les bonnes pratiques ? Est-il améliorable ?
  • Rechercher les erreurs dans les scripts de configuration (preinst, postinst, prerm, postrm, config) : est-ce que les scripts preinst et postrm fonctionneront si les dépendances ne sont pas installées ? Est-ce que tous les scripts sont bien idempotents (c’est à dire qu’ils peuvent être lancés un nombre arbitraire de fois sans conséquences fâcheuses) ?
  • Passer en revue toutes les modifications faites aux fichiers amont (soit dans les fichiers .diff.gz, soit dans debian/patches/ ou directement embarquées dans le tarball debian en ce qui concerne les fichiers binaires). Est-ce que ces modifications sont justifiées ? Sont-elles proprement documentées (en utilisant DEP-3 dans le cas des patchs) ?
  • Pour chaque fichier, il vous faut vous demander pourquoi il est là et s’il constitue la meilleure manière d’atteindre le but recherché. Est-ce que le mainteneur suit bien les bonnes pratiques de l’empaquetage décrites dans la Référence du Développeur Debian ?
  • Compiler, installer les paquets, et essayer les logiciels. Assurez-vous de pouvoir supprimer et purger les paquets. Vous pouvez aussi tester les paquets grâce à piuparts.

Si cet audit n’a révélé aucun problème, vous pouvez alors uploader le paquet. Mais souvenez-vous que même si vous n’en êtes pas le mainteneur, le parrain reste responsable de ce qu’il a envoyé dans l’archive Debian. C’est pourquoi vous êtes encouragé à suivre le paquet grâce au PTS (Package Tracking System – Système de Suivi des Paquets).

Parrainer la mise à jour d’un paquet déjà existant

Vous supposerez généralement que le paquet a déjà été l’objet d’un examen minutieux. Donc plutôt que de recommencer, vous analyserez avec beaucoup d’attention les différences entre l’ancienne et la nouvelle version préparée par le mainteneur. Si vous n’avez pas vous-même effectué la revue initiale, vous souhaiterez peut-être jeter un coup d’oeil un peu plus approfondi au paquet en lui-même, juste au cas où le premier « relecteur » ait été un peu négligeant.

Pour comparer, il vous faut les deux versions. Télécharger la version source actuelle (grâce à apt-get source) et recompiler-là (ou télécharger le fichier binaire correspondant : aptitude download). Télécharger ensuite le paquet source à parrainer (la plupart du temps via dget).

Lisez les nouvelles entrées du fichier de suivi des modifications (changelog) : il devrait vous dire à quoi vous attendre. L’outil principal que vous allez utiliser est debdiff, que vous pouvez lancer avec deux paquets sources (fichiers .dsc) ou deux fichiers binaires, ou encore deux fichiers .changes (il comparera alors tous les fichiers binaires listés dans les fichiers .changes).

Si vous comparez les paquets sources (en excluant les fichiers upstream dans le cas d’une nouvelle version upstream, par exemple en filtrant la sortie de debdiff grâce à filterdiff -i '*/debian/*'), vous devez comprendre toutes les modifications qui s’affichent, et elles doivent être proprement documentées dans le suivi des modifications Debian.

S’il n’y a rien à relever, compiler le paquet et comparer les fichiers binaires, afin de vérifier que les modifications vues dans les sources n’ont aucun effet de bord (comme des fichiers supprimés par erreurs, des dépendances manquantes, …).

Il peut également être utile de contrôler l’état du paquet sur le PTS, histoire de vérifier que le mainteneur n’a rien manqué d’important : peut-être que des traductions en attente auraient pu être intégrées, ou bien le paquet a fait l’objet d’une mise à jour indépendante (NMU – Non-Maintener Upload) mais le mainteneur a oublié d’en reprendre les modifications dans sa nouvelle version. Il se peut également qu’un bogue critique pour la publication ait été laissé de côté et bloque la migration vers testing… bref : quelle qu’en soit la nature, si vous trouvez quelque chose qui aurait pu être (mieux) fait, il est temps de le dire au mainteneur de sorte à ce qu’il puisse s’améliorer la prochaine fois, et qu’il ait plus justement conscience de ses responsabilités.

Si vous n’avez trouvé aucun problème, alors il est temps d’uploader la nouvelle version. Dans tous les autres cas, demandez au mainteneur de vous envoyer une version corrigée.


Cet article a servi de base à la rédaction de la section correspondante de la Référence du développeur Debian (cf #453313). Cliquez ici pour soutenir mon travail sur la documentation Debian.

Ceci est une traduction de mon article Best practices when sponsoring Debian packages contribuée par Weierstrass01.

4 astuces pour maintenir un paquet Debian « 3.0 (quilt) » dans un système de suivi de versions (VCS)

La plupart des paquets Debian sont gérés grâce à un logiciel de gestion de versions (VCS – Version Control System) tel que git, subversion, bazaar ou mercurial. Les particularités du format « 3.0 (quilt) » ne sont pas sans conséquences sur la gestion des paquets dans un VCS, et cet article va vous présenter quelques astuces afin d’en rendre l’usage plus agréable.

(Tous les exemples présentés ci-dessous s’appuient sur l’utilisation de git comme VCS).

1. Exclusion du répertoire .pc

Le répertoire .pc est utilisé par quilt afin de stocker ses données internes (liste des patchs appliqués, sauvegarde des fichiers modifiés). Il est également créé par dpkg-source de telle sorte que quilt « sache » que les patchs sont situés dans debian/patches (et non dans patches, qui est le répertoire que quilt utilise par défaut). À ce titre, le répertoire est conservé même lorsque plus aucun patch n’est actuellemement appliqué.

Vous ne tenez cependant pas à conserver ce répertoire dans votre dépôt : il doit donc être mentionné dans la liste des fichiers exclus. Avec git, il suffit d’indiquer :

$ echo ".pc" >>.gitignore
$ git add .gitignore
$ git commit -m "Ignore quilt dir"

Le fichier .gitignore n’étant pas pris en compte par dpkg-source, le paquet source généré par ce dernier ne sera pas « pollué ».

2. Retirer les patchs après la compilation

Si vous stockez vos sources « amont » avec les patchs non appliqués (ce que font la plupart des gens) et que vous ne compilez pas vos paquets dans un répertoire temporaire prévu à cet effet, alors vous souhaitez probablement « désappliquer » les patchs après la compilation, de sorte à retrouver un dépôt dans un état « propre ».

C’est désormais le comportement par défaut de dpkg-source. S’il a dû appliquer les patchs, il les enlèvera automatiquement également.

Mais on peut tout de même forcer ce comportement en ajoutant « unapply-patches » à debian/source/local-options :

$ echo "unapply-patches" >>debian/source/local-options
$ git add debian/source/local-options
$ git commit -m "Unapply patches after build"

svn-buildpackage compilant systématiquement dans un répertoire temporaire, le dépôt est laissé exactement dans le même état qu’avant la compilation : cette option est inutile dans ce cas. Ce comportement peut également être demandé à git-buildpackage grâce à l’option --git-export-dir=../build-area/ (../build-area/ étant le répertoire utilisé par svn-buildpackage, cette option force git-buildpackage à se comporter comme svn-buildpackage).

3. Gérer vos patchs quilt comme une branche git

Plutôt que de gérer les patchs spécifiques à Debian via quilt, il est possible d’utiliser git lui-même. Avec git-buildpackage vient l’outil gbp-pq (Git-BuildPackage Patch Queue – File des patchs de git-buildpackage). gbp-pq permet l’export d’une série quilt dans une branche git, que vous pouvez alors manipuler comme vous le souhaitez. Chaque commit représentant un patch, vous devez « rebaser » cette branche afin d’éditer les commits intermédiaires. Jetez un oeil à la documentation de gbp-pq pour appronfondir le sujet.

Alternative à gbp-pq, l’utilisation de git-dpm est plus compliquée, mais présente l’avantage de conserver l’historique de toutes les branches utilisées pour générer les séries quilt de toutes les publications Debian. Son principe de fonctionnement est très bien expliqué sur son site, et vous pouvez également souhaiter lire la revue qu’en a fait Sam Hartman, qui en présente les limites.

4. Documenter la manière de passer en revue les modifications

L’un des principaux bénéfices liés à l’utilisation du nouveau format source tient au fait qu’il est dorénavant simple de passer en revue les modifications amont : celles-ci sont conservées en autant de patchs distincts proprement documentés (et, idéalement, en utilisant le format DEP-3). En utilisant les outils décrits précédemment, le message de commit devient l’en-tête du patch. Il devient donc important de saisir des messages de commit explicites.

Cette méthode fonctionne bien tant que votre méthode de travail prend appui sur les patchs Debian, regroupés dans une branche que vous rebasez sur les sources amont à chaque publication. Certains mainteneurs n’aiment pas cette méthode de travail et préfèrent voir appliquer les modifications propres à Debian directement sur la branche d’empaquetage. Ils sautent alors vers une nouvelle version amont en la fusionnant dans cette dernière. Il est difficile dans ce cas de générer une série quilt à partir du système de suivi de versions. Il faut à la place indiquer à dpkg-source de stocker toutes les modifications dans un seul patch (qui devient alors équivalent au bon vieux .diff.gz), et documenter dans son en-tête comment mieux passer en revue les modifications, par exemple dans l’interface Web du VCS.

Le premier comportement est obtenu en passant l’option --single-debian-patch, et le second en écrivant l’en-tête dans debian/source/patch-header :

$ echo "single-debian-patch" >> debian/source/local-options
$ cat >debian/source/patch-header <<END
This patch contains all the Debian-specific
changes mixed together. To review them
separately, please inspect the VCS history
at http://git.debian.org/?=collab-maint/foo.git
<Put more details here>
END

Ceci est une traduction de mon article 4 tips to maintain a “3.0 (quilt)” Debian source package in a VCS contribuée par Weierstrass01. Vous voulez d’autres tutoriels comme celui-ci ? Cliquez ici pour vous abonner à ma newsletter et recevoir les nouveaux articles par email.

Ne créez pas votre paquet Debian avec dpkg -b

J’ai pu observer de nombreuses personnes, ces dernières années, essayant d’utiliser dpkg --build pour créer des paquets Debian. Et, de fait, si vous lisez les pages de manuel de dpkg et de dpkg-deb, l’option semble bien appropriée à cet usage :

-b, --build répertoire [archive|répertoire]

Crée une archive Debian avec l’arborescence contenue dans répertoire. répertoire doit posséder un sous-répertoire DEBIAN qui contient les fichiers de contrôle tel que le fichier « control » lui-même. Ce répertoire n’apparaît pas dans l’archive de l’arborescence du paquet binaire ; mais les fichiers qu’il contient sont mis dans la zone de contrôle du paquet binaire.

On peut en conclure que oui, effectivement, dpkg-deb est l’outil créant en dernière étape les fichiers .deb (aussi connus sous le nom de paquets binaires). Ce qui ne veut pas dire que vous êtes censé appeler un tel outil « bas-niveau » vous-même. En effet, si vous souhaitez empaqueter proprement un logiciel, vous devez plutôt créer un paquet source Debian, qui partira du code source amont pour créer des paquets binaires respectant la charte technique Debian.

Créer un tel paquet source implique également de préparer une arborescence de répertoires (mais avec un sous-répertoire « debian »), ce qui est probablement plus compliqué que d’appliquer dpkg -b à un répertoire ciselé « à la main ». Mais le résultat en est d’autant plus versatile : les outils utilisés apportent une valeur ajoutée en analysant/modifiant dynamiquement les fichiers à l’intérieur de votre paquet (par exemple, les dépendances envers les bibliothèques C requises par votre paquet sont insérées automatiquement).

Si cette méthodologie vous était inconnue, vous souhaiterez peut-être approfondir le sujet grâce au manuel du Nouveau Mainteneur ou à la Charte Debian.

Ceci est une traduction de mon article Avoid a newbie packager mistake: don’t build your Debian packages with dpkg -b contribuée par Weierstrass01.

Abonnez-vous à ce blog par RSS ou par email pour recevoir tous les prochains articles et améliorer votre maîtrise de Debian/Ubuntu.

Gérer des patchs spécifiques à chaque distribution avec un paquet source commun

Un patch peut-il n’être appliqué au paquet cible que pour certaines distributions ? Cette question m’a été posée en commentaire d’un précédent article présentant la gestion différentielle des dépendances entre Ubuntu et Debian, à partir d’un même paquet source. Et la réponse est … oui. C’est possible !

Le format de paquets source 3.0 (quilt) offre à cette fin une possibilité intéressante : plutôt que d’utiliser uniquement le fichier debian/patches/series pour rechercher des patches, dpkg-source essaye en premier lieu d’utiliser debian/patches/distrib.series, où « distrib » vaut « ubuntu », « debian », … Il est important de noter que dpkg-source n’applique pas les patches de tous les fichiers series trouvés : seuls les patches du premier fichier trouvé sont considérés.

Bien, mais comment tirer le meilleur parti de tout cela ? Debian est supposée toujours fournir le fichier debian/patches/series, ce dernier devant indiquer l’ensemble des patches « de base » à appliquer. N’importe quel tiers travaillant avec Debian peut maintenir son propre fichier series dans le dépôt CVS commun de maintenance des paquets. Il peut ainsi laisser de côté certains patches propres à Debian (les patches relatifs à la marque, par exemple), et intégrer les siens en plus des patches restants.

Il est intéressant de noter que c’est au mainteneur de s’assurer, en cas de besoin, de la cohérence des deux fichiers. dpkg-source n’offre ni la possibilité d’agréger plusieurs fichiers series, ni d’établir une quelconque dépendance entre eux.

Pour éditer un fichier series alternatif grâce à quilt, il suffit de positionner temporairement la variable d’environnement QUILT_SERIES à « distrib.series ». Faites simplement attention à bien partir d’un état vierge (i.e. aucun patch appliqué). Si tel n’est pas le cas, quilt sera confronté à une incohérence entre les données du fichier series et ses propres données (stockées dans le dossier .pc).

Ceci est une traduction de mon article Managing distribution-specific patches with a common source package contribuée par Weierstrass01. Si vous avez apprécié cet article, cliquez ici pour découvrir comment m’encourager à en rédiger d’autres.