A la Poursuite du Code en Rouge

Avec la version 2.0 du Plugin CVS de Jenkins, on passe à une implémentation en Java du client CVS.

Mais attention : après redémarrage vos projets risquent fort de ne plus pouvoir s’authentifier en pserver. Car toutes les commandes « cvs -d :pserver:etc login » que vous utilisiez pour que Jenkins puisse lancer ses commandes CVS natives deviennent inutiles !
Il faut maintenant aller cocher la case « This Connection Requires A Password » sur la configuration du Job et saisir le mot de passe…

En échange, on n’est plus limité à une seule branche pour tous les modules pour un job : on peut donc construire un module A sur HEAD et B sur BRANCHE_2_0_0 dans un même job. Ça tombe bien, j’en ai eu besoin récemment.

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 :
    Razzserver: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.