<?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>Xnoccio.com &#187; Hudson</title>
	<atom:link href="http://www.xnoccio.com/es/tag/hudson/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xnoccio.com</link>
	<description>Blog de viavansi</description>
	<lastBuildDate>Fri, 27 Jan 2012 19:59:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hudson: Nuestro compañero</title>
		<link>http://www.xnoccio.com/es/1288-hudson_integracion_continua_uso_estadisticas/</link>
		<comments>http://www.xnoccio.com/es/1288-hudson_integracion_continua_uso_estadisticas/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 14:11:09 +0000</pubDate>
		<dc:creator>Felix G. Borrego</dc:creator>
				<category><![CDATA[javahispano]]></category>
		<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Integración Continua]]></category>

		<guid isPermaLink="false">http://www.xnoccio.com/?p=1288</guid>
		<description><![CDATA[Os dejamos las estadísticas de uso de nuestra herramienta de integración continua preferida!
Hace más de 2 años que usamos Hudson como herramienta en todos nuestros proyectos de desarrollo, y en poco tiempo pasó a convertirse en un pilar central de nuestro entorno de desarrollo.
Tras estos dos años, estos son los datos:





Proyectos gestionados (Jobs configurados)
192


Proyectos en [...]]]></description>
			<content:encoded><![CDATA[<p>Os dejamos las estadísticas de uso de nuestra herramienta de integración continua preferida!<br />
Hace más de 2 años que usamos Hudson como herramienta en todos nuestros proyectos de desarrollo, y en poco tiempo pasó a convertirse en un pilar central de nuestro entorno de desarrollo.</p>
<p>Tras estos dos años, estos son los datos:</p>
<table border="1" cellspacing="0" cellpadding="4" width="100%" bordercolor="#000000">
<col width="128*"></col>
<col width="128*"></col>
<tbody>
<tr valign="TOP">
<td width="50%">Proyectos gestionados (Jobs configurados)</td>
<td width="50%">192</td>
</tr>
<tr valign="TOP">
<td width="50%">Proyectos en Activo:</td>
<td width="50%">52 *(usados en los últimos 20 días)</td>
</tr>
<tr valign="TOP">
<td width="50%"><strong>Numero total de compilaciones realizadas</strong></td>
<td width="50%"><strong>6442</strong></td>
</tr>
<tr valign="TOP">
<td width="50%">Despliegues automáticos al servidor de desarrollo</td>
<td width="50%">4127 (sobre nuestros 5 entornos)</td>
</tr>
<tr valign="TOP">
<td width="50%">Media de operaciones diarias:</td>
<td width="50%">12</td>
</tr>
</tbody>
</table>
<p>La instalación es la por defecto sobre Linux, junto a un Slave que utilizamos puntualmente para las test sobre Windows.</p>
<p>Respecto a los plugins, aunque le hemos dado una oportunidad a practicamente todos, estos son los más utilizados:</p>
<ul>
<li><span style="font-size: 13.3333px;">SVNCopyPlugin (Plugin desarrollado internamente por Viavansi para la sincronización con el SVN del cliente tras despliegues exitosos)</span></li>
<li><span style="font-size: 13.3333px;">Hudson SCP Publisher Plugin (desarrollado internamente para publicar en nuestro sistema de descargas )</span></li>
<li><span style="font-size: 13.3333px;"> </span><span style="font-size: 13.3333px;">ChuckNorris Plugin</span></li>
<li><span style="font-size: 13.3333px;"> </span><span style="font-size: 13.3333px;">SubversionTaggin Plugin</span></li>
<li><span style="font-size: 13.3333px;"> </span><span style="font-size: 13.3333px;">Disk Usage Plugin</span></li>
<li><span style="font-size: 13.3333px;">Seleniumhq Plugin</span></li>
<li><span style="font-size: 13.3333px;">Sonar Plugin</span></li>
<li><span style="font-size: 13.3333px;">Dependency Analyzer</span></li>
<li><span style="font-size: 13.3333px;">Backup Plugin</span></li>
<li><span style="font-size: 13.3333px;">Deploy Plugin</span></li>
<li><span style="font-size: 13.3333px;">SCP Plugin</span></li>
<li><span style="font-size: 13.3333px;">Jabber Plugin</span></li>
</ul>
<p>Algunos artículos relacionados:</p>
<p>Introducción a Hudson: <span style="font-size: 13.3333px;"><a href="http://www.xnoccio.com/362-hudson-parte-1-introduccion/">http://www.xnoccio.com/362-hudson-parte-1-introduccion/<br />
</a></span><span style="font-size: 13.3333px;">Introducción al desarrollo de Plugins: <a href="http://www.xnoccio.com/464-hudson-parte-2-crea-tus-propios-plugins/">http://www.xnoccio.com/464-hudson-parte-2-crea-tus-propios-plugins/<br />
</a></span><span style="font-size: 13.3333px;">Comparatíva: <a href="http://www.xnoccio.com/368-eligiendo-nuestro-entorno-de-integracion-continua-i/">http://www.xnoccio.com/368-eligiendo-nuestro-entorno-de-integracion-continua-i/</a><br />
y conclusiones <span style="font-size: 13.3333px;"><a href="http://www.xnoccio.com/372-conclusiones-finales-eligiendo-nuestro-entorno-de-integracion-continua-v/">http://www.xnoccio.com/372-conclusiones-finales-eligiendo-nuestro-entorno-de-integracion-continua-v/</a></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/1288-hudson_integracion_continua_uso_estadisticas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hudson. Parte 2. Crea tus propios plugins</title>
		<link>http://www.xnoccio.com/es/464-hudson-parte-2-crea-tus-propios-plugins/</link>
		<comments>http://www.xnoccio.com/es/464-hudson-parte-2-crea-tus-propios-plugins/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 13:09:33 +0000</pubDate>
		<dc:creator>efernandez</dc:creator>
				<category><![CDATA[javahispano]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://xnoccio.com/464-hudson-parte-2-crea-tus-propios-plugins/</guid>
		<description><![CDATA[Una de las ventajas de Hudson es la posibilidad que nos ofrece de ampliar su funcionalidad mediante su sistema de plugins. De esta forma, podemos realizar acciones sobre los builds, tales como generación de informes, controladores, acciones sobre el código fuente, etc. En Internet podemos encontrar algunas páginas de donde descargar plugins para Hudson, como [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm">Una de las ventajas de Hudson es la posibilidad que nos ofrece de ampliar su funcionalidad mediante su sistema de plugins. De esta forma, podemos realizar acciones sobre los builds, tales como generación de informes, controladores, acciones sobre el código fuente, etc. En Internet podemos encontrar algunas páginas de donde descargar plugins para Hudson, como por ejemplo <font color="#0000ff"><u><a href="http://hudson.gotdns.com/wiki/display/HUDSON/Plugins">http://hudson.gotdns.com/wiki/display/HUDSON/Plugins</a></u></font>.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Aún disponiendo de una cantidad considerable de plugins en la red que cubran la mayoría de las necesidades, nos podemos encontrar en la situación de tener que crear uno propio. Si te has planteado desarrollar uno te habrás dado cuenta de que la documentación en Internet sobre cómo crear un plugin es muy escasa, estando el grueso de la información en sólo dos páginas: <font color="#0000ff"><u><a href="http://hudson.gotdns.com/wiki/display/HUDSON/Plugin+tutorial">http://hudson.gotdns.com/wiki/display/HUDSON/Plugin+tutorial</a></u></font> y <font color="#0000ff"><u><a href="http://javaadventure.blogspot.com/2008/01/writing-hudson-plug-in-part-1.html">http://javaadventure.blogspot.com/2008/01/writing-hudson-plug-in-part-1.html</a></u></font>.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Pues bien, en Viavansi surgió la necesidad de crear un plugin para Hudson que subiera el código fuente de un proyecto a un repositorio de Subversion, de forma que se automatizara esta tarea cada vez que Hudson hiciera un build.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">El plugin constará de una parte de configuración en donde el usuario encargado de cada proyecto introducirá la url del repositorio de Subversion donde desea subir el código, los parámetros relativos al repositorio (nombre de usuario y password) así como dos entradas para ficheros que no se quieren subir o ficheros que no se quieren sobreescribir en el destino. Además dispondrá de una opción para habilitar o deshabilitar el plugin en todos los proyectos de forma global.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><strong>Creación de la estructura del plugin</strong></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Lo primero que vamos a tener que usar para crear el plugin es la herramienta Maven, la cual nos creará la estructura de paquetes, además de algunos ficheros de ejemplos. Esto era de esperar, pues Hudson internamente usa Maven para la creación de los builds de los proyectos.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Empezamos situandonos en una consola sobre nuestro directorio de proyectos y tecleamos:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><em>mvn hpi:create</em></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Después de pedirnos algunos datos como el identificador del grupo y el nombre del plugin, Maven nos creará la siguiente estructura:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">+ src</p>
<blockquote>
<p style="margin-bottom: 0cm">+ main</p>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">        + java</p>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">             +  groupid.name</p>
</blockquote>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">                    +- PluginNamePublisher.java</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">                    +- PluginImpl.java</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<blockquote>
<p style="margin-bottom: 0cm">        + resources</p>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">                +  groupid.name.project</p>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">                                +- config.jelly</p>
</blockquote>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">                                +- global.jelly</p>
</blockquote>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">                +- index.jelly</p>
</blockquote>
</blockquote>
<blockquote>
<p style="margin-bottom: 0cm">        + webapp</p>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">            +- help-globalConfig.html</p>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm">            +- help-projectConfig.html</p>
</blockquote>
</blockquote>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Por defecto, se crean unos ficheros de ejemplo (el archiconocido HelloWorld) que podemos usar para ver cómo está implementado un plugin sencillo.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Si queremos tener soporte en nuestro IDE para la implementación del plugin deberemos, en el caso de Eclipse, tendremos que introducir lo siguiente:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><font face="Courier New, monospace"><font size="2"><em>mvn -DdownloadSources=true eclipse:eclipse</em></font></font></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Si tenemos otros entornos como Netbeans o IntelliJ, existen plugins específicos de Maven para estos IDEs.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Bien, acabamos de crear la estructura de nuestro primer plugin, nos falta decirle a Hudson qué tipo de plugin hemos desarrollado, agregar la lógica y crear los campos visuales para que se añadan a las páginas de configuración de los proyectos.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><strong>Creando el plugin</strong></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Uno de los aspectos más importantes en la creación de un plugin para Hudson consiste en determinar el tipo de proyecto para el que va a ser utilizado. En nuestro caso utilizamos proyectos de tipo Maven, por lo cual necesitamos publicar el plugin en Hudson a través de un Publisher; en caso contrario (para proyectos de tipo Ant, por ejemplo) necesitaríamos publicarlo usando un Builder. Otra de las características de usar un Publisher frente a un Builder consiste en que la acción se ejecuta cuando un proyecto ha terminado de hacer el build.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Para publicar el plugin mediante un Publisher basta con tocar la clase PlugImp quedando de la siguiente forma:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>class</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><span style="background: #c0c0c0 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">PluginImpl</span></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>extends</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> Plugin {</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>void</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> start() </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>throws</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> Exception {</span></font></font></font></p>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    <font face="Courier New, monospace"><font size="2">	</font></font></font><font color="#3f7f5f"><font face="Courier New, monospace"><font size="2">//Publicamos el descriptor del plugin</font></font></font></p>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">    <font face="Courier New, monospace"><font size="2">	</font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">Publisher.</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><em>PUBLISHERS</em></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">.add(SVNCopyPublisher.</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><em>DESCRIPTOR</em></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">);</span></font></font></font></p>
</blockquote>
</blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#000000"><font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2">}</font></font></font></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">En este código podemos ver como se ha modificado la clase inicialmente creada por Maven, añadiendo la línea donde le decimos a Hudson que registre nuestro plugin. Debido a que la funcionalidad que queremos desarrollar consiste en copiar el código fuente de un proyecto a un repositorio de Subversion, el nombre de nuestro plugin será SVNCopyPlugin (original, verdad?), creando así la clase SVNCopyPublisher que será la que contenga el descriptor y la lógica de negocio.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Los elementos más importantes de la clase SVNCopyPublisher son:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<ul>
<li>Atributos necesarios para la 	ejecución de la lógica del plugin. En nuestro caso, url del 	repositorio, nombre de usuario, contraseña y listas con los 	ficheros que no queremos subir o que no queremos sobreescribir. Cada 	atributo deberá tener un método público get y set.</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0cm">Un constructor público en el que 	pasaremos los valores de los campos rellenados por el usuario en la 	configuración del plugin e inicializaremos los atributos definidos 	en el punto anterior. Además, este constructor deberá estar 	anotado con @DataBoundConstructor.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0cm">Un método perform en donde se 	colocará la lógica de nuestro plugin.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0cm">Un atributo estático y final 	llamado DESCRIPTOR que será instancia de una clase interna de 	nombre DescriptorImpl.</p>
</li>
</ul>
<p style="margin-bottom: 0cm">A su vez, la clase DescriptorImpl contendrá la configuración global del plugin. En el caso de SVNCopyPlugin hemos usado en la configuración local un checkbox con el cual activaremos el uso del plugin y sólo realizará la copia cuando esté activado.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Además esta clase debe contener:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<ul>
<li>
<p style="margin-bottom: 0cm">Los atributos propios de la 	configuración global del plugin, con sus gets y sets.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0cm">Un constructor protected sin 	parámetros.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0cm">El método configure que hará 	persistente la configuración global.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0cm">Un método newInstance que 	devolverá una instancia de nuestra clase Publisher con los valores 	introducidos por el usuario.</p>
</li>
</ul>
<p style="margin-bottom: 0cm">Hasta aquí ha sido todo teoría, veamos ahora como queda la clase SVNCopyPublisher y su clase interna DescriptorImpl:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>class</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> SVNCopyPublisher </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>extends</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> Publisher {</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"><font face="Courier New, monospace"><font size="2">	  </font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>private</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> Boolean </span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">enable</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">    </font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>private</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>final</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> String </span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">urlTarget</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">, </span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">nameTarget</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">, </span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">passTarget, filesTargetException, filesSourceException</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">     </font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">@DataBoundConstructor</span></font></font></font></p>
</blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"></span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> SVNCopyPublisher(String urlTarget, String nameTarget, String passTarget, String filesSourceException, String filesTargetException) {</span></font></font></font></p>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>this</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">.</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">urlTarget</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> = urlTarget;</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>this</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">.</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">nameTarget</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> = nameTarget;</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>this</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">.</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">passTarget</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> = passTarget;</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#7f0055">        <font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>this</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">.</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">filesTargetException</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> = filesTargetException;</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>	  this</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">.</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">filesSourceException</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> = filesSourceException;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">    <font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"><font face="Courier New, monospace"><font size="2">&#8230;</font></font></font></p>
</blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2">//GETTERS y SETTERS de los atributos</font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2">&#8230;</font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">    </font></p>
<p style="margin-bottom: 0cm"><font color="#000000"> </font></p>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>boolean</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> needsToRunAfterFinalized() {</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><strong>return</strong></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"> </font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><strong>true</strong></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2">;</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    <font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"> </font></p>
<p style="margin-bottom: 0cm"><font color="#000000">    </font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#3f7f5f"><font face="Courier New, monospace"><font size="2">/* </font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#3f7f5f"><font face="Courier New, monospace"><font size="2">* Contiene la lógica del plugin, que se ejecutará cuando termine el build de Hudson</font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#3f7f5f"><font face="Courier New, monospace"><font size="2">	 </font></font></font><font color="#3f7f5f"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*/</span></font></font></font></p>
</blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">	</span></font></font></font><font color="#646464"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">@Override</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">	</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>boolean</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> perform(AbstractBuild&lt;?, ?&gt; build, Launcher launcher, BuildListener listener) </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>throws</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> InterruptedException, IOException {</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"><font face="Courier New, monospace"><font size="2">		</font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">	</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>if</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">(</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">enable </span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">&amp;&amp;</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">build.getResult().equals(Result.SUCCESS)){</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">        <font face="Courier New, monospace"><font size="2">	</font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">		</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2">//Aquí debe ir la lógica de negocio del plugin</font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2">		…</font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">}</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">                </font></p>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>return</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>true</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"><font face="Courier New, monospace"><font size="2">	}</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">     </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> Descriptor&lt;Publisher&gt; getDescriptor() {</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">         </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>return</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><em>DESCRIPTOR</em></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">     <font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">     </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> Action getProjectAction(AbstractProject&lt; ?, ?&gt; project) {</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">         </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>return</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>null</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">     <font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">     </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">/**</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">     </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">Descriptor</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">should</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">be</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">singleton.</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">     </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*/</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">    </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>static</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>final</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> DescriptorImpl </span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><em>DESCRIPTOR</em></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> = </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>new</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> DescriptorImpl();</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">/**</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">     </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">Descriptor</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">for</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f3fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">{@link SVNCopyPublisher}</span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">.</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">Used</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">as</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">a</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">singleton.</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">     </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">The</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">class</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">is</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">marked</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">as</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">public</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">so</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">that</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">it</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">can</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">be</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">accessed</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">from</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">views.</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">     </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*/</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">    </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>static</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>final</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>class</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> DescriptorImpl </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>extends</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> Descriptor&lt;Publisher&gt; {</span></font></font></font></p>
</blockquote>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm" lang="en-GB">&nbsp;</p>
<p style="margin-bottom: 0cm"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">	</span></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">/**</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">       </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">If you don’t want fields to be persisted, use transient</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">       </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*/</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">            <font face="Courier New, monospace"><font size="2">	</font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">    <font face="Courier New, monospace"><font size="2"><span lang="en-GB">	</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>private</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>boolean</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">enable</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">;</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>protected</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> DescriptorImpl() {</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">            </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>super</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">(SVNCopyPublisher.</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>class</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">);</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">            <font face="Courier New, monospace"><font size="2">load();</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">        <font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">/**</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">         </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">This</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">human</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">readable</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">name</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">is</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">used</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">in</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">the</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">configuration</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">screen.</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">         </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*/</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> String getDisplayName() {</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">            </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>return</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#2a00ff"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">&#8220;SVNCopy Plugin Project Configuration&#8221;</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">        <font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">/**</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">         </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">Get</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">the</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">fields</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">from</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">the</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">global</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">configuration</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">form</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">and</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">persist</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">them.</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">         </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*/</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>boolean</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> configure(StaplerRequest req, JSONObject o ) </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>throws</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> FormException {</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">            </font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">enable</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> = o.getBoolean(</span></font></font></font><font color="#2a00ff"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">&#8220;enable&#8221;</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">);</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">            <font face="Courier New, monospace"><font size="2">save();</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">            </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>return</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>super</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">.configure(req,o);</span></font></font></font></p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">        <font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB">&nbsp;</p>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"> </font></p>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">/**</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000">         </font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">Creates</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">a</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">new</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">instance</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">of</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f3fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">{@link SVNCopyPublisher}</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">from</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">a</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">submitted</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">form.</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">		 </span></font></font></font><font color="#3f5fbf"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">*/</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">		</span></font></font></font><font color="#646464"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">@Override</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">		</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> SVNCopyPublisher </span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><span style="background: #c0c0c0 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">newInstance</span></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">(StaplerRequest req, JSONObject formData)</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong> throws</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> FormException {</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">			SVNCopyPublisher pub = req.bindJSON(SVNCopyPublisher.</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>class</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">, formData);</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">			pub.setEnable(</span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">enable</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">);</span></font></font></font></p>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">			</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>return</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> pub;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000"><font face="Courier New, monospace"><font size="2">		}</font></font></font></p>
</blockquote>
</blockquote>
<p style="margin-bottom: 0cm" lang="en-GB"><font color="#000000">        </font></p>
<blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>public</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>boolean</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> isEnable(){</span></font></font></font></p>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">        <font face="Courier New, monospace"><font size="2"><span lang="en-GB">	</span></font></font></font><font color="#7f0055"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"><strong>return</strong></span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB"> </span></font></font></font><font color="#0000c0"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">enable</span></font></font></font><font color="#000000"><font face="Courier New, monospace"><font size="2"><span lang="en-GB">;</span></font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm"><font color="#000000">        </font><font color="#000000"><font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
</blockquote>
<blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2">}</font></font></font></p>
</blockquote>
<p style="margin-bottom: 0cm"><font color="#000000"><font face="Courier New, monospace"><font size="2">}</font></font></font></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Del código de arriba podemos destacar el método perform, que es el encargado de llamar a la lógica del plugin, recibiendo como parámetros una instancia de AbstractBuild (usado para lanzar el plugin si el build ha terminado satisfactoriamente), una de Launcher que contiene datos de la máquina que realiza el build y otra de Listener, que entre otras cosas contiene el logger con el cual podemos imprimir en la consola web de Hudson nuestra salida del plugin. Otros métodos importantes son configure y newInstance que reciben como parámetros la petición del formulario de configuración y los datos introducidos por el usuario en forma de JSON. El parámetro StaplerRequest forma parte del framework Stapler utilizado por Hudson para la aplicación web y es útil si queremos obtener datos de la petición usando getParameter.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><strong>Generando los formularios y uniéndolos al código del plugin</strong></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Para terminar con el desarrollo de nuestro plugin nos falta crear los formularios de entrada en la parte de configuración global de Hudson, así como en la configuración particular de cada proyecto. Maven nos crea por defecto los ficheros global.jelly y config.jelly, además de unos htmls de ayuda. Estos ficheros siguen un esquema XML basandose en un  framework ligero llamado Jelly <font color="#0000ff"><u><a href="http://commons.apache.org/jelly/">http://commons.apache.org/jelly/</a></u></font>.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Para comenzar, tenemos que incluir en la configuración global de Hudson el checkbox que habilitará de forma general el uso del plugin para todos los builds que se hagan (además se dispone de otro checkbox que habilita el plugin para cada proyecto). Dentro de la carpeta resources se encontrarán como mínimo tres ficheros .jelly: index, global y config. El primer fichero contiene una descripción del plugin y en los otros dos se deberá colocar los elementos htmls para la configuración global y específica del mismo.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">En el fichero global.jelly queremos colocar el checkbox que hará que se active el plugin para todos los proyectos. Para ellos basta con colocar las siguientes lineas:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&lt;j:jelly xmlns:j=&#8221;jelly:core&#8221; xmlns:st=&#8221;jelly:stapler&#8221; xmlns:d=&#8221;jelly:define&#8221; xmlns:l=&#8221;/lib/layout&#8221; xmlns:t=&#8221;/lib/hudson&#8221; xmlns:f=&#8221;/lib/form&#8221;&gt;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<blockquote>
<p style="margin-bottom: 0cm">  &lt;f:section title=&#8221;SVNCopyPlugin Global Configuration&#8221;&gt;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<blockquote>
<p style="margin-bottom: 0cm">    &lt;f:entry title=&#8221;Enable&#8221;</p>
<p style="margin-bottom: 0cm">      description=&#8221;Check if you want to perform a copy of your project from your repository to another one&#8221;&gt;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<blockquote>
<p style="margin-bottom: 0cm">      &lt;f:checkbox name=&#8221;enable&#8221; checked=&#8221;${descriptor.isEnable()}&#8221; /&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">    &lt;/f:entry&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">  &lt;/f:section&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&lt;/j:jelly&gt;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Como se puede apreciar el código es bastante autoexplicativo. Se usan unos tags propios de Jelly para añadir el checkbox a la configuración de Hudson (Manage Hudson / Configure System). El valor del checkbox estará bindeado al atributo enable ya visto en el descriptor.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"> <a href="http://www.xnoccio.com/wp-content/uploads/2009/04/hudson11.png" title="Configuración global del plugin"><img src="http://www.xnoccio.com/wp-content/uploads/2009/04/hudson11.png" alt="Configuración global del plugin" /></a></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Por otra parte el fichero config.jelly contendrá la configuración específica del plugin para cada proyecto. Su contenido será el siguiente:</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&lt;j:jelly xmlns:j=&#8221;jelly:core&#8221; xmlns:st=&#8221;jelly:stapler&#8221; xmlns:d=&#8221;jelly:define&#8221; xmlns:l=&#8221;/lib/layout&#8221; xmlns:t=&#8221;/lib/hudson&#8221; xmlns:f=&#8221;/lib/form&#8221;&gt;</p>
<blockquote>
<p style="margin-bottom: 0cm">  &lt;!&#8211;</p>
<p style="margin-bottom: 0cm">      Cajas de texto para introducir las url de los dos repositorios, los nombres y los passwords</p>
<p style="margin-bottom: 0cm">    &#8211;&gt;</p>
<p style="margin-bottom: 0cm">    &lt;f:entry title=&#8221;URL del repositorio destino&#8221;&gt;</p>
<blockquote>
<p style="margin-bottom: 0cm">    	&lt;f:textbox field=&#8221;urlTarget&#8221; value=&#8221;${descriptor.urlTarget}&#8221;/&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">    &lt;/f:entry&gt;</p>
<p style="margin-bottom: 0cm">    &lt;f:entry title=&#8221;Nombre de usuario del repositorio destino&#8221;&gt;</p>
<blockquote>
<p style="margin-bottom: 0cm">    	&lt;f:textbox field=&#8221;nameTarget&#8221; value=&#8221;${descriptor.nameTarget}&#8221;/&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">    &lt;/f:entry&gt;</p>
<p style="margin-bottom: 0cm">    &lt;f:entry title=&#8221;Password del repositorio destino&#8221;&gt;</p>
<blockquote>
<p style="margin-bottom: 0cm">    	&lt;f:password field=&#8221;passTarget&#8221; value=&#8221;${descriptor.passTarget}&#8221;/&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">	&lt;/f:entry&gt;</p>
<p style="margin-bottom: 0cm">	&lt;f:entry title=&#8221;Ficheros y carpetas que no se desean sobreescribir en el destino&#8221;&gt;</p>
<blockquote>
<p style="margin-bottom: 0cm">    	&lt;f:textbox field=&#8221;filesTargetException&#8221; value=&#8221;${descriptor.filesTargetException}&#8221;/&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">	&lt;/f:entry&gt;</p>
<p style="margin-bottom: 0cm">	&lt;f:entry title=&#8221;Ficheros y carpetas que no se desean subir al destino&#8221;&gt;</p>
<blockquote>
<p style="margin-bottom: 0cm">    	&lt;f:textbox field=&#8221;filesSourceException&#8221; value=&#8221;${descriptor.filesSourceException}&#8221;/&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">	&lt;/f:entry&gt;</p>
</blockquote>
<p style="margin-bottom: 0cm">&lt;/j:jelly&gt;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Gracias a este fichero se incluirá en la configuración del proyecto las cajas de texto para que cada usuario introduzca sus datos sobre el repositorio. Cada elemento f:textbox leerá/escribirá su valor en un atributo del descriptor.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"> <a href="http://www.xnoccio.com/wp-content/uploads/2009/04/hudson21.png" title="Configuración del plugin para cada proyecto"><img src="http://www.xnoccio.com/wp-content/uploads/2009/04/hudson21.png" alt="Configuración del plugin para cada proyecto" /></a></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><strong>Ejecución y debug</strong></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal">Con todo esto ya hemos terminado de programar el plugin, ahora sólo queda ejecutarlo y ver que todo va como deseamos. Para ello usaremos el comando <em>mvn hpi:run</em> desde la carpeta del plugin, el cual nos montará un Hudson en nuestra máquina y con el que podremos  trastear antes de instalarlo en el Hudson de la empresa.</p>
<p style="margin-bottom: 0cm; font-weight: normal">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal">También es interesante la opción de debuguear  para seguir la traza y ver qué valores van tomando cada uno de los elementos que intervienen en la ejecución del plugin. Para tener la posibilidad de debuguear antes de llamar a <em>mvn hpi:run </em>tendremos que setear las variables de entorno con los comandos:</p>
<p style="margin-bottom: 0cm; font-weight: normal">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal">   	<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" /> 	<title></title> 	<meta name="GENERATOR" content="OpenOffice.org 3.0  (Linux)" /></p>
<style type="text/css"> 	<!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	</style>
<p style="margin-bottom: 0cm"><em>export MAVEN_OPTS=&#8221;-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n&#8221;</em></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">si usamos Unix o</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><em>set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n</em></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal">si usamos Windows.</p>
<p style="margin-bottom: 0cm; font-weight: normal">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal"><strong>Empaquetando y exportando el plugin</strong></p>
<p style="margin-bottom: 0cm; font-weight: normal">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal">Para finalizar sólo queda crear el fichero .hpi para importarlo desde el Hudson instalado en uno de los servidores de la empresa, algo tan sencillo como ejecutar <em>mvn hpi:package</em><span style="font-style: normal"> y coger el fichero con esta extensión creado en la carpeta target.</span></p>
<p style="margin-bottom: 0cm; font-weight: normal">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal"><span style="font-style: normal">Con esto ya tienes para empezar a </span><em>customizar </em><span style="font-style: normal">tu Hudson añadiendole la funcionalidad que necesitas y no te la dan otros plugins. Ya se sabe, si no está: hazlo tu mismo.</span></p>
<p style="margin-bottom: 0cm; font-weight: normal">&nbsp;</p>
<p style="margin-bottom: 0cm; font-weight: normal">&nbsp;</p>
<p style="margin-bottom: 0cm"><strong><span style="font-style: normal">Próximamente&#8230;</span></strong></p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">En breve pondremos una entrada explicando cómo sacarle más partido a los plugin de Hudson, añadiendo interacción con el usuario, generación de informes del plugin por cada build, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/464-hudson-parte-2-crea-tus-propios-plugins/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Conclusiones finales. Eligiendo nuestro entorno de Integración Continua (V).</title>
		<link>http://www.xnoccio.com/es/372-conclusiones-finales-eligiendo-nuestro-entorno-de-integracion-continua-v/</link>
		<comments>http://www.xnoccio.com/es/372-conclusiones-finales-eligiendo-nuestro-entorno-de-integracion-continua-v/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 09:42:11 +0000</pubDate>
		<dc:creator>Felix G. Borrego</dc:creator>
				<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Integración Continua]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://xnoccio.com/372-conclusiones-finales-eligiendo-nuestro-entorno-de-integracion-continua-v/</guid>
		<description><![CDATA[Después de una serie de artículos que se iniciaron con Eligiendo nuestro entorno de Integración Continua (I) , tenemos las conclusiones finales de nuestra comparativa.

Tabla resumen 

A modo de resumen hemos agrupado en una sola tabla todos las parámetros evaluados en la comparativa, para permitirnos una comparación rápida entre las diferentes herramientas.


&#160;

Apache
Continuum

LuntBuild


Hudson



Instalación


Documentación
de instalación

Suficiente


Buena


Buena.
Con ayuda contextual


Dificultad
de [...]]]></description>
			<content:encoded><![CDATA[<p>Después de una serie de artículos que se iniciaron con <a href="http://xnoccio.com/368-eligiendo-nuestro-entorno-de-integracion-continua-i/" title="Elegir entorno Integración Continua">Eligiendo nuestro entorno de Integración Continua (I)</a> , tenemos las conclusiones finales de nuestra comparativa.</p>
<ul>
<li><strong>Tabla resumen </strong></li>
</ul>
<p class="western">A modo de resumen hemos agrupado en una sola tabla todos las parámetros evaluados en la comparativa, para permitirnos una comparación rápida entre las diferentes herramientas.</p>
<table width="100%" border="1" bordercolor="#000000" cellpadding="4" cellspacing="0">
<tr>
<td width="25%" bgcolor="#9999cc">&nbsp;</td>
<td width="25%" bgcolor="#9999cc">
<p align="center"><strong>Apache<br />
Continuum</strong></td>
<td width="25%" bgcolor="#9999cc">
<p align="center"><strong>LuntBuild</strong></p>
</td>
<td width="25%" bgcolor="#9999cc">
<p align="center"><strong>Hudson</strong></p>
</td>
</tr>
<tr>
<td colspan="4" width="100%" bgcolor="#ccccff"><strong>Instalación</strong></td>
</tr>
<tr>
<td width="25%">Documentación<br />
de instalación</td>
<td width="25%">
<p align="center">Suficiente</p>
</td>
<td width="25%">
<p align="center">Buena</p>
</td>
<td width="25%">
<p align="center">Buena.<br />
Con ayuda contextual</td>
</tr>
<tr>
<td width="25%">Dificultad<br />
de la instalación</td>
<td width="25%">
<p align="center">Fácil.<br />
Requiere la configuración de recursos JNDI ( SMTp, base de datos,<br />
etc.)</td>
<td width="25%">
<p align="center">Fácil.<br />
puede requerir configuración de ficheros externos</td>
<td width="25%">
<p align="center">Muy<br />
Fácil. Es posible su ejecución directamente o sobre cualquier<br />
servidor de aplicaciones ligero, sin requerir edición de ficheros<br />
de configuración</td>
</tr>
<tr>
<td width="25%">Configuraciones<br />
avanzadas</td>
<td width="25%">
<p align="center">Compleja</p>
</td>
<td width="25%">
<p align="center">Fácil</p>
</td>
<td width="25%">
<p align="center">Fácil</p>
</td>
</tr>
<tr>
<td colspan="4" width="100%" bgcolor="#ccccff"><strong>Administración</strong></td>
</tr>
<tr>
<td width="25%">¿permite la<br />
configuración completa desde la interfaz Web?</td>
<td width="25%">
<p align="center">Sí.<br />
A excepción de algunos parámetros como el SMTp, conexión base<br />
de datos, parámetros JNDI, &#8230;</td>
<td width="25%">
<p align="center">Completa</p>
</td>
<td width="25%">
<p align="center">Completa</p>
</td>
</tr>
<tr>
<td width="25%">Documentación<br />
oficial de Administrador</td>
<td width="25%">
<p align="center">Suficiente</p>
</td>
<td width="25%">
<p align="center">Suficiente</p>
</td>
<td width="25%">
<p align="center">Buena.<br />
Con ayuda contextual</td>
</tr>
<tr>
<td width="25%">¿permite<br />
copias de Seguridad desde la herramienta?</td>
<td width="25%">
<p align="center">No</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">No</p>
</td>
</tr>
<tr>
<td width="25%">Mantiene<br />
un histórico de compilaciones (<em>build</em>)</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
</tr>
<tr>
<td width="25%">Gestión de<br />
tareas programadas</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
</tr>
<tr>
<td width="25%">Rendimiento</td>
<td width="25%">
<p align="center">Bueno</p>
</td>
<td width="25%">
<p align="center">Muy<br />
bueno, permite gestión de hilos de ejecución y tareas<br />
distribuidas</td>
<td width="25%">
<p align="center">Muy<br />
bueno, permite gestión de hilos de ejecución y tareas<br />
distribuidas</td>
</tr>
<tr>
<td colspan="4" width="100%" bgcolor="#9999ff"><strong>Seguridad</strong></td>
</tr>
<tr>
<td width="25%">Gestión de<br />
permisos basados en perfiles</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí,<br />
pero sólo con un conjunto de perfiles predefinido.</td>
<td width="25%">
<p align="center">Sí</p>
</td>
</tr>
<tr>
<td width="25%">Gestión de<br />
permisos específicos por proyecto</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
</tr>
<tr>
<td width="25%">Facilidad de<br />
configuración de la seguridad</td>
<td width="25%">
<p align="center">Fácil</p>
</td>
<td width="25%">
<p align="center">Fácil</p>
</td>
<td width="25%">
<p align="center">Muy<br />
Fácil</td>
</tr>
<tr>
<td colspan="4" width="100%" bgcolor="#ccccff"><strong>Integración<br />
con sistemas externos</strong></td>
</tr>
<tr>
<td width="25%">Integración<br />
con Sistemas de control de Versiones</td>
<td width="25%">
<p align="center">Suficiente</p>
</td>
<td width="25%">
<p align="center">Muy<br />
Buena</td>
<td width="25%">
<p align="center">Muy<br />
Buena</td>
</tr>
<tr>
<td width="25%">Integración<br />
con plataformas de gestión de incidencias (bugtrackers)</td>
<td width="25%">
<p align="center">Mala</p>
</td>
<td width="25%">
<p align="center">Mala</p>
</td>
<td width="25%">
<p align="center">Regular</p>
</td>
</tr>
<tr>
<td width="25%">Integración<br />
con herramientas de generación de informes (reporting)</td>
<td width="25%">
<p align="center">Buena,<br />
basada en Maven</td>
<td width="25%">
<p align="center">Buena</p>
</td>
<td width="25%">
<p align="center">Muy<br />
Buena. plugins Hudson integrados</td>
</tr>
<tr>
<td width="25%">Desarrollo<br />
de nuevos plugins o mecanismos de extensión</td>
<td width="25%">
<p align="center">Complejo<br />
(Malo)</td>
<td width="25%">
<p align="center">Suficiente</p>
</td>
<td width="25%">
<p align="center">Muy<br />
Bueno</td>
</tr>
<tr>
<td width="25%">Integración<br />
con herramientas de testeo</td>
<td width="25%">
<p align="center">Buena</p>
</td>
<td width="25%">
<p align="center">Buena</p>
</td>
<td width="25%">
<p align="center">Muy<br />
buena, con agregación de los resultados en la propia interfaz<br />
web.</td>
</tr>
<tr>
<td colspan="4" width="100%" bgcolor="#ccccff">Tipos de<br />
proyectos Soportados</td>
</tr>
<tr>
<td width="25%">proyectos<br />
Java</td>
<td width="25%">
<p align="center">Muy<br />
Buena</td>
<td width="25%">
<p align="center">Muy<br />
Buena</td>
<td width="25%">
<p align="center">Excelente<br />
(permite un gran número de posibilidades)</td>
</tr>
<tr>
<td width="25%">proyectos No<br />
Java</td>
<td width="25%">
<p align="center">Mala.<br />
Solo basados en Shell scripts</td>
<td width="25%">
<p align="center">Mala.<br />
Solo basados en Shell scripts</td>
<td width="25%">
<p align="center">Buena,<br />
mediante plugins</td>
</tr>
<tr>
<td colspan="4" width="100%" bgcolor="#ccccff">
<p style="background: #ccccff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">Facilidad<br />
de uso</td>
</tr>
<tr>
<td width="25%">Documentación<br />
de usuario</td>
<td width="25%">
<p align="center">Buena</p>
</td>
<td width="25%">
<p align="center">Buena</p>
</td>
<td width="25%">
<p align="center">Muy<br />
Buena, con ayuda contextual</td>
</tr>
<tr>
<td width="25%">Interfaz</td>
<td width="25%">
<p align="center">Fácil</p>
</td>
<td width="25%">
<p align="center">Complejidad<br />
media</td>
<td width="25%">
<p align="center">Muy<br />
fácil</td>
</tr>
<tr>
<td colspan="4" width="100%" bgcolor="#ccccff">Estabilidad</td>
</tr>
<tr>
<td width="25%">Estabilidad<br />
general de la herramienta</td>
<td width="25%">
<p align="center">Buena</p>
</td>
<td width="25%">
<p align="center">Buena</p>
</td>
<td width="25%">
<p align="center">Buena</p>
</td>
</tr>
<tr>
<td width="25%">¿permite<br />
compilación distribuida?</td>
<td width="25%">
<p align="center">No</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
</tr>
<tr>
<td width="25%">¿permite la<br />
gestión de hilos de ejecución?</td>
<td width="25%">
<p align="center">No</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
<td width="25%">
<p align="center">Sí</p>
</td>
</tr>
</table>
<ul>
<li><font size="2"><font face="Arial Narrow, sans-serif"><strong>Conclusiones finales.</strong></font></font></li>
</ul>
<p>Sin duda nuestra propuesta se inclina por Hudson. Brevemente vamos a enumerar y resumir (de entre los detalles de esta comparativa) ciertos aspectos que hacen inclinar la balanza hacia este software:</p>
<blockquote>
<ul>
<li><strong>Extensibilidad</strong>. La posibilidad de desarrollar plugins que permitan adaptar e inyectar funcionalidad de forma personalizada es una característica casi imprescindible.  Apache Continuum no dispone de esta posibilidad de integrar plugins (deben ser plugins Maven, utilizados específicamente en cada uno de los proyectos Java), lo cual prácticamente hace descartar esta plataforma. LuntBuild dispone de ciertas opciones de inyección de código, si bien a este respecto las mejores características las tiene Hudson.</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li><strong>Calidad de la documentación</strong>. En esta materia Hudson también dispone de la mejor documentación, por delante de LuntBuild y Continuum.</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li><strong>Integración de resultados de plugins (centralizados o Maven) en pantalla</strong>. Un aspecto de interés es que el resultado de los diversos plugins pueda verse en la interfaz web de la aplicación. Tan sólo Hudson proporciona este nivel de integración por defecto.</li>
</ul>
<ul>
<li><strong>Sistema de seguridad y permisos</strong>. En esta funcionalidad tan importante lideran la comparativa Hudson y Continuum. Ambas disponen de la posibilidad de gestión de permisos basados en perfiles, y posibilidad de personalizar los permisos por proyectos. Continuum puede requerir modificaciones en ficheros de configuración y reinicio del sistema, mientras que Hudson permite configuración integral en pantalla.</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li><strong>Estabilidad</strong>. Las tres plataformas disponen de buenas características de estabilidad, si bien destacan Hudson y LuntBuild, que permiten la gestión multihilo y compilación distribuida.</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li><strong>Soporte de la comunidad</strong>. A este respecto lideran la comparativa tanto Hudson como Continuum, desarrollos de Sun y Apache respectivamente.</li>
</ul>
</blockquote>
<p>Como se puede observar, Hudson auna las principales características que nosotros esperabamos de un sistema de Integración Continua, y por ello es nuestra propuesta y elección para servir de plataforma base en la infraestructura de desarrollo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/372-conclusiones-finales-eligiendo-nuestro-entorno-de-integracion-continua-v/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Hudson. Eligiendo nuestro entorno de Integración Continua (IV).</title>
		<link>http://www.xnoccio.com/es/371-hudson-eligiendo-nuestro-entorno-de-integracion-continua-iv/</link>
		<comments>http://www.xnoccio.com/es/371-hudson-eligiendo-nuestro-entorno-de-integracion-continua-iv/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 11:37:02 +0000</pubDate>
		<dc:creator>Felix G. Borrego</dc:creator>
				<category><![CDATA[javahispano]]></category>
		<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Integración Continua]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://xnoccio.com/371-hudson-eligiendo-nuestro-entorno-de-integracion-continua-iv/</guid>
		<description><![CDATA[Nos encontramos ante un software relativamente novedoso, pero que se ha convertido en uno de los referentes en cuanto a sistemas de Integración Continua. Es una herramientas software libre desarrollada en Java y mantenida por Sun Microsystems desde su web java.net. La herramienta puede ser descargada desde https://hudson.dev.java.net/.

Instalación

La instalación de Hudson es extremadamente sencilla, pudiéndose [...]]]></description>
			<content:encoded><![CDATA[<p>Nos encontramos ante un software relativamente novedoso, pero que se ha convertido en uno de los referentes en cuanto a sistemas de Integración Continua. Es una herramientas software libre desarrollada en Java y mantenida por Sun Microsystems desde su web java.net. La herramienta puede ser descargada desde https://hudson.dev.java.net/.</p>
<ul>
<li><strong>Instalación</strong></li>
</ul>
<p>La instalación de Hudson es extremadamente sencilla, pudiéndose realizar una evaluación del software utilizando un instalador Java Web Start desde la web del producto. Así mismo, se puede descargar e instalar la aplicación de forma standalone, o se puede desplegar sobre un servidor de aplicaciones mediante el fichero empaquetado hudson.war.</p>
<p>El sistema está pensado para que nunca sea necesario editar ningún fichero de configuración externo, ofreciéndonos una administración web sencilla pero que contempla una configuración visual integral (incluyendo por ejemplo la parametrización de SMTP, base de datos, seguridad, etc.).</p>
<p>La documentación de instalación oficial del producto es buena, e incluye incluso algunos vídeos screencasts. Por otro lado, si en algún momento nos sentimos confundidos con la configuración, el sistema ofrece una completa ayuda en linea y contextual que facilita mucho la tarea de configuración para personas no familiarizadas a priori con este tipo de sistemas.</p>
<ul>
<li><strong>Administración, gestión de proyectos</strong></li>
</ul>
<p>La herramienta ofrece una interfaz muy intuitiva para su administración, por lo que como hemos comentado antes, no será necesario personal especializado para su administración, pudiéndose realizar todas las tareas desde la propia consola web.</p>
<p>La herramienta permite la definición de tareas periódicas desde su interfaz web mediante un editor similar a cron dotado de una completa ayuda contextual.</p>
<p>Por otro lado, durante las pruebas, la migración de los proyectos a Hudson ha resultado ser muy rápida y sencilla, consiguiendo un entorno totalmente configurado y funcional en poco tiempo.</p>
<p>Respecto a su mecanismo de actualización, Hudson es el mejor de los sistemas analizados, ya que sólo es necesario descargar el nuevo empaquetado .war y sustituir el existente, asegurándose la plataforma de mantener la compatibilidad de forma automática. Por otro lado, es el propio Hudson el que nos avisará de la existencia de nuevas versiones, tanto del sistema completo como de sus plugins.</p>
<ul>
<li><strong>Seguridad</strong></li>
</ul>
<p>El sistema ofrece un sistema de seguridad completo y muy flexible, y totalmente configurable desde la consola web, permitiéndonos o bien integrarnos con sistemas externos de autenticación (LDAP, bases de datos externas) o delegar la seguridad en el propio Hudson.</p>
<p>Si optamos por que Hudson gestione la seguridad, dispondremos de múltiples opciones que cubren todo el abanico de necesidades, como seguridad basada en perfiles, asociación de permisos por proyectos o por matriz de acciones.</p>
<ul>
<li><strong>Integración con sistemas externos</strong></li>
</ul>
<p>Hudson ofrece un mecanismo de extensión muy completo, que junto con el gran número de plugins ya existentes le permiten su integración con un gran número de sistemas y herramientas. Por otro lado, aunque está preparado (al igual que Continuum o LuntBuild) para utilizar directamente los plugins Maven, proporciona los mecanismos adecuados para no depender de una correcta configuración de estos plugins en el fichero pom.xml de los proyectos. Esta centralización de la configuración constituye una ventaja muy importante respecto a sus competidores, ya que garantiza que, independientemente de lo contenido en el pom.xml, se puedan ejecutar los procesos de chequeo y validación deseados.</p>
<p>Por otro lado, existe una integración plena entre Hudson y sus plugins. Los resultados de éstos podrán ser visualizados en la herramienta web, incluyendo tanto conclusiones de testeo, estilos, pruebas unitarias, etc&#8230; como los resultados de los procesos de despliegue. Nuevamente Hudson es la única plataforma en permitir este tipo de funcionalidad avanzada.</p>
<p>Por otro lado, permite la integración con la mayoría de sistemas de control de versiones (SVN, CVS, etc.), ya sea de base, o mediante la inclusión de los plugins necesarios.</p>
<p>Es de especial interés el mecanismo de instalación y gestión de plugins, ya que la herramienta nos permite la descarga e instalación automática desde su interfaz web, avisándonos incluso de la aparición de nuevas versiones de los mismos de forma automática.</p>
<p>Otro factor muy importante es la completa documentación para poder desarrollar nuestros propios plugins, que nos permitirán adaptar el sistema a las particularidades propias de cada entorno.</p>
<p>También resulta curiosa la integración con sistemas como Twitter, Jabber, etc., que nos permiten hacernos una idea del avanzadísimo nivel de los mecanismos de integración incorporados en la plataforma. Sin duda, esta es la característica en la que más se destaca Hudson frente a Continuum o LuntBuild.</p>
<ul>
<li><strong>Tipos de proyectos</strong></li>
</ul>
<p>Aunque la herramienta esta principalmente enfocada a proyectos Java, gracias sus plugins tiene soporte para gran multitud de formatos como por ejemplo Ivy, Nant, Rake, Ant, Maven, Phing, Shell scripts, y para lenguajes como .Net, Groovy, Rails, PHP.</p>
<ul>
<li><strong>Facilidad de uso</strong></li>
</ul>
<p>La herramienta ofrece una interfaz potente y muy usable, que permite que personal no cualificado o con poca experiencia en este tipo de herramientas se adapte a su uso con facilidad.</p>
<p>La documentación oficial es completa, y junto con la ayuda contextual en todos los elementos de la interfaz hace que la curva de aprendizaje sea muy rápida.</p>
<ul>
<li><strong>Estabilidad</strong></li>
</ul>
<p>Nos encontramos ante un software muy estable, al igual que ocurría con sus dos competidores directos. Prueba de ello es que está siendo utilizado para todos sus proyectos en grupos de desarrollo como JBoss. Como sistema de Integración Continua, tiene una política de publicación de actualizaciones muy dinámica que hace que se liberen versiones cada pocas semanas, lo cual podría ser un inconveniente de no ser por las posibilidades de actualización automática comentadas. A continuación se indican las principales versiones liberadas:</p>
<p>En lo referido al rendimiento, el sistema permite la gestión de hilos de ejecución dedicados a tareas de compilación y la ejecución de compilación distribuidas, lo que le confiere excelentes características de escalabilidad y adaptabilidad al entorno disponible.</p>
<dl>
<dl>
<dl>
<dd>
<table width="100%" border="1" bordercolor="#000000" cellpadding="4" cellspacing="0">
<tr>
<td width="49%">
<p style="margin-left: 0.25in; margin-top: 0.04in; page-break-inside: avoid"> 						<font face="Arial Narrow, sans-serif"><font size="2"><font size="3">Hudson 						1.256</font></font></font></p>
</td>
<td width="51%">
<p style="margin-left: 0.25in; margin-top: 0.04in; page-break-inside: avoid"> 						<font face="Arial Narrow, sans-serif"><font size="2"><font size="3">Julio 						2008</font></font></font></p>
</td>
</tr>
<tr>
<td width="49%">
<p style="margin-left: 0.25in; margin-top: 0.04in; page-break-inside: avoid"> 						<font face="Arial Narrow, sans-serif"><font size="2"><font size="3">Hudson 						2.00</font></font></font></p>
</td>
<td width="51%">
<p style="margin-left: 0.25in; margin-top: 0.04in; page-break-inside: avoid"> 						<font face="Arial Narrow, sans-serif"><font size="2"><font size="3">Marzo 						2008</font></font></font></p>
</td>
</tr>
<tr>
<td width="49%">
<p style="margin-left: 0.25in; margin-top: 0.04in; page-break-inside: avoid"> 						<font face="Arial Narrow, sans-serif"><font size="2"><font size="3">Hudson 						1.100</font></font></font></p>
</td>
<td width="51%">
<p style="margin-left: 0.25in; margin-top: 0.04in; page-break-inside: avoid"> 						<font face="Arial Narrow, sans-serif"><font size="2"><font size="3">Abril 2007</font></font></font></p>
</td>
</tr>
</table>
</dd>
</dl>
</dl>
</dl>
<ul>
<li><strong>Conclusiones sobre Hudson</strong></li>
</ul>
<p>La herramienta, gracias a su sistemas de plugins, ha resultado ser muy versátil y fácilmente adaptable a necesidades particulares. Por otro lado, su sencilla interfaz la hacen ideal para su uso por personal no especializado en este tipo de herramientas.</p>
<p>Aunque la herramienta es la más joven de las estudiadas, está teniendo una rápida aceptación y divulgación en el mercado, y ha demostrado completamente su fiabilidad.</p>
<p>Próximamente: Conclusiones finales. Eligiendo nuestro entorno de Integración Continua (V).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/371-hudson-eligiendo-nuestro-entorno-de-integracion-continua-iv/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Hudson. Parte 1 &#8211; Introducción.</title>
		<link>http://www.xnoccio.com/es/362-hudson-parte-1-introduccion/</link>
		<comments>http://www.xnoccio.com/es/362-hudson-parte-1-introduccion/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 10:45:37 +0000</pubDate>
		<dc:creator>Felix G. Borrego</dc:creator>
				<category><![CDATA[viavansi]]></category>
		<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Integración Continua]]></category>

		<guid isPermaLink="false">http://xnoccio.com/362-hudson-parte-1-introduccion/</guid>
		<description><![CDATA[¿Qué problemática resuelve?
En entornos en los que el desarrollo de software se realiza por un equipo o equipos en los que la evolución y mantenimiento del código se subdivide,  el coste de la integración entre las diferentes piezas de software tiende a aumentar, apareciendo conflictos y haciendo de la generación de distribuibles una ardua tarea.  [...]]]></description>
			<content:encoded><![CDATA[<p><strong>¿Qué problemática resuelve?</strong></p>
<p>En entornos en los que el desarrollo de software se realiza por un equipo o equipos en los que la evolución y mantenimiento del código se subdivide,  el coste de la integración entre las diferentes piezas de software tiende a aumentar, apareciendo conflictos y haciendo de la generación de distribuibles una ardua tarea.  Con idea de <strong>rebajar los costes </strong>adicionales provocados por la gestión del proceso de compilación, integración, empaquetado y generación de entregarles, aparecen herramientas  de <a href="http://es.wikipedia.org/wiki/Continuous_integration" title="Integración continua en la Wikipedia">Integración Continua</a> (CI) como Hudson.</p>
<p><strong>¿ Por qué elegir Hudson?</strong></p>
<p>Aunque es un productor reciente ha evolucionado rápidamente y actualmente es uno de los productos de referencia en el sector de las aplicaciones para Integración Continua de software, gracias a la <strong>simplicidad de su interfaz</strong> y lo sencillo que resulta el desarrollo de nuevos <strong>plugins</strong>. Prueba de este crecimiento es que actualmente es utilizado por un gran numero de proyectos entre los que se encuentra por ejemplo <a href="http://hudson.jboss.org/hudson/" title="Hudson de JBoss">JBoss.</a></p>
<p>Para hacernos una idea los principales motivos que en nuestro caso nos hicieron elegir Hudson son:</p>
<ul>
<li><strong>Fácil instalación y uso</strong>. Como buen producto cuya utilidad es la de simplificarnos la vida, la instalación y ejecución de Hudson es realmente trivial. Es suficiente con descargar el  fichero <a href="https://hudson.dev.java.net/servlets/ProjectDocumentList?folderID=2761" title="Hudson WAR">hudson.war</a><span style="font-weight: bold"></span> y ejecutarlo con &#8220;java -jar hudson.war&#8221; o bien desplegarlo en un servidor de aplicaciones.  Y esto no queda aquí, gracias a su <strong>sencilla interfaz</strong>, podemos tener nuestros primeros proyectos configurados en pocos minutos.</li>
<li><strong>Un sistema de plugins</strong> fácilmente extensible. Lo que permite la instalación y creación de nuevos plugins de forma sencilla. Esto ha permitido que exista una gran cantidad de plugins disponibles y que sea muy sencilla la creación de plugins específicos. Como ejemplo, gracias a esta simplicidad pudimos crear un plugin específico para adaptar el comportamiento de Hudson a nuestras necesidades en solo unos días.</li>
<li>Un soporte completo de <strong>Maven</strong>, lo que nos ha permitido una migración rápida de todos nuestros proyectos al nuevo sistema.</li>
<li>Soporte para compilación distribuida basada en sistemas esclavos y maestros, para mejorar los tiempos de compilación y evitar la sobrecarga.</li>
<li>Soporte para múltiples equipos y grupos de proyectos, lo que nos permite la colaboración.</li>
<li>Es un Sistema completamente <strong>Software Libre</strong>.</li>
<li>Nos permite establecer un <strong>sistema de alertas a los desarrolladores</strong> sobre el estado de sus proyectos.</li>
<li><strong>Permite la detección de actualizaciones realizadas en el SCM </strong>( en nuestro caso Subversion) para generar de forma automática los nuevos empaquetados o a intervalos regulares.</li>
<li>Y el principal motivo. Tras estar utilizándolo en el departamento de I+D durante unos meses, <strong>el software no nos dio ni un solo problema</strong>, por lo que actualmente la mayoría de nuestros proyectos están ya bajo el control de Hudson.</li>
</ul>
<p><a href="http://www.xnoccio.com/wp-content/uploads/2008/09/proyectos1.png" title="Listado de proyectos gestionados por Hudson en Viavansi"><img src="http://www.xnoccio.com/wp-content/uploads/2008/09/proyectos1.png" alt="Listado de proyectos gestionados por Hudson en Viavansi" width="390" height="269" /></a></p>
<p><strong>Instalación</strong></p>
<p>Como se comenta arriba, la instalación del software es realmente <strong>sencilla</strong>, y el único requisito es tener instalada una versión de Java reciente y opcionalmente un servidor de aplicaciones como por ejemplo Tomcat, si no se desea ejecutar sobre el servidor que trae embebido.</p>
<p>Para la instalación, en primer lugar necesitara descargar la última versión estable de  <a href="http://hudson.dev.java.net/" title="Sitio oficial de Hudson">http://hudson.dev.java.net</a>.</p>
<p>Si desea ejecutar Hudson en modo autónomo sera suficiente con ejecutar &#8220;java -jar hudson.war&#8221;y acceder con el navegador al puerto 8080 (http://localhost:8080) para poder utilizar Hudson.  Si lo desea, en la web oficial tambien puede encontrar los scripts para convertir hudson en un servicio.</p>
<p>Por otro lado la instalación más común de Hudson es su despliegue en un servidor de aplicaciones. Por ejemplo, para su despliegue en un Tomcat, bastara con copiar el fichero hudson.war dentro del directorio webapps.</p>
<p>Hudson utiliza un directorio especial para almacenar toda la configuración propia y de los proyectos que gestiona, por lo que no hay peligro de perdida de datos si posteriormente actualizamos a versiones más recientes del software. Por defecto el directorio es &#8220;.hudson&#8221;, localizado en el home del usuario, pero  es posible modificar este directorio estableciendo la variable de entorno HUDSON_HOME.</p>
<p><strong>Primeros pasos</strong></p>
<p>En Hudson cada proyecto de desarrollo es una tarea, por lo que para hacer que un proyecto este gestionado por hudson es suficiente con darle un nombre a la tarea y asignarle un tipo entre los disponibles (Build a maven2 project, Build a free-style software project, &#8230;)</p>
<p><a href="http://www.xnoccio.com/wp-content/uploads/2008/09/newjob1.png" title="Paso 1. Crear Un nuero proyecto (Job) en Hudson"><img src="http://www.xnoccio.com/wp-content/uploads/2008/09/newjob1.png" alt="Paso 1. Crear Un nuero proyecto (Job) en Hudson" width="406" height="306" /></a></p>
<p>En adelante a modo de ejemplo vamos a considerar un proyecto de tipo Maven 2. Una vez que tenemos el tipo de proyecto seleccionado, pasamos a la pantalla de configuración, en la que entre otras muchas opciones, tendremos que seleccionar el SCM en el que se encuentra proyecto(en nuestro caso Subversión), el pom.xml asociado al proyecto y el conjunto de goals que deseamos ejecutar. No entraremos en detalle a explicar cada uno de las opciones de configuración, ya que otra de las ventajas de Hudson es que ofrece ayuda en linea para todas sus opciones.</p>
<p>Una vez guardada la nueva tarea, ésta podrá ser ejecutada automáticamente si hemos configurado algún Build Triggers o lanzada de forma manual pulsando sobre Build Now, y una vez que la tarea esta en ejecución podremos ver en todo momento su estado y consola.</p>
<p><strong>Administración </strong></p>
<p>Desde el menú &#8220;Manage Hudson&#8221;, situado en la página principal, es posible acceder a todas las opciones de configuración. En particular desde la opción &#8220;Configure System&#8221; podremos acceder a todos los parametros generales como configuración del  SMTP, proxy, rutas a Maven, Ant, &#8230;<br />
Y de nuevo para cada opción de configuración dispondremos de ayuda contextual que nos hara la vida mucho más facil.</p>
<p>Como ya hemos comentado, uno de los puntos fuertes de Hudson es su sistema y manejador de plugins, al que podremos  acceder desde la opción &#8220;Manage Plugins&#8221;. Esta opción nos permitirá añadir nuevas características (como herramientas de control de estilo, nuevos SCM soportados, &#8230;) directamente desde su interfaz.</p>
<p><a href="http://www.xnoccio.com/wp-content/uploads/2008/09/managehudson1.png" title="Consola de administración de Hudson"><img src="http://www.xnoccio.com/wp-content/uploads/2008/09/managehudson1.png" alt="Consola de administración de Hudson" width="493" height="355" /></a></p>
<p>La lista de todos los plugins está disponible en la siguiente dirección:  <a href="http://hudson.gotdns.com/wiki/display/HUDSON/Plugins" title="Listado de plugins para Hudson">http://hudson.gotdns.com/wiki/display/HUDSON/Plugins</a></p>
<p><strong>Conclusión</strong></p>
<p>Hudson es un es un fantastico software para realizar las tareas de Integración Continua, y aunque aquí se han presentado solo las características básicas, a pesar de la simplicidad de su interfaz es un software altamente extensible y con un gran potencial.</p>
<p>Por otro lado, y aunque se enfoca principalmente hacia proyectos Java, Hudson permite gestionar proyectos de cualquier tipo, como por ejemplo proyectos C o Ruby on Rails, lo que lo hace muy recomendable enentorno heterogéneos.</p>
<p>En general, los productos de Integración Continua suelen ser complejos de manejar y gestionar, y como hemos visto, este no es el caso de Hudson, lo que resulta esencial si queremos convertir esta herramienta en una plataforma horizontal en nuestra empresa o grupo de desarrollo. Su facilidad de uso la ha demostrado durante el tiempo que llevamos utilizándolo, ya que no solo no ha requerido de personal especializado en este tipo de tareas para su gestión, sino que tampoco ha necesitado de una compleja explicación para que nuestros grupos de desarrollo empezaran a utilizarlo.</p>
<p>En resumen una herramienta para simplificarnos la vida a los desarrolladores que ofrece lo que promete.</p>
<p><a href="http://xnoccio.com/464-hudson-parte-2-crea-tus-propios-plugins/" title="Crear plugins con Hudson">Hudson.  Parde 2. Crea tus propios plugins</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/362-hudson-parte-1-introduccion/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

