<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>aheritier.net &#187; Hudson</title>
	<atom:link href="http://blog.aheritier.net/tag/hudson/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aheritier.net</link>
	<description></description>
	<lastBuildDate>Mon, 30 Jan 2012 16:35:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Convertir en masse les notifications standard Hudson par celles du plugin Email-Ext</title>
		<link>http://blog.aheritier.net/convertir-en-masse-les-notifications-standard-hudson-par-celles-du-plugin-email-ext/</link>
		<comments>http://blog.aheritier.net/convertir-en-masse-les-notifications-standard-hudson-par-celles-du-plugin-email-ext/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 07:00:23 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Hudson]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=891</guid>
		<description><![CDATA[Chez eXo platform nous utilisons Hudson pour notre intégration continue. La combinatoire entre les différents types de builds (intégration continue, reporting, packaging), les différents projets et leurs différentes branches de maintenance représente des dizaines de jobs dans Hudson. Jusqu&#8217;à présent &#8230; <a href="http://blog.aheritier.net/convertir-en-masse-les-notifications-standard-hudson-par-celles-du-plugin-email-ext/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=8.0" /></div><div>Rating: 8.0/<strong>10</strong> (1 vote cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.aheritier.net/wp-content/uploads/2010/02/butler.png"><img src="http://blog.aheritier.net/wp-content/uploads/2010/02/butler.png" alt="" title="butler" width="96" height="96" class="alignright size-full wp-image-875" /></a>Chez <a href="http://www.exoplatform.com">eXo platform</a> nous utilisons <a href="https://hudson.dev.java.net/">Hudson</a> pour notre <a href="http://builder.exoplatform.org">intégration continue</a>.<br />
La combinatoire entre les différents types de builds (intégration continue, reporting, packaging), les différents projets et leurs différentes branches de maintenance représente des dizaines de jobs dans Hudson.<br />
Jusqu&#8217;à présent nous utilisions les notifications standards de Hudson pour recevoir les emails avec les statuts courant des jobs.<br />
Il faut cependant avouer que celles-ci offrent très peu souplesse en ce qui concerne le contenu et les conditions de notification.<br />
<span id="more-891"></span><br />
J&#8217;ai donc installé le plugin <a href="http://wiki.hudson-ci.org/display/HUDSON/Email-ext+plugin">Hudson Email Extension Plugin</a> qui est beaucoup plus paramétrable.<br />
Après quelques tests concluant sur un nombre limité de projets, j&#8217;en viens donc au déploiement global sur l&#8217;ensemble des jobs hudson.<br />
Et là c&#8217;est la catastrophe !!!! Hudson ne propose pas d&#8217;édition en masse de ses jobs (à part le plugin <a href="http://wiki.hudson-ci.org/display/HUDSON/Configuration+Slicing+Plugin">Configuration Slicing plugin</a> mais qui ne gère qu&#8217;un nombre très restreint d&#8217;éléments de configuration).<br />
Alors comment faire ?<br />
Après un rapide tour sur la liste de diffusion du projet  on me conseil &#8220;tout simplement&#8221; d&#8217;utiliser la capacité de modification à chaud du serveur à l&#8217;aide de sa console Groovy.<br />
Celle-ci est effectivement bien plus puissante qu&#8217;un simple &#8220;Bulk change&#8221; puisque l&#8217;on peut accéder à l&#8217;ensemble des objets en mémoire sur le serveur (et donc à la configuration des jobs).<br />
Le gros avantage de cette solution &#8220;codée&#8221; c&#8217;est aussi qu&#8217;elle me permet de reprendre les listes de destinataires utilisées par le mécanisme de notification standard afin de les injecter dans la nouvelle configuration.</p>
<p>Ce script execute donc pour chaque job les étapes suivantes :</p>
<ul>
<li>Si le job est de type Maven alors j&#8217;enregistre la liste de destinataires depuis le &#8220;reporter&#8221; et je le retire du job.</li>
<li>Dans tous les cas je regarde les &#8220;publishers&#8221; actuels et si il y a les notifications standards ou du plugin mail-ext j&#8217;enregistre la liste de destinataires (donc la liste de mail-ext écrase celle de la notification standard si elle existait qui elle même écrase celle de maven si elle existait) et je retire le ou les &#8220;publishers&#8221;.</li>
<li>Je crée et rajoute au job mon nouveau &#8220;publisher&#8221; mail-ext configuré selon mes besoins.</li>
</ul>
<p>J&#8217;ai ainsi pu mettre à jour tous les jobs de mon serveur sans erreur et sans tâche manuelle fastidieuse.</p>
<p>Ci dessous le script groovy (n&#8217;étant ni expert en groovy et encore moins dans les APIs d&#8217;Hudson que je découvre, ce code doit être facilement améliorable).</p>
<p>[sourcecode lang="groovy"]<br />
import hudson.plugins.emailext.*<br />
import hudson.plugins.emailext.plugins.trigger.*<br />
import hudson.plugins.jira.*<br />
import hudson.model.*<br />
import hudson.maven.*<br />
import hudson.maven.reporters.*<br />
import hudson.tasks.*</p>
<p>// For each project<br />
for(item in Hudson.instance.items) {<br />
  def recipients<br />
  println(&#8220;JOB : &#8220;+item.name);</p>
<p>  // Find current recipients defined in project</p>
<p>  if(item instanceof MavenModuleSet) {<br />
    println(&#8220;>MAVEN MODULE SET&#8221;);</p>
<p>    // Search for Maven Mailer Reporter<br />
    println(&#8220;>>Reporters&#8221;);<br />
    for(reporter in item.reporters) {<br />
      println(&#8220;>>> &#8220;+reporter);<br />
      if(reporter instanceof MavenMailer) {<br />
        recipients = reporter.recipients<br />
        // remove it<br />
        item.reporters.remove(reporter)<br />
      }<br />
    }<br />
  } else<br />
  if(item instanceof FreeStyleProject) {<br />
    println(&#8220;>FREESTYLE PROJECT&#8221;);<br />
  }</p>
<p>  println(&#8220;>>Publishers&#8221;);<br />
  for(publisher in item.publishersList) {<br />
    println(&#8220;>>> &#8220;+publisher);<br />
    // Search for default Mailer Publisher<br />
    if(publisher instanceof Mailer) {<br />
      recipients = publisher.recipients<br />
      // remove it<br />
      item.publishersList.remove(publisher)<br />
    } else<br />
    // Or for Extended Email Publisher<br />
    if(publisher instanceof ExtendedEmailPublisher) {<br />
      recipients = publisher.recipientList<br />
      item.publishers.remove(publisher)<br />
      // remove it<br />
      item.publishersList.remove(publisher)<br />
    }<br />
  }</p>
<p>  // If we found recipients list to send mail<br />
  if(recipients!=null){<br />
    println (&#8220;>CURRENT RECIPIENT : &#8220;+recipients)<br />
    // We create a new Extended Email Publisher<br />
    def eep = new ExtendedEmailPublisher();<br />
    eep.recipientList = recipients<br />
    eep.defaultSubject = &#8220;\$DEFAULT_SUBJECT&#8221;<br />
    eep.defaultContent = &#8220;\$DEFAULT_CONTENT&#8221;<br />
    // With some triggers<br />
    eep.configuredTriggers.add(new FailureTrigger(<br />
      email : new EmailType(sendToRecipientList : true,<br />
        body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,<br />
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))<br />
    eep.configuredTriggers.add(new FixedTrigger(<br />
      email : new EmailType(sendToRecipientList : true,<br />
        body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,<br />
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))<br />
    eep.configuredTriggers.add(new StillFailingTrigger(<br />
      email : new EmailType(sendToRecipientList : true,<br />
        body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,<br />
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))<br />
    eep.configuredTriggers.add(new StillUnstableTrigger(<br />
      email : new EmailType(sendToRecipientList : true,<br />
        body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,<br />
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))<br />
    eep.configuredTriggers.add(new UnstableTrigger(<br />
      email : new EmailType(sendToRecipientList : true,<br />
         body : ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT,<br />
        subject : ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT )))<br />
    // And we add/replace it in the project<br />
    item.publishersList.replace(eep);<br />
  }else{<br />
    println (&#8220;>NO RECIPIENT&#8221;)<br />
  }</p>
<p>  println(&#8220;\n=======\n&#8221;);<br />
}<br />
[/sourcecode]</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=8.0" /></div><div>Rating: 8.0/<strong>10</strong> (1 vote cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/convertir-en-masse-les-notifications-standard-hudson-par-celles-du-plugin-email-ext/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>N&#8217;utilisez pas Hudson 1.344 !!</title>
		<link>http://blog.aheritier.net/nutilisez-pas-hudson-1-344/</link>
		<comments>http://blog.aheritier.net/nutilisez-pas-hudson-1-344/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 07:25:24 +0000</pubDate>
		<dc:creator>Arnaud Héritier</dc:creator>
				<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.aheritier.net/?p=874</guid>
		<description><![CDATA[Je vous aurai prévenu J&#8217;ai découvert un bug bloquant (http://issues.hudson-ci.org/browse/HUDSON-5536) qui corrompt les données locales. Ainsi même un retour en arrière sur la version d&#8217;Hudson ne vous corrige pas le problème. La correction manuelle à faire sur les fichiers Hudson &#8230; <a href="http://blog.aheritier.net/nutilisez-pas-hudson-1-344/">Continuer la lecture <span class="meta-nav">&#8594;</span></a><br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>Je vous aurai prévenu <img src='http://blog.aheritier.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <a href="http://blog.aheritier.net/wp-content/uploads/2010/02/butler.png"><img src="http://blog.aheritier.net/wp-content/uploads/2010/02/butler.png" alt="" title="butler" width="96" height="96" class="alignright size-full wp-image-875" /></a><br />
J&#8217;ai découvert un bug bloquant (<a href="http://issues.hudson-ci.org/browse/HUDSON-5536">http://issues.hudson-ci.org/browse/HUDSON-5536</a>) qui corrompt les données locales. Ainsi même un retour en arrière sur la version d&#8217;Hudson ne vous corrige pas le problème. La correction manuelle à faire sur les fichiers Hudson est décrite dans l&#8217;issue Jira si par malchance vous avez déjà fait l&#8217;upgrade et que comme moi vous vous retrouvez avec tous vos builds KO.<br />
L&#8217;équipe va probablement sortir une version 1.345 en urgence dans les heures à venir.<br />
Merci à <a href="http://andrewbayer.com/">Andrew Bayer</a> (<a href="http://twitter.com/abayer">@abayer</a> sur twitter) pour son coup de main.</p>
<br /><div><img src="http://blog.aheritier.net/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://blog.aheritier.net/nutilisez-pas-hudson-1-344/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

