Plugins Hudson – Episode 1 : La création du plugin


Aujourd’hui, nous allons traiter du développement de plugins pour Hudson.

Cela fait maintenant un peu plus d’un mois que je travaille sur un plugin hudson permettant de générer des statistiques globales sur l’état d’exécution des jobs hudson : le global-build-stats hudson plugin. Ce plugin est particulièrement utile pour du monitoring Hudson et permet de détecter des problèmes sur différents axes : temps, typologie de build, typologie de résultat du build.

A l’occasion de la première release stable du plugin (la 0.1), j’ai décidé de partager sur ce blog l’ensemble des facilités et problèmes que j’ai pu rencontrer durant les développements de ce plugin. Ces retours seront formalisés par un ensemble de billets (à priori trois ou quatre) s’organisant autours des problématiques suivantes :

  • Mise en place d’un nouveau plugin
  • Comment et où poser des points d’extension
  • Présentation du framework MVC d’Hudson : Stapler
  • Persister ses données
  • Coté présentation : le scripting Jelly et les comportements javascript d’Hudson
  • La première release : le déploiement et les outils de communication autours du plugin
  • La mise en place de la sécurité

La mise en place d’un nouveau plugin Hudson

Avant de se lancer dans les développements d’un nouveau plugin, une rapide recherche sur le wiki d’Hudson permet de voir si votre besoin n’a pas déjà été couvert par la multitude de plugins déjà développés à ce jour.

Si tel n’est pas le cas : vous pourrez démarrer la création de votre plugin !

Initialisation du SCM

La première question que vous aurez à vous poser est « où est-ce que j’héberge mon code source ? ».
L’équipe d’Hudson vous encourage fortement à publier le code source de votre plugin dans le même repository SVN que celui d’Hudson. Si votre plugin est open source, je vous conseille cette voie-là car cela permet :

  • De constituer un pool de sources d’exemple pour les débutants qui n’ont jamais écrit de plugin Hudson (c’était mon cas au lancement et cela m’a beaucoup servi !)
  • Comme le précise cette page, le source produit appartient aux personnes qui y contribuent sous la licence MIT par défaut (cette licence pouvant être modifiée si besoin est).

Si vous désirez utiliser le repository SVN d’Hudson, il est nécessaire de faire une demande d’accès en envoyant un mail à dev@hudson.dev.java.net en fournissant un identifiant java.net.
Pour ma part, suite à ma requête, Andrew Bayer m’a répondu en me donnant les droits dans les 5 minutes !

Suite à l’acquisition des droits vous pourrez créer le répertoire racine de votre plugin ici : https://svn.dev.java.net/svn/hudson/trunk/hudson/plugins/

De plus, si vous êtes débutant dans le développement de plugin Hudson, tentez d’identifier dans les plugins existants, des fonctionnalités similaires à celles que vous voudriez mettre en place dans votre plugin. Faites un checkout des sources de ces plugins et parcourez un peu ces dernières de manière à voir comment structurer vos développements.
Le plugin hello-world est un bon plugin d’exemple pour commencer.

Mise en place de l’arborescence des sources

La construction d’Hudson et de ses plugins est basé sur Maven. Pour pouvoir développer et tester votre plugin, il sera nécessaire d’utiliser ce moteur de Builds.
Vous pouvez télécharger ce dernier sur le site d’apache maven.
Note: La version 3.0-alpha7 ne permet pas de builder les plugins hudson : il faudra plutôt se tourner, pour le moment, sur une version de la branche 2.X de Maven.

La suite de la marche à suivre pour initier votre plugin et développer ce dernier est très bien décrite sur le tutorial du wiki d’Hudson.

Vous pourrez notamment voir comment :

  • Créer un archetype (squelette d’application) de votre Plugin
  • Mettre en place la configuration nécessaire dans votre IDE favori
  • Compiler et debugger votre plugin

Au sujet de ce dernier point, je tiens à insister sur la facilité de test de votre plugin : grâce à la commande maven « mvn hpi:run », maven va :

  • Télécharger le runtime hudson dont vous dépendez (correspondant à la version du parent hudson utilisé dans votre pom.xml)
  • Déployer ce dernier sur un bundle de serveur jetty téléchargé via maven
  • Déployer votre plugin sur le serveur Hudson ainsi mis en place
  • Faire du redéploiement à chaud à chaque modification effectuée sur votre source (à ce sujet, je vous conseille de mettre en place un paramètre -XX:PermSize=256m dans vos MAVEN_OPTS avant lancement du hpi:run : dans le cas contraire, au bout de 4 redéploiements à chaud, votre HEAP sera saturée)

Quelques notions à connaître pour démarrer rapidement

Si vous êtes habitués au développement avec maven et que vous avez lu le tutorial précédemment référencé, vous pourrez vous apercevoir d’une bizarrerie (dont je n’ai pour le moment pas compris la finalité) dans l’organisation des sources :

  • Les scripts Jelly (technologie utilisée pour construire les pages/fragments HTML) doivent se trouver dans le répertoire src/main/resources, habituellement réservé aux fichiers de paramétrage de l’application. Dans une application JEE « standard », ces ressources auraient dû se trouver dans src/main/webapp.
  • Seules les ressources statiques de l’application (images, pages HTML etc …) doivent se trouver dans src/main/webapp

Hudson utilise des conventions dans l’organisation des scripts Jelly :

  • Le fichier src/main/resources/index.jelly sera appelé pour construire le texte affiché en face de votre plugin dans la page listant les plugins disponibles (<HUDSON_ROOT_URL>/pluginManager/available)
  • Si vous créez un plugin nommé foo.bar.MonPlugin et héritant de la classe hudson.Plugin, les fichiers JELLY suivants seront chargés :
    • Le fichier Jelly foo/bar/MonPlugin/index.jelly sera chargé dans le src/main/resources lors de l’affichage de la page du plugin (http://${HUDSON_ROOT_URL}/plugin/${nom du plugin})
    • Le fichier Jelly foo/bar/MonPlugin/global.jelly sera chargé en tant que fragment lors du paramétrage d’hudson (http://${HUDSON_ROOT_URL}/configure)
  • Dans le cas d’un Plugin foo.bar.MonPlugin de type hudson.tasks.Builder (Plugin se déclenchant durant un build), le fichier Jelly foo/bar/MonPlugin/config.jelly sera chargé en tant que fragment lors du paramétrage des jobs (http://${HUDSON_ROOT_URL}/job/${nom du job}/configure)

Conclusion

Ceci clos le premier billet à propos de la création de plugins hudson.

Vous devriez maintenant être capable de récupérer les sources d’un plugin existant pour le débugger en local, voire de créer votre propre plugin.
Le prochain billet traitera d’aspects plus techniques afin de vous permettre d’implémenter la partie Java de votre plugin.

Références de l’article

Le wiki d’hudson : http://wiki.hudson-ci.org/display/HUDSON/Home
Le tutorial sur les plugins : http://wiki.hudson-ci.org/display/HUDSON/Plugin+tutorial
La page du plugin global-build-stats : http://wiki.hudson-ci.org/display/HUDSON/Global+Build+Stats+Plugin
La page traitant de la licence du code Hudson : http://wiki.hudson-ci.org/display/HUDSON/Copyright+on+source+code
La page de téléchargement de maven : http://maven.apache.org/download.html

Publicités
Publié dans Hudson, Maven. 2 Comments »

2 Réponses to “Plugins Hudson – Episode 1 : La création du plugin”

  1. Plugins Hudson – Episode 2 : Implémenter son premier plugin « Frédéric Camblor Dev Blog Says:

    […] PDRTJS_settings_1171117_post_56 = { "id" : "1171117", "unique_id" : "wp-post-56", "title" : "Plugins+Hudson+-+Episode+2+%3A+Impl%C3%A9menter+son+premier+plugin", "item_id" : "_post_56", "permalink" : "http%3A%2F%2Ffcamblor.wordpress.com%2F2010%2F04%2F10%2Fplugins-hudson-episode-2-implementer-son-premier-plugin%2F" } Suite de ma série de billets consacrés au développement de plugin Hudson : aujourd’hui, nous allons parler développement et mettre davantage les mains dans le cambouis que dans l’épisode 1. […]

  2. Plugins Hudson – Episode 3 : Des formulaires et des données « Frédéric Camblor Dev Blog Says:

    […] de créer ma propre page dédiée au plugin (et intégrée au panel d’Administration, cf l’épisode 1) : <plugin […]


Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :