A la Poursuite du Code en Rouge

Je suis allé Vendredi dernier à cette rencontre des utilisateurs de Jenkins (ex-Hudson). C’était l’occasion de rencontrer son créateur Kohsuke Kawaguchi et d’échanger autour de cette technologie. Je vais essayer de résumer les différentes présentations (la liste ici).

 

A ma gauche : Hudson ; à ma droite : Jenkins

Si mes comptes sont exacts nous avons 4 offres tirées de Hudson :

  • Le Hudson d’origine, proposé à la fondation Eclipse
  • Sonatype Pro for Hudson, branche commerciale basée sur Hudson
  • Jenkins, le fork open-source des contributeurs initiaux
  • Nectar de CloudBees, offre commerciale basée sur Jenkins

KK nous a présenté des chiffres démontrant que presque tous les contributeurs ont sauté dans le train Jenkins, alors que Hudson fait du sur-place. Alors, fini, Hudson ? J’espère que non. Certes, c’est gênant de devoir choisir entre deux produits aussi similaires. Mais Hudson@Oracle avait marqué des points dans mon cœur en mettant tout de suite la priorité sur le test et l’assurance qualité. En proposant de ralentir le rythme (hebdomadaire !) de releases. Car c’était mon principal (en fait, le seul) reproche à Hudson : son instabilité. A côté des nouvelles fonctions chaque livraison corrige les régressions du mois dernier et introduit son nouveau lot de régressions. Et si ce n’est pas le noyau, c’est dans les plugins (d’ou des initiatives comme le Plugin Compatibility Tester). Hudson peut donc aiguillonner Jenkins pour améliorer ses tests de non-régression. Mais il est prévu que Nectar (payant) soit justement cette version stable de Jenkins et de ces plugins principaux, avec -ohsurprise- une « QA Suite » complète. Jenkins donc pour sa partie open-source ne compte pas changer sa façon d’évoluer. J’attends donc un peu avant de tout miser sur Hudson ou sur Jenkins.

De l’importance d’un serveur build incassable

Dans une approche d’intégration continue, on se donne pour objectif lors du développement que le build soit toujours réussi. Tout changement provoquant une erreur va alerter les développeurs qui devront au plus tôt corriger leur code de façon à réussir le build. Le serveur de construction devient donc critique : s’il y a une régression dans le processus de construction, c’est potentiellement tous les builds qui vont passer au rouge ! Tous les utilisateurs présents Vendredi avaient soit des environnements séparés de qualification de Jenkins avec des projets de tests, soit un mécanisme pour pouvoir à tout moment revenir sur une mise-à-jour.

Henri l’intégrateur

La meilleure présentation du jour était sans conteste celle de Nicolas De Loof sur la gestion des branches GIT dans Jenkins. On découvrait Henri, chargé de réaliser manuellement l’intégration des branches de développement tous les Vendredi soir. A comparer avec l’anti-pattern Bob the Builder. En passant, et ça va faire marrer mes collègues d’Oxiane qui me taxent de GITosceptique, j’y ai découvert le rerere (« reuse recorded resolution ») qui pour le coup ressemble bien à une killer-feature.

Le support de la présentation est visible en ligne sur slideshare.

Et puis tout le reste

Des pistes d’amélioration des performances, des retours d’expérience sur petits et gros déploiements, l’intégration de Sonar, une présentation détaillée de l’offre CloudBees… Si vous avez déployé Hudson ou Jenkins dans votre entreprise, je vous recommande de venir faire un saut au prochain meeting.

 

 

 

Comment peut-on utiliser des librairies tierces telles que commons-lang ou commons-io dans un plugin Eclipse ?

L’approche naïve que l’on trouve généralement via google consiste à embarquer le jar correspondant dans son plugin. Ainsi on peut l’ajouter au classpath du projet et l’utiliser. Inconvénient : chaque plugin embarque toutes ses dépendances, quitte à les ré-exporter, sans aucune gestion commune des dépendances. Bref, je trouve que l’on va un peu à l’encontre de l’esprit d’OSGi.

Eclipse Orbit

Une autre approche que je vous propose ici consiste à piocher dans le projet Eclipse Orbit (http://www.eclipse.org/orbit/). Ce projet essaie justement de mutualiser les librairies tierces pour tous les projets Eclipse et de les proposer sous forme de bundles OSGi. Exactement ce qu’il nous faut !  Nous allons donc ajouter une dépendance vers le plugin org.lalibrairie du projet Orbit au lieu d’embarquer lalibrairie.jar. On peut récupérer des bundles binaires prêts à l’emploi sur le site d’Orbit, mais je préfère récupèrer les librairies Orbit par CVS.

Voici ma procédure :

  1. Dans la vue CVS repositories (quel que soit votre outil de SCM, le plugin CVS est inclus dans la plupart des distributions d’Eclipse), je crée un nouveau repository CVS à partir de cet URL :
    :pserver:anonymous@dev.eclipse.org/cvsroot/tools
  2. En explorant ce repository, sous HEAD/org.eclipse.orbit, je vois l’ensemble des librairies disponibles.
  3. Je fais un checkout en tant que projet plugin de la (ou des) librairie(s) dont j’ai besoin.
    Par exemple, je prends org.apache.commons.lang, org.apache.commons.io et org.apache.commons.collections.
  4. Pour chaque projet récupéré ainsi, je vais faire un team>switch to another branch pour aller sur la branche correspondant à la version désirée. Par exemple, je bascule org.apache.commons.collections sur la branche v3_2 pour avoir dans mon workspace le bundle correspondant à la version 3.2 de commons-collections.
    Ça doit donner ça dans le workspace :
  5. Le plus gros est fait. Je peux maintenant ajouter très simplement la librairie dans l’onglet dependancies du plugin, comme je dépendrais de tout autre plugin.
  6. Ne pas oublier au moment de livrer d’ajouter les plugins provenant d’Orbit dans le(s) feature(s)


Crédits photo : NASA Goddard Space Flight CenterCertains droits réservés (licence Creative Commons)

Hudson est un serveur open-source de construction continue, développé à l’origine par Kohsuke Kawaguchi chez Sun pour répondre à des besoins internes (historiquement lors du développement de l’implémentation de JAXB). Ce logiciel a réussi à devenir la référence open-source dans son domaine, soutenu par une communauté très active qui a développé une galerie considérable d’extensions. Hudson construit maintenant en continu par exemple JBoss (serveur publiquement accessible ici), plusieurs projets de la fondation Apache (ici) ou bien Eclipse (ici).

Oracle continue à utiliser Hudson en interne, par exemple pour glassfish, mais sans que ce soit une de ses priorités. Après le rachat de Sun, Kohsuke a donc pu les quitter pour fonder sa société, InfraDNA, qui commercialise du service et une offre de version certifiée de Hudson. C’est cette société qui vient d’annoncer son achat par une autre startup : CloudBees. En résumé, CloudBees promet de fournir un environnement complet de développement et d’exécution des technologies Java en Cloud Computing, respectivement DEV@Cloud et RUN@Cloud.

Le résultat est une nouvelle offre commerciale basée sur Hudson : le serveur Nectar. Il s’agit d’une distribution certifiée (c’est-à-dire maintenue commercialement) de Hudson qui inclut des fonctionnalités avancées de monitoring et de fonctionnement en mode cloud absentes de la version open-source. On peut soit acheter une licence et se l’installer de façon classique, soit l’utiliser en mode hébergé chez CloudBees, avec des référentiels Git et Maven privatifs. Le principe est de porter toute son infrastructure de développement dans le Cloud de CloudBees, en profitant de la scalabilité de leur infrastructure et en payant à l’usage. L’intégralité du communiqué de presse en anglais ici.

Conjectures et réfutations

Karl Popper est un philosophe des sciences ayant fait des apports majeurs à l’épistémologie, avec entre autres sa définition de la démarche scientifique par la réfutabilité. Je me suis amusé à appliquer certaines de ses thèses à la mise au point de programmes, en supposant qu’un programme soit une connaissance objective au même titre qu’un théorème ou qu’une théorie scientifique.

Si on applique ces thèses, on peut démontrer que la lecture du code source ne suffit pas, par la seule puissance de la déduction, à prouver que le programme est correct. D’ailleurs, un test ne peut pas prouver la validité d’un programme, au contraire, il ne peut que mettre en évidence une erreur. Popper démontre que le raisonnement inductif n’est pas la méthode rationnelle pour se rapprocher de la vérité, mais que nous procédons par conjectures et réfutations. Tout raisonnement fonctionnerait à partir de théories que l’on essaie de contredire, par l’expérimentation ou par la logique. Pour valider un programme on cherche à le mettre en défaut, ce qui est pourtant intuitivement l’inverse du résultat visé.

Je vois donc la programmation comme l’ajout de conjectures sur un fond initial (langage de programmation employé, librairies, système d’exploitation, autres applications). Fond qui, en passant, est également réfutable selon Popper, contredisant les philosophes affirmant que tout raisonnement rationnel ne se fait qu’à partir d’une base de vérités que l’on augmente par déduction.

En poussant plus loin l’analogie, le test unitaire consisterait donc à tenter de réfuter la conjecture (le programme). Popper affirme également qu’une théorie qui en supplante une autre doit expliquer mieux ou plus de choses que la précédente mais également « survivre » aux mêmes tentatives de réfutation. C’est ce que j’appellerais les tests de non-régression.

Mais alors, si programme = conjecture et test = réfutation, que penser de cette pratique XP : « écrire systématiquement les test unitaires en premier, et ensuite seulement le programme qui va passer les tests unitaires avec succès » (le fameux Test-Driven Development) ?

En termes « popperiens » cela revient à faire des réfutations avant même de conjecturer ! Les « XPeurs » feraient-ils de la programmation d’une façon irrationnelle ?

Disons plutôt que cela signifie que la conjecture est implicite, qu’elle trotte dans la tête du programmeur (ou est discutée au sein du binôme pour ceux qui pratiquent également le « pair-programming ») pendant la programmation des réfutations/tests. Et c’est seulement une fois que toutes les réfutations sont posées que l’on rédige l’équation ou le programme. Connaissant à l’avance les tests, la programmation ressemble plus à mon avis à une sorte de régression au sens statistique (trouver la courbe qui passe par tous les points connus à l’avance).

Cela revient à peser tous les cailloux de la terre et trouver l’équation vraie pour tout un tas de cailloux donné afin de formuler la gravité. Il me semble donc à la fois plus rationnel (et plus intuitif, je l’avoue) de poser la conjecture (le programme) avant d’essayer de le réfuter (par les tests).

La connaissance objective

La connaissance objective

Là où je rejoins les partisans du test extrême c’est que la qualité d’un programme est proportionnelle à la quantité de tests tentant de le réfuter, tout comme la meilleure théorie, toutes choses égales par ailleurs, est celle qui se prête et s’est prêtée au plus de tentatives de réfutation.

Ayant moins de connaissances en philosophie qu’en informatique, il est probable que je résume mal la pensée de Popper, je vous recommande donc chaudement la lecture de l’original, comme par exemple « la connaissance objective » disponible en livre de poche.