Jusqu'à Zope 2.10, il existait des paquets Debian de Zope, et même des paquets Debian de Plone. Ces paquets étaient prévus pour pouvoir faire coexister plusieurs versions majeures (par exemple, 2.9 et 2.10) de Zope sur la même machine, et un outil très pratique, dzhandle permettait de gérer ces instances.
Depuis Zope 2.12 et le passage de l'ensemble de Zope en eggs, il n'existe plus de tels paquets, quelle que soit la distribution d'ailleurs.
L'objectif de cet article n'est pas de lancer un troll velu sur buildout, cependant, il est nécessaire d'expliquer les raisons qui nous poussent à préférer des paquets Debian plutôt que l'utilisation de buildout pour déployer des Zope dans notre infrastructure.
1. Tout un tas de raisons techniques sur le fonctionnement de buildout par rapport à dpkg/apt (la richesse des commandes de gestion pour apt, l'existence d'une cohérence entre les paquets d'une même distribution, la gestion des mises à jour ou des suppressions...).
2. La volonté d'avoir un système homogène de gestion des déploiements et des installations, sur un parc hétérogène, contenant du Zope de différentes versions, du Django, du PHP, des outils non-Web (serveurs de messagerie, supervision, backup...).
3. Le fait d'avoir plusieurs instances de Zope sur un même serveur, en mutualisant certains composants (comme l'Apache frontal); buildout n'offre pas de solution souple et robuste à ce problème.
4. Le fait d'utiliser, autant que possible, les paquets du système pour toutes les bibliothèques Python (par exemple python-ldap, PIL...), et donc d'avoir les mises à jour de sécurité centralisées de Debian sur tous ces paquets.
5. Éviter la duplication du code entre les instances, et entre les instances et le système.
6. Ne pas compiler de code sur les serveurs, ce qui est particulièrement important lorsqu'un serveur est mutualisé (installation d'une nouvelle instance) ou déjà en production (mise à jour ou installation d'un produit additionnel) car la compilation est très lourde en terme d'utilisation de ressources, et peut affecter les performances de la production.
S'il existait des paquets jusqu'à Zope 2.10, pourquoi n'y en a-t-il pas eu pour Zope 2.11, ni pour Zope 2.12 jusque là ?
La raison principale est que Zope, jusqu'au Zope 2.10, fournissait une archive (tarball) contenant l'ensemble du serveur. Cette archive était facile à packager comme n'importe quel autre programme.
À partir de Zope 2.12, seuls des eggs correspondant à différents morceaux de Zope sont diffusés, et c'est à easy_install, pip ou buildout de télécharger tous les morceaux et de les compiler ensemble.
Afin d'avoir un paquet Zope 2.12 sur Debian, une petite équipe s'est réunie lors d'un meeting sur IRC : composée de plusieurs développeurs Debian (Jonas Meurer, Michael Mulich, Arnaud Fontaine) et de moi-même (Gaël Le Mignot).
Afin d'arriver à un plan d'attaque, nous avons posé un certain nombre de contraintes :
Le principal problème pour remplir tous ces objectifs a été que les composants du ztk ont tendance à changer assez vite, et ne respectent pas toujours la compatibilité ascendante.
La solution retenue a donc été de faire un snapshot des composants du ztk nécessaires pour une version donnée de Zope, et de mettre cette version dans un paquet versionné (par exemple zope2.12). Cette solution n'est pas totalement satisfaisante, mais est celle qui répond au plus grand nombre d'objectifs initiaux.
Un paquet expérimental existait déjà, réalisé principalement par Michael Mulich. Ce paquet fonctionne en trois étapes :
1. Un script, à lancer manuellement pour construire le paquet, charge les composants d'une version de Zope donnée en utilisant pip, et fabrique une tarball avec.
2. La compilation du paquet proprement dite (qui sera à terme lancée sur les autobuilders Debian) qui prend la tarball et la compile pour l'architecture choisie (par exemple amd64 ou i386).
3. L'installation du paquet lui-même, qui peut se faire sur une autre Debian, indépendamment des deux étapes précédentes.
Grâce au travail d'Arnaud Fontaine, et un petit patch de ma part pour lui faire utiliser la dernière version de Zope 2.12 (le 2.12.17) ce paquet est désormais utilisable, il est en phase de polissage, et sera bientôt soumis aux FTP Masters de Debian, pour inclusion dans la Sid (puis ultérieurement dans la Testing, et enfin peut-être en backport sur squeeze).
Pour ceux qui souhaitent le tester dés maintenant (attention, il s'agit bien d'un paquet non officiel pour l'instant, même si nous l'utilisons quotidiennement), il est disponible, compilé pour Squeeze en AMD64 sur http://debian.pilotsystems.net.
Une petite anecdote, mais qui mérite d'être citée car d'autres peuvent en être victimes : il s'agit de l'attaque sournoise du shebang récursif.
Imaginons la scène : après avoir testé et validé le paquet de Zope 2.12 sur ma Sid, tout heureux d'avoir un paquet opérationnel, je le compile sur notre VM dédiée à la compilation de paquets Squeeze. Je le déploie sur une VM dédiée à accueillir des Plone 4 mutualisés.
Et là... dans un roulement de tonnerre et un flash de lumière, dzhandle refuse de créer une instance avec un "Cannot execute binary file". Je cherche des histoires d'architecture, de bibliothèque, non, rien de tout ça.
Sortant ma pelle et mon casque de mineur, je creuse un peu plus. Et je me rends compte du problème suivant : dzhandle appelle /usr/lib/zope2.12/bin/mkzopeinstance. Ce programme a comme shebang (le nom de l'interpréteur à utiliser, après le #! initial) un script nommé /usr/lib/zope2.12/bin/python qui lui-même utilise le Python du système mais en lui rajoutant des chemins de recherche.
Donc : un programme utilise comme interpréteur un autre programme lui-même interprété. On a un shebang récursif. Or, le noyau utilisé jusque là sur nos VMs, le 2.6.26-xen de la Lenny, ne supporte pas les shebang récursif.
Il a donc fallu mettre à jour le noyau utilisé par la VM, opération délicate vu que nos DOM0 n'ont pas encore été migrés en Squeeze (cette opération est prévue, mais non réalisée pour l'instant).
En effet, en utilisant le 2.6.32 des backports de la Lenny, la machine virtuelle se bloquait sur le "Waiting for root filesystem...".
Après avoir testé différentes options (le noyau en -xen ou pas, les disques en sda1/sda2 ou en xvda/xvdb, ...), je finis par comprendre que c'était le module blkfront (utilisé pour gérer les disques en mode paravirtualisé sur Xen) qui n'était pas inclus à la construction de l'initrd.
Assez surpris d'avoir du creuser aussi profondément et d'avoir du me battre avec un noyau, un xen et un initrd pour une histoire de shebang, j'ai utilisé une solution radicale : copier l'image du noyau et l'initrd installés sur une Squeeze, et les utiliser pour démarrer cette VM. C'est du temporaire, les DOM0 seront migrés d'ici peu. Mission accomplie.
Maintenant qu'un Zope 2.12 géré en paquets Debian et via dzhandle tourne, il ne restait plus qu'à installer un Plone 4 dessus.
Mais Plone lui-même n'est plus diffusé sous la forme d'un tarball non plus. Il a donc fallu écrire un script qui, depuis un Plone installé via l'Unified Installer, fait le tri entre :
Ensuite, il n'y a plus qu'à installer ces eggs dans le lib/python de l'instance créée par dzhandle, et le tour est joué.
Ce tarball est disponible dans https://svn.pilotsystems.net/projets/plone-tar/
Actuellement, le Zope est géré par l'architecture Debian, mais Plone est plutôt installé manuellement instance par instance. Cette solution est peu satisfaisante, et il serait souhaitable de créer un paquet Debian pour Plone.
Le problème est qu'un changement de version de Plone, même mineur (du 4.0.4 au 4.0.5 par exemple) n'est pas une opération anodine, et demande des interventions dans la ZMI et peut perturber le fonctionnement d'applications tierces. Il faudra donc :
Bien que tout cela soit encore neuf et nécessite un peu de stabilisation, les paquets de Zope 2.12 sur Debian sont installables et utilisables au quotidien, et offrent les principaux avantages recherchés par Pilot Systems, afin d'intégrer de manière industrielle des sites Plone dans un parc d'hébergement très varié au niveau des technologies utilisées, sans avoir à maintenir une multitude de systèmes d'installation et de déploiement, tout en bénéficiant, au maximum, des paquets Debian avec la qualité et le niveau de support (en particulier sur la sécurité) qui font, à juste titre, la réputation de Debian.
Actions sur le document