<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://1984.lsi.us.es/wiki-egc/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Resinas</id>
		<title>Wiki de EGC - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://1984.lsi.us.es/wiki-egc/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Resinas"/>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php/Especial:Contribuciones/Resinas"/>
		<updated>2026-04-25T17:55:02Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue_(Heroku)&amp;diff=8016</id>
		<title>Despliegue (Heroku)</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue_(Heroku)&amp;diff=8016"/>
				<updated>2018-12-11T08:03:16Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta práctica vamos a adaptar nuestra app a un entorno de desarrollo basado en Heroku.&lt;br /&gt;
&lt;br /&gt;
Heroku&lt;br /&gt;
--------------&lt;br /&gt;
&lt;br /&gt;
Heroku es una empresa que ofrece &amp;quot;Plataformas como servicios&amp;quot; y nos permite despreocuparnos de tareas de mantenimiento de infraestructura (por ejemplo aprovisionamiento y administración de servidores) de las soluciones que ofrecen &amp;quot;Infraestructura como Servicio&amp;quot; (Amazon EC2).&lt;br /&gt;
&lt;br /&gt;
Heroku CLI&lt;br /&gt;
-----------------&lt;br /&gt;
La comunicación con heroku se realiza principalmente desde la terminal o desde la web, para ello ofrecen clientes de terminal para los sistemas operativos más usados. Asimismo, delega en un sistema de recetas el despliegue de las aplicaciones que deseemos. &lt;br /&gt;
&lt;br /&gt;
Para crear nuevas aplicaciones en heroku usaremos:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
heroku create &amp;quot;app name&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadiendo un nuevo remote para nuestra app:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
heroku git:remote -a &amp;quot;app name&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Heroku Procfile&lt;br /&gt;
------------------&lt;br /&gt;
Las aplicaciones Heroku incluyen un archivo Procfile en su raiz, al estilo de lo que hacíamos en la práctica anterior. Este archivo de recetas se ejecuta por una app en el arranque de la misma. En el Procfile se puede describir entre otros:&lt;br /&gt;
&lt;br /&gt;
* El servidor web de tu aplicación&lt;br /&gt;
* Distintos procesos de &amp;quot;workers&amp;quot;&lt;br /&gt;
* Un  proceso singleton (e.g. relog, semaforos, ...)&lt;br /&gt;
* Tareas a ejecutar antes de lanzar el despliegue.&lt;br /&gt;
&lt;br /&gt;
Entonces, podremos resumir que los pasos para hacer release de decide en el procfile a crear:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% prepara el repositorio para su despliegue. &lt;br /&gt;
release: sh -c 'cd decide &amp;amp;&amp;amp; python manage.py migrate'&lt;br /&gt;
% especifica el comando para lanzar Decide&lt;br /&gt;
web: sh -c 'cd decide &amp;amp;&amp;amp; gunicorn decide.wsgi --log-file -'&lt;br /&gt;
&lt;br /&gt;
Enviando el código a Heroku&lt;br /&gt;
------------------&lt;br /&gt;
Una vez tenemos una rama remota asociada a heroku, podemos hacer push a esta rama para que se considere una release&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git push heroku master&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observemos los errores y veamos como resolverlos.&lt;br /&gt;
&lt;br /&gt;
1) Parametros por defecto:&lt;br /&gt;
&lt;br /&gt;
decide/decide/settings.py&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
BASEURL = 'https://TU URL'&lt;br /&gt;
...&lt;br /&gt;
APIS = {}&lt;br /&gt;
...&lt;br /&gt;
import django_heroku&lt;br /&gt;
django_heroku.settings(locals())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Dependencias&lt;br /&gt;
Los cambios en estas dependencias son django-heroku para evitar problemas con el comando collectstatic de django y gunicorn como servidor&lt;br /&gt;
requirements.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-heroku&lt;br /&gt;
gunicorn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Finalmente, tenemos que fijar la versión de python a usar. Esto se define en el archivo runtime.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python-3.7.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El último paso es conectarnos a heroku y crear un super usuario para las votaciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
heroku run  -a YOUR APP NAME &amp;quot;sh -c 'cd decide &amp;amp;&amp;amp; python manage.py createsuperuser'&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Referencias&lt;br /&gt;
---------------&lt;br /&gt;
* [https://devcenter.heroku.com/articles/getting-started-with-python Getting started de Python en Heroku]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua&amp;diff=7935</id>
		<title>Integración continua</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua&amp;diff=7935"/>
				<updated>2018-11-19T15:45:11Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Primeros pasos con Travis CI]]&lt;br /&gt;
* [[Flujo de trabajo con GitHub]]&lt;br /&gt;
* [[Notificaciones]]&lt;br /&gt;
* [[Uso con bases de datos]]&lt;br /&gt;
* [[Jobs con múltiples builds]]&lt;br /&gt;
* [[Despliegue]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_(con_Python)&amp;diff=7934</id>
		<title>Integración continua (con Python)</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_(con_Python)&amp;diff=7934"/>
				<updated>2018-11-19T15:44:54Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Travis CI para integración continua]]&lt;br /&gt;
* [[Flujo de trabajo con GitHub]]&lt;br /&gt;
* [[Notificaciones]]&lt;br /&gt;
* [[Jobs con múltiples builds para Decide]]&lt;br /&gt;
&lt;br /&gt;
También puedes consultar los ejemplos con Java en [[Integración continua]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Flujo_de_trabajo_con_GitHub&amp;diff=7933</id>
		<title>Flujo de trabajo con GitHub</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Flujo_de_trabajo_con_GitHub&amp;diff=7933"/>
				<updated>2018-11-19T15:43:13Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Ejercicio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Como ya hemos comentado en la asignatura, una forma muy habitual de trabajar con GitHub es por medio de [https://help.github.com/articles/about-pull-requests/ pull requests]. Las pull requests se crean desde una rama a otra del repositorio y permite decirle a otros qué cambios has hecho en un repositorio en GitHub. Una vez que un pull request se abre, puedes discutir y revisar los cambios potenciales con colaboradores y continuar haciendo commits antes de que los cambios se integren en el repositorio. Un escenario muy habitual donde se trabaja con pull requests es si se sigue un flujo de desarrollo del estilo de [https://guides.github.com/introduction/flow/ GitHub Flow]. &lt;br /&gt;
&lt;br /&gt;
Cuando se abre una pull request, Travis CI recibe una notificación de pull request de GitHub. Esta notificación se transforma en una nueva build. Durante la build se actualiza el estado de los commits a uno de los siguientes:&lt;br /&gt;
* un warning porque aún se está construyendo&lt;br /&gt;
* que la pull request se debe de integrar con cuidado porque la build falló&lt;br /&gt;
* que la pull request se puede integrar sin problemas porque la build tuvo éxito&lt;br /&gt;
&lt;br /&gt;
Travis CI inicia una build cuando se abre por primera vez una pull request y cuando se añaden commits a ella. Además, la prueba se realiza a partir de un merge de la rama con la feature y la rama master, no únicamente de la rama con la feature.&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
&lt;br /&gt;
# Vamos a añadir una nueva característica a nuestra aplicación. Para eso, vamos a crear una rama nueva.&lt;br /&gt;
# En al rama nueva hacemos los cambios deseados.&lt;br /&gt;
# Haz un commit de estos cambios y haz un push de la nueva rama a GitHub&lt;br /&gt;
# Una vez que hemos decidido que estos cambios abarcan la funcionalidad deseada, vamos a crear una pull request siguiendo estas instrucciones: https://help.github.com/articles/creating-a-pull-request/#creating-the-pull-request (Fíjate bien que la pull request la haces a la rama &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; de tu repositorio y no a otro repositorio ni a &amp;lt;code&amp;gt;resinas/master&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Si abres la pull request que se ha creado, podrás observar abajo cómo se ejecuta una nueva build en Travis CI con la pull request.&lt;br /&gt;
# ¿Ha funcionado con éxito la build de la pull request o ha fallado? ¿Por qué motivo?&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_(con_Python)&amp;diff=7932</id>
		<title>Integración continua (con Python)</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_(con_Python)&amp;diff=7932"/>
				<updated>2018-11-19T15:42:10Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «* Travis CI para integración continua * Flujo de trabajo con GitHub * Notificaciones * Jobs con múltiples builds para Decide»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Travis CI para integración continua]]&lt;br /&gt;
* [[Flujo de trabajo con GitHub]]&lt;br /&gt;
* [[Notificaciones]]&lt;br /&gt;
* [[Jobs con múltiples builds para Decide]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_18/19&amp;diff=7931</id>
		<title>Prácticas - 18/19</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_18/19&amp;diff=7931"/>
				<updated>2018-11-19T15:41:45Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Página_Principal]] -&amp;gt; [[2018/2019]]&lt;br /&gt;
&lt;br /&gt;
* Práctica 1: [[Gestión del despliegue: Taller de Docker]]&lt;br /&gt;
* Práctica 2: [[Gestión del despliegue: Despliegue y desarrollo de Decide]]&lt;br /&gt;
* Práctica 3: [[Gestión de incidencias]]&lt;br /&gt;
* Práctica 4: [[Uso de git]]&lt;br /&gt;
* Práctica 5: [[Integración continua (con Python)]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Jobs_con_m%C3%BAltiples_builds_para_Decide&amp;diff=7930</id>
		<title>Jobs con múltiples builds para Decide</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Jobs_con_m%C3%BAltiples_builds_para_Decide&amp;diff=7930"/>
				<updated>2018-11-19T15:40:03Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «Una de las ventajas que ofrecen los sistemas de integración continua es que permiten automatizar la prueba del código en distintos entornos o con distintos servicios (por...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Una de las ventajas que ofrecen los sistemas de integración continua es que permiten automatizar la prueba del código en distintos entornos o con distintos servicios (por ejemplo, distintas bases de datos), algo que resultaría muy tedioso en caso de hacerlo cada desarrollador individualmente. &lt;br /&gt;
&lt;br /&gt;
En Travis CI, esto se puede realizar a través de la llamada ''build matrix'', que es una combinación de posibles configuraciones del entorno de ejecución de la build. Por ejemplo, para el lenguaje Java, la build matrix que se puede especificar incluye la versión de JDK que se utilizará y las variables de entorno que se definen en la construcción. &lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
# Utilizando la documentación de https://docs.travis-ci.com/user/languages/python/ configura el &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; para que construya el proyecto en las versiones 2.7, 3.3 y 3.6&lt;br /&gt;
# '''(Avanzado)''' Añade ahora para que construya el proyecto probándolo con dos versiones distintas de Django (https://docs.travis-ci.com/user/languages/python/#testing-against-multiple-versions-of-dependencies-eg-django-or-flask)&lt;br /&gt;
# '''(Avanzado)''' ¿Cuántos jobs se están lanzando ahora por cada build?&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Travis_CI_para_integraci%C3%B3n_continua&amp;diff=7929</id>
		<title>Travis CI para integración continua</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Travis_CI_para_integraci%C3%B3n_continua&amp;diff=7929"/>
				<updated>2018-11-19T15:35:31Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Ejercicio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El funcionamiento básico de Travis CI es clonar el repositorio de GitHub a un nuevo entorno virtual y llevar a cabo una serie de tareas para construir y probar tu código. Si alguna de estas tareas falla, el build se considera ''broken''. Si no falla ninguna tarea, el build se considera ''passed'' y Travis CI puede desplegar tu código a un servidor web, por ejemplo. A continuación vamos a ver lo que hay que hacer para habilitar el sistema de integración continua y describiremos algunos conceptos básicos de Travis CI.&lt;br /&gt;
&lt;br /&gt;
= Conceptos básicos =&lt;br /&gt;
&lt;br /&gt;
En Travis CI hay 4 palabras que tienen un significado específico (obtenido de https://docs.travis-ci.com/user/for-beginners):&lt;br /&gt;
&lt;br /&gt;
== job == &lt;br /&gt;
Un proceso automatizado que clona tu repositorio en un entorno virtual y realiza una serie de ''phases'' como compilar el código, ejecutar tests, etc. Un job falla si el código que devuelve la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; no es cero.&lt;br /&gt;
&lt;br /&gt;
== phase == &lt;br /&gt;
El conjunto de pasos secuenciales de un job. Por ejemplo, la fase &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; viene antes de la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;, que viene antes de la fase opcional &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt;. Las fases de Travis CI son las siguientes:&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;Install apt addons&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;Install cache components&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt;: instalar paquetes del SO necesarios para la construcción del proyecto&lt;br /&gt;
# &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;: instalar las dependencias (librerías) que sean necesarias para la construcción del proyecto&lt;br /&gt;
# &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;: ejecutar el script de construcción del proyecto. &lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;before_cache&amp;lt;/code&amp;gt;: para limpiar la caché&lt;br /&gt;
# &amp;lt;code&amp;gt;after_success&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;after_failure&amp;lt;/code&amp;gt;: after_success se ejecutará si la construcción se realiza correctamente como generar la documentación. after_failure se ejecutará en caso de que la construcción falle.&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;before_deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt;: desplegar la aplicación a una plataforma integrada con Travis CI como Heroku o Engine Yard.&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;after_deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;after_script&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== build ==&lt;br /&gt;
Un grupo de jobs. Por ejemplo, un build puede tener dos jobs, cada uno prueba un proyecto con una versión distinta de Java. Un build termina cuando todos sus jobs terminan. Una build se considera broken si uno o más de sus jobs termina con un estado que no es ''passed''. Esto puede ocurrir por una de estas tres razones:&lt;br /&gt;
* ''errored'': un comando en la fase &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt; falló. En este caso el job termina inmediatamente.&lt;br /&gt;
* ''failed'': un comando en la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; falló. El job se ejecuta hasta que se termina&lt;br /&gt;
* ''canceled'': un usuario cancela el job antes de que complete.&lt;br /&gt;
&lt;br /&gt;
En https://docs.travis-ci.com/user/common-build-problems/ se recogen una relación de problemas comunes en la construcción de un proyecto y cómo resolverlo.&lt;br /&gt;
&lt;br /&gt;
== stage == &lt;br /&gt;
Un grupo de jobs que se ejecutan en paralelo.&lt;br /&gt;
&lt;br /&gt;
== Infraestructura ==&lt;br /&gt;
Travis CI ofrece tres tipos de infraestructuras diferentes:&lt;br /&gt;
* Basada en contenedores, que es la opción por defecto. Es un Linux Ubuntu ejecutándose en un contenedor. Se ejecuta más rápido que la basada en máquinas virtuales, pero no soporte el uso de sudo, setuid o setgid.&lt;br /&gt;
* Basada en máquinas virtuales. Es un Linux Ubuntu ejecutándose en una máquina virtual completa. Es un poco más lenta que la basada en contenedores para iniciarse, pero tiene más recursos y soporta sudo, setuid y setgid.&lt;br /&gt;
* OS X. Para probar software que necesite el entorno OS X para funcionar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= El fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Como ya hemos comentado, toda la información sobre cómo realizar cada job se especifica en un fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; que debe estar en el raíz del repositorio en cuestión. En su forma más básica, este fichero debe especificar el lenguaje utilizado en el proyecto para que cargue las librerías adecuadas en el entorno de ejecución y lo que se debe hacer en cada una de las fases descritas anteriormente. No es necesario especificar acciones en todas las fases. &lt;br /&gt;
&lt;br /&gt;
De este modo, como nuestro proyecto Decide está en python, el fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; podría quedar de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
language: python &lt;br /&gt;
python: &lt;br /&gt;
- &amp;quot;3.6&amp;quot;&lt;br /&gt;
env: &lt;br /&gt;
- DJANGO=2.0 DB=postgres&lt;br /&gt;
before_install: &lt;br /&gt;
- cd decide&lt;br /&gt;
install: &lt;br /&gt;
- pip install -r ../requirements.txt&lt;br /&gt;
script: &lt;br /&gt;
- python manage.py test&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este caso, estamos especificando que queremos utilizar la versión 3.6 de Python; indicamos un par de variables de entorno que son necesarias para el funcionamiento de la aplicación, y ejecutamos los comandos necesarios para:&lt;br /&gt;
* Moverse al path adecuado antes de la fase install (&amp;lt;code&amp;gt;cd decide&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Instalar las dependencias que necesita el proyecto para funcionar en la fase install (&amp;lt;code&amp;gt;pip install -r ../requirements.txt&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Lanzar las pruebas en la fase script (&amp;lt;code&amp;gt;python manage.py test&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Soporte a base de datos =&lt;br /&gt;
&lt;br /&gt;
Es frecuente que una aplicación requiera de bases de datos u otros servicios externos para poder probarse. Travis CI tiene soporte de serie para las bases de datos más habituales como MySQL, PostgreSQL, MongoDB o ElasticSearch. La lista completa se puede encontrar en https://docs.travis-ci.com/user/database-setup/ así como la forma de configurar cada una de ellas que, de nuevo, se realiza a través de &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt;. Por ejemplo, para configurar postgresql hay que añadir a &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
services:&lt;br /&gt;
  - postgresql&lt;br /&gt;
&lt;br /&gt;
before_script:&lt;br /&gt;
 - psql -c &amp;quot;create user decide with password 'decide'&amp;quot; &lt;br /&gt;
 - psql -c &amp;quot;create database decide owner decide&amp;quot;&lt;br /&gt;
 - python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La primera instrucción le dice a Travis CI que instale postgresql pues lo vamos a utilizar y la segunda instrucción le indica que cree un usuario, la base de datos y las tablas de la base de datos (&amp;lt;code&amp;gt;python manage.py migrate&amp;lt;/code&amp;gt;) justo antes de la fase de script. Estos pasos (crear usuario, base de datos y tablas) también podrían ir ubicados en una fase anterior como &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt; y son específicos de cada aplicación en cuestión. El resto de bases de datos se configuran de una forma bastante similar. &lt;br /&gt;
&lt;br /&gt;
También se puede definir información adicional de configuración. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
services:&lt;br /&gt;
  - postgresql&lt;br /&gt;
addons:&lt;br /&gt;
  postgresql: &amp;quot;9.6&amp;quot;&lt;br /&gt;
global:&lt;br /&gt;
  - PGPORT=5432&lt;br /&gt;
&lt;br /&gt;
before_script:&lt;br /&gt;
 - psql -c &amp;quot;create user decide with password 'decide'&amp;quot; &lt;br /&gt;
 - psql -c &amp;quot;create database decide owner decide&amp;quot;&lt;br /&gt;
 - python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este caso, la segunda instrucción le indica cuál es la versión de postgresql que se va a utilizar; la tercera especifica la configuración sobre el puerto donde va a estar escuchando. Las restantes son iguales al caso anterior.&lt;br /&gt;
&lt;br /&gt;
= Configuración de la aplicación =&lt;br /&gt;
&lt;br /&gt;
La configuración del entorno donde se van a ejecutar las pruebas y la base de datos es sólo la mitad del recorrido. Una vez configurado, es necesario indicar a nuestra aplicación cuál es la base de datos que vamos a utilizar y el resto de opciones de configuración. Para ello, siguiendo el esquema propuesto en , vamos a crear un fichero con la configuración para travis y luego vamos a copiarlo al principio de la fase &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
El fichero de configuración para travis sería el siguiente:&lt;br /&gt;
&lt;br /&gt;
local_settings.travis.py&lt;br /&gt;
----------------------------------&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
ALLOWED_HOSTS = [&amp;quot;*&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
# Modules in use, commented modules that you won't use&lt;br /&gt;
MODULES = [&lt;br /&gt;
    'authentication',&lt;br /&gt;
    'base',&lt;br /&gt;
    'booth',&lt;br /&gt;
    'census',&lt;br /&gt;
    'mixnet',&lt;br /&gt;
    'postproc',&lt;br /&gt;
    'store',&lt;br /&gt;
    'visualizer',&lt;br /&gt;
    'voting',&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
APIS = {&lt;br /&gt;
    'authentication': 'http://localhost:8000',&lt;br /&gt;
    'base': 'http://localhost:8000',&lt;br /&gt;
    'booth': 'http://localhost:8000',&lt;br /&gt;
    'census': 'http://localhost:8000',&lt;br /&gt;
    'mixnet': 'http://localhost:8000',&lt;br /&gt;
    'postproc': 'http://localhost:8000',&lt;br /&gt;
    'store': 'http://localhost:8000',&lt;br /&gt;
    'visualizer': 'http://localhost:8000',&lt;br /&gt;
    'voting': 'http://localhost:8000',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BASEURL = 'http://localhost:8000'&lt;br /&gt;
&lt;br /&gt;
DATABASES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'ENGINE': 'django.db.backends.postgresql',&lt;br /&gt;
        'NAME': 'postgres',&lt;br /&gt;
        'USER': 'postgres',&lt;br /&gt;
        'HOST': 'localhost',&lt;br /&gt;
        'PORT': '5432',&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# number of bits for the key, all auths should use the same number of bits&lt;br /&gt;
KEYBITS = 256&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo copiamos con el nombre adecuado modificando el fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; tal como sigue:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
before_script:&lt;br /&gt;
 - cp local_settings.travis.py local_settings.py&lt;br /&gt;
 - ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
# Usando tu cuenta de GitHub entra en https://travis-ci.org y acepta la confirmación de permisos de GitHub.&lt;br /&gt;
# Una vez que estés logueado en Travis CI y se hayan sincronizado tus repositorios de GitHub, ve a tu perfil y activa el repositorio que quieras construir [[Archivo:Enable.png]].&lt;br /&gt;
# Añade un fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; según lo descrito en el texto a tu repositorio de Decide para indicar a Travis CI lo que tiene que hacer. &lt;br /&gt;
# Haz commit y push del &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; para iniciar una build de Travis CI&lt;br /&gt;
# Comprueba en la [https://travis-ci.org/auth página de estado de la construcción] si tu build ha pasado o falla.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Travis_CI_para_integraci%C3%B3n_continua&amp;diff=7928</id>
		<title>Travis CI para integración continua</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Travis_CI_para_integraci%C3%B3n_continua&amp;diff=7928"/>
				<updated>2018-11-19T15:35:15Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «El funcionamiento básico de Travis CI es clonar el repositorio de GitHub a un nuevo entorno virtual y llevar a cabo una serie de tareas para construir y probar tu código....»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El funcionamiento básico de Travis CI es clonar el repositorio de GitHub a un nuevo entorno virtual y llevar a cabo una serie de tareas para construir y probar tu código. Si alguna de estas tareas falla, el build se considera ''broken''. Si no falla ninguna tarea, el build se considera ''passed'' y Travis CI puede desplegar tu código a un servidor web, por ejemplo. A continuación vamos a ver lo que hay que hacer para habilitar el sistema de integración continua y describiremos algunos conceptos básicos de Travis CI.&lt;br /&gt;
&lt;br /&gt;
= Conceptos básicos =&lt;br /&gt;
&lt;br /&gt;
En Travis CI hay 4 palabras que tienen un significado específico (obtenido de https://docs.travis-ci.com/user/for-beginners):&lt;br /&gt;
&lt;br /&gt;
== job == &lt;br /&gt;
Un proceso automatizado que clona tu repositorio en un entorno virtual y realiza una serie de ''phases'' como compilar el código, ejecutar tests, etc. Un job falla si el código que devuelve la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; no es cero.&lt;br /&gt;
&lt;br /&gt;
== phase == &lt;br /&gt;
El conjunto de pasos secuenciales de un job. Por ejemplo, la fase &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; viene antes de la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;, que viene antes de la fase opcional &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt;. Las fases de Travis CI son las siguientes:&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;Install apt addons&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;Install cache components&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt;: instalar paquetes del SO necesarios para la construcción del proyecto&lt;br /&gt;
# &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;: instalar las dependencias (librerías) que sean necesarias para la construcción del proyecto&lt;br /&gt;
# &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;: ejecutar el script de construcción del proyecto. &lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;before_cache&amp;lt;/code&amp;gt;: para limpiar la caché&lt;br /&gt;
# &amp;lt;code&amp;gt;after_success&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;after_failure&amp;lt;/code&amp;gt;: after_success se ejecutará si la construcción se realiza correctamente como generar la documentación. after_failure se ejecutará en caso de que la construcción falle.&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;before_deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt;: desplegar la aplicación a una plataforma integrada con Travis CI como Heroku o Engine Yard.&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;after_deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;after_script&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== build ==&lt;br /&gt;
Un grupo de jobs. Por ejemplo, un build puede tener dos jobs, cada uno prueba un proyecto con una versión distinta de Java. Un build termina cuando todos sus jobs terminan. Una build se considera broken si uno o más de sus jobs termina con un estado que no es ''passed''. Esto puede ocurrir por una de estas tres razones:&lt;br /&gt;
* ''errored'': un comando en la fase &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt; falló. En este caso el job termina inmediatamente.&lt;br /&gt;
* ''failed'': un comando en la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; falló. El job se ejecuta hasta que se termina&lt;br /&gt;
* ''canceled'': un usuario cancela el job antes de que complete.&lt;br /&gt;
&lt;br /&gt;
En https://docs.travis-ci.com/user/common-build-problems/ se recogen una relación de problemas comunes en la construcción de un proyecto y cómo resolverlo.&lt;br /&gt;
&lt;br /&gt;
== stage == &lt;br /&gt;
Un grupo de jobs que se ejecutan en paralelo.&lt;br /&gt;
&lt;br /&gt;
== Infraestructura ==&lt;br /&gt;
Travis CI ofrece tres tipos de infraestructuras diferentes:&lt;br /&gt;
* Basada en contenedores, que es la opción por defecto. Es un Linux Ubuntu ejecutándose en un contenedor. Se ejecuta más rápido que la basada en máquinas virtuales, pero no soporte el uso de sudo, setuid o setgid.&lt;br /&gt;
* Basada en máquinas virtuales. Es un Linux Ubuntu ejecutándose en una máquina virtual completa. Es un poco más lenta que la basada en contenedores para iniciarse, pero tiene más recursos y soporta sudo, setuid y setgid.&lt;br /&gt;
* OS X. Para probar software que necesite el entorno OS X para funcionar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= El fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Como ya hemos comentado, toda la información sobre cómo realizar cada job se especifica en un fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; que debe estar en el raíz del repositorio en cuestión. En su forma más básica, este fichero debe especificar el lenguaje utilizado en el proyecto para que cargue las librerías adecuadas en el entorno de ejecución y lo que se debe hacer en cada una de las fases descritas anteriormente. No es necesario especificar acciones en todas las fases. &lt;br /&gt;
&lt;br /&gt;
De este modo, como nuestro proyecto Decide está en python, el fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; podría quedar de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
language: python &lt;br /&gt;
python: &lt;br /&gt;
- &amp;quot;3.6&amp;quot;&lt;br /&gt;
env: &lt;br /&gt;
- DJANGO=2.0 DB=postgres&lt;br /&gt;
before_install: &lt;br /&gt;
- cd decide&lt;br /&gt;
install: &lt;br /&gt;
- pip install -r ../requirements.txt&lt;br /&gt;
script: &lt;br /&gt;
- python manage.py test&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este caso, estamos especificando que queremos utilizar la versión 3.6 de Python; indicamos un par de variables de entorno que son necesarias para el funcionamiento de la aplicación, y ejecutamos los comandos necesarios para:&lt;br /&gt;
* Moverse al path adecuado antes de la fase install (&amp;lt;code&amp;gt;cd decide&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Instalar las dependencias que necesita el proyecto para funcionar en la fase install (&amp;lt;code&amp;gt;pip install -r ../requirements.txt&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Lanzar las pruebas en la fase script (&amp;lt;code&amp;gt;python manage.py test&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Soporte a base de datos =&lt;br /&gt;
&lt;br /&gt;
Es frecuente que una aplicación requiera de bases de datos u otros servicios externos para poder probarse. Travis CI tiene soporte de serie para las bases de datos más habituales como MySQL, PostgreSQL, MongoDB o ElasticSearch. La lista completa se puede encontrar en https://docs.travis-ci.com/user/database-setup/ así como la forma de configurar cada una de ellas que, de nuevo, se realiza a través de &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt;. Por ejemplo, para configurar postgresql hay que añadir a &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
services:&lt;br /&gt;
  - postgresql&lt;br /&gt;
&lt;br /&gt;
before_script:&lt;br /&gt;
 - psql -c &amp;quot;create user decide with password 'decide'&amp;quot; &lt;br /&gt;
 - psql -c &amp;quot;create database decide owner decide&amp;quot;&lt;br /&gt;
 - python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La primera instrucción le dice a Travis CI que instale postgresql pues lo vamos a utilizar y la segunda instrucción le indica que cree un usuario, la base de datos y las tablas de la base de datos (&amp;lt;code&amp;gt;python manage.py migrate&amp;lt;/code&amp;gt;) justo antes de la fase de script. Estos pasos (crear usuario, base de datos y tablas) también podrían ir ubicados en una fase anterior como &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt; y son específicos de cada aplicación en cuestión. El resto de bases de datos se configuran de una forma bastante similar. &lt;br /&gt;
&lt;br /&gt;
También se puede definir información adicional de configuración. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
services:&lt;br /&gt;
  - postgresql&lt;br /&gt;
addons:&lt;br /&gt;
  postgresql: &amp;quot;9.6&amp;quot;&lt;br /&gt;
global:&lt;br /&gt;
  - PGPORT=5432&lt;br /&gt;
&lt;br /&gt;
before_script:&lt;br /&gt;
 - psql -c &amp;quot;create user decide with password 'decide'&amp;quot; &lt;br /&gt;
 - psql -c &amp;quot;create database decide owner decide&amp;quot;&lt;br /&gt;
 - python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este caso, la segunda instrucción le indica cuál es la versión de postgresql que se va a utilizar; la tercera especifica la configuración sobre el puerto donde va a estar escuchando. Las restantes son iguales al caso anterior.&lt;br /&gt;
&lt;br /&gt;
= Configuración de la aplicación =&lt;br /&gt;
&lt;br /&gt;
La configuración del entorno donde se van a ejecutar las pruebas y la base de datos es sólo la mitad del recorrido. Una vez configurado, es necesario indicar a nuestra aplicación cuál es la base de datos que vamos a utilizar y el resto de opciones de configuración. Para ello, siguiendo el esquema propuesto en , vamos a crear un fichero con la configuración para travis y luego vamos a copiarlo al principio de la fase &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
El fichero de configuración para travis sería el siguiente:&lt;br /&gt;
&lt;br /&gt;
local_settings.travis.py&lt;br /&gt;
----------------------------------&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
ALLOWED_HOSTS = [&amp;quot;*&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
# Modules in use, commented modules that you won't use&lt;br /&gt;
MODULES = [&lt;br /&gt;
    'authentication',&lt;br /&gt;
    'base',&lt;br /&gt;
    'booth',&lt;br /&gt;
    'census',&lt;br /&gt;
    'mixnet',&lt;br /&gt;
    'postproc',&lt;br /&gt;
    'store',&lt;br /&gt;
    'visualizer',&lt;br /&gt;
    'voting',&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
APIS = {&lt;br /&gt;
    'authentication': 'http://localhost:8000',&lt;br /&gt;
    'base': 'http://localhost:8000',&lt;br /&gt;
    'booth': 'http://localhost:8000',&lt;br /&gt;
    'census': 'http://localhost:8000',&lt;br /&gt;
    'mixnet': 'http://localhost:8000',&lt;br /&gt;
    'postproc': 'http://localhost:8000',&lt;br /&gt;
    'store': 'http://localhost:8000',&lt;br /&gt;
    'visualizer': 'http://localhost:8000',&lt;br /&gt;
    'voting': 'http://localhost:8000',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BASEURL = 'http://localhost:8000'&lt;br /&gt;
&lt;br /&gt;
DATABASES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'ENGINE': 'django.db.backends.postgresql',&lt;br /&gt;
        'NAME': 'postgres',&lt;br /&gt;
        'USER': 'postgres',&lt;br /&gt;
        'HOST': 'localhost',&lt;br /&gt;
        'PORT': '5432',&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# number of bits for the key, all auths should use the same number of bits&lt;br /&gt;
KEYBITS = 256&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo copiamos con el nombre adecuado modificando el fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; tal como sigue:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
before_script:&lt;br /&gt;
 - cp local_settings.travis.py local_settings.py&lt;br /&gt;
 - ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
== Para empezar con Travis CI ==&lt;br /&gt;
# Usando tu cuenta de GitHub entra en https://travis-ci.org y acepta la confirmación de permisos de GitHub.&lt;br /&gt;
# Una vez que estés logueado en Travis CI y se hayan sincronizado tus repositorios de GitHub, ve a tu perfil y activa el repositorio que quieras construir [[Archivo:Enable.png]].&lt;br /&gt;
# Añade un fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; según lo descrito en el texto a tu repositorio de Decide para indicar a Travis CI lo que tiene que hacer. &lt;br /&gt;
# Haz commit y push del &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; para iniciar una build de Travis CI&lt;br /&gt;
# Comprueba en la [https://travis-ci.org/auth página de estado de la construcción] si tu build ha pasado o falla.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Creando_mi_propia_imagen&amp;diff=7872</id>
		<title>Creando mi propia imagen</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Creando_mi_propia_imagen&amp;diff=7872"/>
				<updated>2018-11-08T17:21:22Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Podemos modificar una imagen existente y guardarla con un nombre diferente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
# docker run -it ubuntu bash&lt;br /&gt;
root@d66f7a3268e6:/# &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fijaros en que el prompt del interprete de ordenes ha cambiado e indica el numero que identifica de manera unica al contenedor que hemos lanzado. Este numero cambia para cada nueva instancia que lanzamos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
root@d66f7a3268e6:/# apt-get update&lt;br /&gt;
root@d66f7a3268e6:/# apt-get install apache2&lt;br /&gt;
apt-get install apache2&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree       &lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  apache2-bin apache2-data apache2-utils ...&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  apache2 apache2-bin apache2-data apache2-utils ...&lt;br /&gt;
0 upgraded, 57 newly installed, 0 to remove and 4 not upgraded.&lt;br /&gt;
Need to get 22.6 MB/22.6 MB of archives.&lt;br /&gt;
After this operation, 102 MB of additional disk space will be used.&lt;br /&gt;
Do you want to continue? [Y/n] &lt;br /&gt;
...&lt;br /&gt;
root@d66f7a3268e6:/# &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Escribo 'Y' y pulso enter para comenzar la instalacion del servidor web apache2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
root@d66f7a3268e6:/# exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
# docker commit -m &amp;quot;Imagen de ubuntu con apache2&amp;quot; -a &amp;quot;profe&amp;quot; d66f7a3268e6 ubuntu/apache2&lt;br /&gt;
sha256:b68ef77405104a6ea2de6fde986a519a2fc9710b26d9ae8ec2553f5050c51fd3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
# docker images&lt;br /&gt;
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE&lt;br /&gt;
ubuntu/apache2      latest              b68ef7740510        36 seconds ago      260MB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
# docker run -it -p 8888:80 ubuntu/apache2&lt;br /&gt;
# service apache2 start&lt;br /&gt;
 * Starting Apache httpd web server apache2                                     AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message&lt;br /&gt;
 * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y ahora si abro un navegador web al localhost al puerto 8888, me aparece la pagina que indica que apache esta funcionando correctamente.&lt;br /&gt;
&lt;br /&gt;
= Creando una imagen de Tomcat =&lt;br /&gt;
&lt;br /&gt;
Podemos usar la imagen de tomcat existente en los repositorios de docker, y modificar anadiendo en la carpeta webapps la aplicacion que hemos desarrollado y que distribuimos en formato fichero .war&lt;br /&gt;
&lt;br /&gt;
Para ello podemos crear un fichero Dockerfile que nos automatiza la creacion de una imagen modificada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
FROM tomcat:8-jre8&lt;br /&gt;
&lt;br /&gt;
ADD target/hello-java-0.1.0.war /usr/local/tomcat/webapps&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este fichero indica que docker tiene que descargar la imagen tomcat y tiene que anadir el fichero hello-java-0.1.0.war a la carpeta /usr/local/tomcat/webapps.&lt;br /&gt;
&lt;br /&gt;
Docker nos ofrece un lenguaje de scripting para automatizar la creacion de imagenes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
# docker build -t holamundo-java .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Va a crear la imagen, tras esto podemos lanzar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
# docker run -it -p 8080:8080 holamundo-java&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tras esto, desde un navegador, abrimos la URI: http://localhost:8080/hello-java-0.1.0/greeting.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_18/19&amp;diff=7803</id>
		<title>Prácticas - 18/19</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_18/19&amp;diff=7803"/>
				<updated>2018-10-23T06:36:15Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Práctica 1: [[Gestión del despliegue: Taller de Docker]]&lt;br /&gt;
* Práctica 2: [[Gestión del despliegue: Despliegue y desarrollo de Decide]]&lt;br /&gt;
* Práctica 3: [[Gestión de incidencias]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_del_despliegue:_Taller_de_Docker&amp;diff=7780</id>
		<title>Gestión del despliegue: Taller de Docker</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_del_despliegue:_Taller_de_Docker&amp;diff=7780"/>
				<updated>2018-10-08T11:23:14Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Presentación en pdf: [[Archivo:01-docker.pdf]].&lt;br /&gt;
* Fichero [https://www.dropbox.com/s/tla3fp97kb4ip53/hello-java-0.1.0.war hello-java-0.1.0.war] para el despliegue (este es el [https://www.dropbox.com/s/p7ne96vksge69u0/java-hello.zip código fuente]).&lt;br /&gt;
&lt;br /&gt;
= Instalación de Docker =&lt;br /&gt;
&lt;br /&gt;
* Hay una guía para Ubuntu 16.04 disponible [https://www.digitalocean.com/community/tutorials/como-instalar-y-usar-docker-en-ubuntu-16-04-es aquí].&lt;br /&gt;
* Para Mac se pueden seguir las [https://docs.docker.com/docker-for-mac/install/ instrucciones oficiales de la web de Docker]&lt;br /&gt;
* Si tienes Windows 10 versión Pro o Education de 64 bits puede seguir las [https://docs.docker.com/docker-for-windows/install/ instrucciones de Docker for Windows].&lt;br /&gt;
* Para otra versión de Windows, lo mejor es utilizar el [https://docs.docker.com/toolbox/overview/ Docker Toolbox], que es menos eficiente, pero ofrece similar funcionalidad.&lt;br /&gt;
&lt;br /&gt;
= Ordenes para docker =&lt;br /&gt;
&lt;br /&gt;
* [[Lanzando un hola mundo]]&lt;br /&gt;
* [[Operando con las imagenes]]&lt;br /&gt;
* [[Operando con los contenedores]]&lt;br /&gt;
* [[Creando mi propia imagen]]&lt;br /&gt;
&lt;br /&gt;
= Ejemplos  =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.docker.com/compose/wordpress/ Para instalar WordPress y MySQL] &lt;br /&gt;
* [http://codeomitted.com/deploy-war-file-to-docker-image/ Para construir una imagen con Tomcat básica]&lt;br /&gt;
* [https://runnable.com/docker/java/dockerize-your-java-application Para construir una imagen Java muy personalizada].&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Archivo:01-docker.pdf&amp;diff=7779</id>
		<title>Archivo:01-docker.pdf</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Archivo:01-docker.pdf&amp;diff=7779"/>
				<updated>2018-10-08T11:21:41Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Taller de Docker&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Taller de Docker&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_del_despliegue:_Taller_de_Docker&amp;diff=7778</id>
		<title>Gestión del despliegue: Taller de Docker</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_del_despliegue:_Taller_de_Docker&amp;diff=7778"/>
				<updated>2018-10-08T11:20:29Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «* Presentación en pdf: [https://www.dropbox.com/s/0ljenswr3r5g55g/01-docker.pdf Taller de Docker]. * Fichero [https://www.dropbox.com/s/tla3fp97kb4ip53/hello-java-0.1.0.wa...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Presentación en pdf: [https://www.dropbox.com/s/0ljenswr3r5g55g/01-docker.pdf Taller de Docker].&lt;br /&gt;
* Fichero [https://www.dropbox.com/s/tla3fp97kb4ip53/hello-java-0.1.0.war hello-java-0.1.0.war] para el despliegue (este es el [https://www.dropbox.com/s/p7ne96vksge69u0/java-hello.zip código fuente]).&lt;br /&gt;
&lt;br /&gt;
= Instalación de Docker =&lt;br /&gt;
&lt;br /&gt;
* Hay una guía para Ubuntu 16.04 disponible [https://www.digitalocean.com/community/tutorials/como-instalar-y-usar-docker-en-ubuntu-16-04-es aquí].&lt;br /&gt;
* Para Mac se pueden seguir las [https://docs.docker.com/docker-for-mac/install/ instrucciones oficiales de la web de Docker]&lt;br /&gt;
* Si tienes Windows 10 versión Pro o Education de 64 bits puede seguir las [https://docs.docker.com/docker-for-windows/install/ instrucciones de Docker for Windows].&lt;br /&gt;
* Para otra versión de Windows, lo mejor es utilizar el [https://docs.docker.com/toolbox/overview/ Docker Toolbox], que es menos eficiente, pero ofrece similar funcionalidad.&lt;br /&gt;
&lt;br /&gt;
= Ordenes para docker =&lt;br /&gt;
&lt;br /&gt;
* [[Lanzando un hola mundo]]&lt;br /&gt;
* [[Operando con las imagenes]]&lt;br /&gt;
* [[Operando con los contenedores]]&lt;br /&gt;
* [[Creando mi propia imagen]]&lt;br /&gt;
&lt;br /&gt;
= Ejemplos  =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.docker.com/compose/wordpress/ Para instalar WordPress y MySQL] &lt;br /&gt;
* [http://codeomitted.com/deploy-war-file-to-docker-image/ Para construir una imagen con Tomcat básica]&lt;br /&gt;
* [https://runnable.com/docker/java/dockerize-your-java-application Para construir una imagen Java muy personalizada].&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_18/19&amp;diff=7777</id>
		<title>Prácticas - 18/19</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_18/19&amp;diff=7777"/>
				<updated>2018-10-08T11:20:00Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «* Práctica 1: Gestión del despliegue: Taller de Docker»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Práctica 1: [[Gestión del despliegue: Taller de Docker]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7217</id>
		<title>Despliegue</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7217"/>
				<updated>2018-01-10T12:38:50Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Configurar despliegue desde Travis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [https://docs.travis-ci.com/user/deployment/custom/ despliegues personalizados] para poder realizar despliegues a cualquier otro tipo de proveedor no soportado.&lt;br /&gt;
&lt;br /&gt;
= Despliegue en Heroku =&lt;br /&gt;
&lt;br /&gt;
[https://www.heroku.com Heroku] es un proveedor de Plataforma como Servicio (PaaS) que proporciona la infraestructura necesaria para desplegar aplicaciones realizadas en diversos lenguajes de programación. Para hacer un despliegue en Heroku usando Travis hay que realizar los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
== Configurar Heroku ==&lt;br /&gt;
&lt;br /&gt;
# Crea una cuenta en [https://www.heroku.com Heroku]&lt;br /&gt;
# [https://devcenter.heroku.com/articles/getting-started-with-java#set-up Descarga el cliente de línea de comandos de Heroku]&lt;br /&gt;
# Ve al repositorio hello-java de la práctica anterior (o haz un fork de https://github.com/resinas/hello-java)&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku create NOMBREAPLICACION&amp;lt;/code&amp;gt;, donde NOMBREAPLICACION debe ser el nombre de aplicación que elijas. Eso debe crear una nueva aplicación en Heroku llamada NOMBREAPLICACION y configura el repositorio local para poder desplegar en Heroku. &lt;br /&gt;
# Crear un fichero llamado Procfile en el raíz del proyecto con una única línea de contenido: &amp;lt;code&amp;gt;web: java -jar target/dependency/jetty-runner.jar --port $PORT target/hello-java-0.1.0.war&amp;lt;/code&amp;gt; y haz un commit de este fichero.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;git push heroku master&amp;lt;/code&amp;gt;. Eso debe desplegar la aplicación en Heroku. El despliegue en Heroku se hace por medio de git.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku ps:scale web=1&amp;lt;/code&amp;gt;. Con esto te aseguras que tienes un servidor funcionando para la aplicación.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku open&amp;lt;/code&amp;gt;. Esto abre un navegador con la URL de la aplicación y aparecerá un mensaje de error ya que la aplicación no responde nada en &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. Debes entrar en la URL &amp;lt;code&amp;gt;/greeting&amp;lt;/code&amp;gt; para poder ver el saludo.&lt;br /&gt;
&lt;br /&gt;
Con estos pasos podemos desplegar en Heroku en local. Ahora sólo falta configurar Travis para que despliegue automáticamente.&lt;br /&gt;
&lt;br /&gt;
== Configurar despliegue desde Travis ==&lt;br /&gt;
&lt;br /&gt;
# [https://github.com/travis-ci/travis.rb#installation Instala el cliente de línea de comandos de Travis CI]&lt;br /&gt;
# Ve al repositorio hello-java.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;travis setup heroku&amp;lt;/code&amp;gt;. Esto configura el .travis.yml para desplegar en Heroku. El Heroku Application Name debe ser el NOMBREAPLICACION definido con &amp;lt;code&amp;gt;heroku create&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Haz push en el repositorio de Github para que se actualice el .travis.yml en él.&lt;br /&gt;
# Lee la [https://docs.travis-ci.com/user/deployment/heroku/ documentación del despliegue en Heroku] para ver las distintas opciones de configuración que ofrece.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7216</id>
		<title>Despliegue</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7216"/>
				<updated>2018-01-10T12:32:39Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [https://docs.travis-ci.com/user/deployment/custom/ despliegues personalizados] para poder realizar despliegues a cualquier otro tipo de proveedor no soportado.&lt;br /&gt;
&lt;br /&gt;
= Despliegue en Heroku =&lt;br /&gt;
&lt;br /&gt;
[https://www.heroku.com Heroku] es un proveedor de Plataforma como Servicio (PaaS) que proporciona la infraestructura necesaria para desplegar aplicaciones realizadas en diversos lenguajes de programación. Para hacer un despliegue en Heroku usando Travis hay que realizar los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
== Configurar Heroku ==&lt;br /&gt;
&lt;br /&gt;
# Crea una cuenta en [https://www.heroku.com Heroku]&lt;br /&gt;
# [https://devcenter.heroku.com/articles/getting-started-with-java#set-up Descarga el cliente de línea de comandos de Heroku]&lt;br /&gt;
# Ve al repositorio hello-java de la práctica anterior (o haz un fork de https://github.com/resinas/hello-java)&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku create NOMBREAPLICACION&amp;lt;/code&amp;gt;, donde NOMBREAPLICACION debe ser el nombre de aplicación que elijas. Eso debe crear una nueva aplicación en Heroku llamada NOMBREAPLICACION y configura el repositorio local para poder desplegar en Heroku. &lt;br /&gt;
# Crear un fichero llamado Procfile en el raíz del proyecto con una única línea de contenido: &amp;lt;code&amp;gt;web: java -jar target/dependency/jetty-runner.jar --port $PORT target/hello-java-0.1.0.war&amp;lt;/code&amp;gt; y haz un commit de este fichero.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;git push heroku master&amp;lt;/code&amp;gt;. Eso debe desplegar la aplicación en Heroku. El despliegue en Heroku se hace por medio de git.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku ps:scale web=1&amp;lt;/code&amp;gt;. Con esto te aseguras que tienes un servidor funcionando para la aplicación.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku open&amp;lt;/code&amp;gt;. Esto abre un navegador con la URL de la aplicación y aparecerá un mensaje de error ya que la aplicación no responde nada en &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. Debes entrar en la URL &amp;lt;code&amp;gt;/greeting&amp;lt;/code&amp;gt; para poder ver el saludo.&lt;br /&gt;
&lt;br /&gt;
Con estos pasos podemos desplegar en Heroku en local. Ahora sólo falta configurar Travis para que despliegue automáticamente.&lt;br /&gt;
&lt;br /&gt;
== Configurar despliegue desde Travis ==&lt;br /&gt;
&lt;br /&gt;
# [https://github.com/travis-ci/travis.rb#installation Instala el cliente de línea de comandos de Travis CI]&lt;br /&gt;
# Ve al repositorio hello-java.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;travis setup heroku&amp;lt;/code&amp;gt;. Esto configura el .travis.yml para desplegar en Heroku.&lt;br /&gt;
# Haz push en el repositorio de Github para que se actualice el .travis.yml en él.&lt;br /&gt;
# Lee la [https://docs.travis-ci.com/user/deployment/heroku/ documentación del despliegue en Heroku] para ver las distintas opciones de configuración que ofrece.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7174</id>
		<title>Despliegue</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7174"/>
				<updated>2018-01-08T12:20:47Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Configurar Heroku */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [https://docs.travis-ci.com/user/deployment/custom/ despliegues personalizados] para poder realizar despliegues a cualquier otro tipo de proveedor no soportado.&lt;br /&gt;
&lt;br /&gt;
= Despliegue en Heroku =&lt;br /&gt;
&lt;br /&gt;
[https://www.heroku.com Heroku] es un proveedor de Plataforma como Servicio (PaaS) que proporciona la infraestructura necesaria para desplegar aplicaciones realizadas en diversos lenguajes de programación. Para hacer un despliegue en Heroku usando Travis hay que realizar los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
== Configurar Heroku ==&lt;br /&gt;
&lt;br /&gt;
# Crea una cuenta en [https://www.heroku.com Heroku]&lt;br /&gt;
# [https://devcenter.heroku.com/articles/getting-started-with-java#set-up Descarga el cliente de línea de comandos de Heroku]&lt;br /&gt;
# Ve al repositorio hello-java (o clónalo de https://github.com/resinas/hello-java)&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku create NOMBREAPLICACION&amp;lt;/code&amp;gt;, donde NOMBREAPLICACION debe ser el nombre de aplicación que elijas. Eso debe crear una nueva aplicación en Heroku llamada NOMBREAPLICACION y configura el repositorio local para poder desplegar en Heroku. &lt;br /&gt;
# Crear un fichero llamado Procfile en el raíz del proyecto con una única línea de contenido: &amp;lt;code&amp;gt;web: java -jar target/dependency/jetty-runner.jar --port $PORT target/hello-java-0.1.0.war&amp;lt;/code&amp;gt; y haz un commit de este fichero.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;git push heroku master&amp;lt;/code&amp;gt;. Eso debe desplegar la aplicación en Heroku. El despliegue en Heroku se hace por medio de git.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku ps:scale web=1&amp;lt;/code&amp;gt;. Con esto te aseguras que tienes un servidor funcionando para la aplicación.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku open&amp;lt;/code&amp;gt;. Esto abre un navegador con la URL de la aplicación y aparecerá un mensaje de error ya que la aplicación no responde nada en &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. Debes entrar en la URL &amp;lt;code&amp;gt;/greeting&amp;lt;/code&amp;gt; para poder ver el saludo.&lt;br /&gt;
&lt;br /&gt;
Con estos pasos podemos desplegar en Heroku en local. Ahora sólo falta configurar Travis para que despliegue automáticamente.&lt;br /&gt;
&lt;br /&gt;
== Configurar despliegue desde Travis ==&lt;br /&gt;
&lt;br /&gt;
# [https://github.com/travis-ci/travis.rb#installation Instala el cliente de línea de comandos de Travis CI]&lt;br /&gt;
# Ve al repositorio hello-java.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;travis setup heroku&amp;lt;/code&amp;gt;. Esto configura el .travis.yml para desplegar en Heroku.&lt;br /&gt;
# Haz push en el repositorio de Github para que se actualice el .travis.yml en él.&lt;br /&gt;
# Lee la [https://docs.travis-ci.com/user/deployment/heroku/ documentación del despliegue en Heroku] para ver las distintas opciones de configuración que ofrece.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7171</id>
		<title>Despliegue</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7171"/>
				<updated>2018-01-08T09:49:30Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Configurar Heroku */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [https://docs.travis-ci.com/user/deployment/custom/ despliegues personalizados] para poder realizar despliegues a cualquier otro tipo de proveedor no soportado.&lt;br /&gt;
&lt;br /&gt;
= Despliegue en Heroku =&lt;br /&gt;
&lt;br /&gt;
[https://www.heroku.com Heroku] es un proveedor de Plataforma como Servicio (PaaS) que proporciona la infraestructura necesaria para desplegar aplicaciones realizadas en diversos lenguajes de programación. Para hacer un despliegue en Heroku usando Travis hay que realizar los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
== Configurar Heroku ==&lt;br /&gt;
&lt;br /&gt;
# Crea una cuenta en [https://www.heroku.com Heroku]&lt;br /&gt;
# [https://devcenter.heroku.com/articles/getting-started-with-java#set-up Descarga el cliente de línea de comandos de Heroku]&lt;br /&gt;
# Ve al repositorio hello-java (o clónalo de https://github.com/resinas/hello-java)&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku create NOMBREAPLICACION&amp;lt;/code&amp;gt;, donde NOMBREAPLICACION debe ser el nombre de aplicación que elijas. Eso debe crear una nueva aplicación en Heroku llamada NOMBREAPLICACION y configura el repositorio local para poder desplegar en Heroku. &lt;br /&gt;
# Crear un fichero llamado Procfile en el raíz del proyecto con una única línea de contenido: &amp;lt;code&amp;gt;web: java -jar target/dependency/jetty-runner.jar --port $PORT target/hello-java-0.1.0.war&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;git push heroku master&amp;lt;/code&amp;gt;. Eso debe desplegar la aplicación en Heroku. El despliegue en Heroku se hace por medio de git.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku ps:scale web=1&amp;lt;/code&amp;gt;. Con esto te aseguras que tienes un servidor funcionando para la aplicación.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku open&amp;lt;/code&amp;gt;. Esto abre un navegador con la URL de la aplicación y aparecerá un mensaje de error ya que la aplicación no responde nada en &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. Debes entrar en la URL &amp;lt;code&amp;gt;/greeting&amp;lt;/code&amp;gt; para poder ver el saludo.&lt;br /&gt;
&lt;br /&gt;
Con estos pasos podemos desplegar en Heroku en local. Ahora sólo falta configurar Travis para que despliegue automáticamente.&lt;br /&gt;
&lt;br /&gt;
== Configurar despliegue desde Travis ==&lt;br /&gt;
&lt;br /&gt;
# [https://github.com/travis-ci/travis.rb#installation Instala el cliente de línea de comandos de Travis CI]&lt;br /&gt;
# Ve al repositorio hello-java.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;travis setup heroku&amp;lt;/code&amp;gt;. Esto configura el .travis.yml para desplegar en Heroku.&lt;br /&gt;
# Haz push en el repositorio de Github para que se actualice el .travis.yml en él.&lt;br /&gt;
# Lee la [https://docs.travis-ci.com/user/deployment/heroku/ documentación del despliegue en Heroku] para ver las distintas opciones de configuración que ofrece.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7170</id>
		<title>Despliegue</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7170"/>
				<updated>2018-01-08T09:48:27Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Configurar Heroku */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [https://docs.travis-ci.com/user/deployment/custom/ despliegues personalizados] para poder realizar despliegues a cualquier otro tipo de proveedor no soportado.&lt;br /&gt;
&lt;br /&gt;
= Despliegue en Heroku =&lt;br /&gt;
&lt;br /&gt;
[https://www.heroku.com Heroku] es un proveedor de Plataforma como Servicio (PaaS) que proporciona la infraestructura necesaria para desplegar aplicaciones realizadas en diversos lenguajes de programación. Para hacer un despliegue en Heroku usando Travis hay que realizar los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
== Configurar Heroku ==&lt;br /&gt;
&lt;br /&gt;
# Crea una cuenta en [https://www.heroku.com Heroku]&lt;br /&gt;
# [https://devcenter.heroku.com/articles/getting-started-with-java#set-up Descarga el cliente de línea de comandos de Heroku]&lt;br /&gt;
# Ve al repositorio hello-java (o clónalo de https://github.com/resinas/hello-java)&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku create NOMBREAPLICACION&amp;lt;/code&amp;gt;, donde NOMBREAPLICACION debe ser el nombre de aplicación que elijas. Eso debe crear una nueva aplicación en Heroku llamada NOMBREAPLICACION y configura el repositorio local para poder desplegar en Heroku. &lt;br /&gt;
# Crear un fichero Procfile (si no está ya) en el raíz del proyecto con una única línea de contenido: &amp;lt;code&amp;gt;web: java -jar target/dependency/jetty-runner.jar --port $PORT target/hello-java-0.1.0.war&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;git push heroku master&amp;lt;/code&amp;gt;. Eso debe desplegar la aplicación en Heroku. El despliegue en Heroku se hace por medio de git.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku ps:scale web=1&amp;lt;/code&amp;gt;. Con esto te aseguras que tienes un servidor funcionando para la aplicación.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku open&amp;lt;/code&amp;gt;. Esto abre un navegador con la URL de la aplicación y aparecerá un mensaje de error ya que la aplicación no responde nada en &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. Debes entrar en la URL &amp;lt;code&amp;gt;/greeting&amp;lt;/code&amp;gt; para poder ver el saludo.&lt;br /&gt;
&lt;br /&gt;
Con estos pasos podemos desplegar en Heroku en local. Ahora sólo falta configurar Travis para que despliegue automáticamente.&lt;br /&gt;
&lt;br /&gt;
== Configurar despliegue desde Travis ==&lt;br /&gt;
&lt;br /&gt;
# [https://github.com/travis-ci/travis.rb#installation Instala el cliente de línea de comandos de Travis CI]&lt;br /&gt;
# Ve al repositorio hello-java.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;travis setup heroku&amp;lt;/code&amp;gt;. Esto configura el .travis.yml para desplegar en Heroku.&lt;br /&gt;
# Haz push en el repositorio de Github para que se actualice el .travis.yml en él.&lt;br /&gt;
# Lee la [https://docs.travis-ci.com/user/deployment/heroku/ documentación del despliegue en Heroku] para ver las distintas opciones de configuración que ofrece.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7169</id>
		<title>Despliegue</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7169"/>
				<updated>2018-01-08T08:28:47Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [https://docs.travis-ci.com/user/deployment/custom/ despliegues personalizados] para poder realizar despliegues a cualquier otro tipo de proveedor no soportado.&lt;br /&gt;
&lt;br /&gt;
= Despliegue en Heroku =&lt;br /&gt;
&lt;br /&gt;
[https://www.heroku.com Heroku] es un proveedor de Plataforma como Servicio (PaaS) que proporciona la infraestructura necesaria para desplegar aplicaciones realizadas en diversos lenguajes de programación. Para hacer un despliegue en Heroku usando Travis hay que realizar los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
== Configurar Heroku ==&lt;br /&gt;
&lt;br /&gt;
# Crea una cuenta en [https://www.heroku.com Heroku]&lt;br /&gt;
# [https://devcenter.heroku.com/articles/getting-started-with-java#set-up Descarga el cliente de línea de comandos de Heroku]&lt;br /&gt;
# Ve al repositorio hello-java (o clónalo de https://github.com/resinas/hello-java)&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku create NOMBREAPLICACION&amp;lt;/code&amp;gt;, donde NOMBREAPLICACION debe ser el nombre de aplicación que elijas. Eso debe crear una nueva aplicación en Heroku llamada NOMBREAPLICACION y configura el repositorio local para poder desplegar en Heroku. &lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;git push heroku master&amp;lt;/code&amp;gt;. Eso debe desplegar la aplicación en Heroku. El despliegue en Heroku se hace por medio de git.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku ps:scale web=1&amp;lt;/code&amp;gt;. Con esto te aseguras que tienes un servidor funcionando para la aplicación.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku open&amp;lt;/code&amp;gt;. Esto abre un navegador con la URL de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Con estos pasos podemos desplegar en Heroku en local. Ahora sólo falta configurar Travis para que despliegue automáticamente. &lt;br /&gt;
&lt;br /&gt;
== Configurar despliegue desde Travis ==&lt;br /&gt;
&lt;br /&gt;
# [https://github.com/travis-ci/travis.rb#installation Instala el cliente de línea de comandos de Travis CI]&lt;br /&gt;
# Ve al repositorio hello-java.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;travis setup heroku&amp;lt;/code&amp;gt;. Esto configura el .travis.yml para desplegar en Heroku.&lt;br /&gt;
# Haz push en el repositorio de Github para que se actualice el .travis.yml en él.&lt;br /&gt;
# Lee la [https://docs.travis-ci.com/user/deployment/heroku/ documentación del despliegue en Heroku] para ver las distintas opciones de configuración que ofrece.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7167</id>
		<title>Despliegue</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7167"/>
				<updated>2018-01-08T07:24:07Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Despliegue en Heroku */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [despliegues personalizados https://docs.travis-ci.com/user/deployment/custom/] para poder realizar despliegues a cualquier otro tipo de proveedor no soportado.&lt;br /&gt;
&lt;br /&gt;
= Despliegue en Heroku =&lt;br /&gt;
&lt;br /&gt;
[https://www.heroku.com Heroku] es un proveedor de Plataforma como Servicio (PaaS) que proporciona la infraestructura necesaria para desplegar aplicaciones realizadas en diversos lenguajes de programación. Para hacer un despliegue en Heroku usando Travis hay que realizar los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
== Configurar Heroku ==&lt;br /&gt;
&lt;br /&gt;
# Crea una cuenta en [https://www.heroku.com Heroku]&lt;br /&gt;
# [https://devcenter.heroku.com/articles/getting-started-with-java#set-up Descarga el cliente de línea de comandos de Heroku]&lt;br /&gt;
# Ve al repositorio hello-java (o clónalo de https://github.com/resinas/hello-java)&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku create javaegc&amp;lt;/code&amp;gt;. Eso debe crear una nueva aplicación en Heroku llamada javaegc y configura el repositorio local para poder desplegar en Heroku&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;git push heroku master&amp;lt;/code&amp;gt;. Eso debe desplegar la aplicación en Heroku. El despliegue en Heroku se hace por medio de git.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku ps:scale web=1&amp;lt;/code&amp;gt;. Con esto te aseguras que tienes un servidor funcionando para la aplicación.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku open&amp;lt;/code&amp;gt;. Esto abre un navegador con la URL de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Con estos pasos podemos desplegar en Heroku en local. Ahora sólo falta configurar Travis para que despliegue automáticamente. &lt;br /&gt;
&lt;br /&gt;
== Configurar despliegue desde Travis ==&lt;br /&gt;
&lt;br /&gt;
# [https://github.com/travis-ci/travis.rb#installation Instala el cliente de línea de comandos de Travis CI]&lt;br /&gt;
# Ve al repositorio hello-java.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;travis setup heroku&amp;lt;/code&amp;gt;. Esto configura el .travis.yml para desplegar en Heroku.&lt;br /&gt;
# Haz push en el repositorio de Github para que se actualice el .travis.yml en él.&lt;br /&gt;
# Lee la [https://docs.travis-ci.com/user/deployment/heroku/ documentación del despliegue en Heroku] para ver las distintas opciones de configuración que ofrece.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_con_Travis_CI&amp;diff=7166</id>
		<title>Integración continua con Travis CI</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_con_Travis_CI&amp;diff=7166"/>
				<updated>2018-01-08T07:23:52Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Primeros pasos con Travis CI]]&lt;br /&gt;
* [[Flujo de trabajo con GitHub]]&lt;br /&gt;
* [[Notificaciones]]&lt;br /&gt;
* [[Uso con bases de datos]]&lt;br /&gt;
* [[Jobs con múltiples builds]]&lt;br /&gt;
* [[Despliegue]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7165</id>
		<title>Despliegue</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue&amp;diff=7165"/>
				<updated>2018-01-08T07:23:46Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [despliegues persona...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Travis CI soporta realizar despliegues a [https://docs.travis-ci.com/user/deployment/ gran variedad de proveedores]. Además, también permite realizar [despliegues personalizados https://docs.travis-ci.com/user/deployment/custom/] para poder realizar despliegues a cualquier otro tipo de proveedor no soportado.&lt;br /&gt;
&lt;br /&gt;
= Despliegue en Heroku =&lt;br /&gt;
&lt;br /&gt;
[Heroku https://www.heroku.com] es un proveedor de Plataforma como Servicio (PaaS) que proporciona la infraestructura necesaria para desplegar aplicaciones realizadas en diversos lenguajes de programación. Para hacer un despliegue en Heroku usando Travis hay que realizar los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
== Configurar Heroku ==&lt;br /&gt;
&lt;br /&gt;
# Crea una cuenta en [https://www.heroku.com Heroku]&lt;br /&gt;
# [https://devcenter.heroku.com/articles/getting-started-with-java#set-up Descarga el cliente de línea de comandos de Heroku]&lt;br /&gt;
# Ve al repositorio hello-java (o clónalo de https://github.com/resinas/hello-java)&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku create javaegc&amp;lt;/code&amp;gt;. Eso debe crear una nueva aplicación en Heroku llamada javaegc y configura el repositorio local para poder desplegar en Heroku&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;git push heroku master&amp;lt;/code&amp;gt;. Eso debe desplegar la aplicación en Heroku. El despliegue en Heroku se hace por medio de git.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku ps:scale web=1&amp;lt;/code&amp;gt;. Con esto te aseguras que tienes un servidor funcionando para la aplicación.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;heroku open&amp;lt;/code&amp;gt;. Esto abre un navegador con la URL de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Con estos pasos podemos desplegar en Heroku en local. Ahora sólo falta configurar Travis para que despliegue automáticamente. &lt;br /&gt;
&lt;br /&gt;
== Configurar despliegue desde Travis ==&lt;br /&gt;
&lt;br /&gt;
# [https://github.com/travis-ci/travis.rb#installation Instala el cliente de línea de comandos de Travis CI]&lt;br /&gt;
# Ve al repositorio hello-java.&lt;br /&gt;
# Ejecuta &amp;lt;code&amp;gt;travis setup heroku&amp;lt;/code&amp;gt;. Esto configura el .travis.yml para desplegar en Heroku.&lt;br /&gt;
# Haz push en el repositorio de Github para que se actualice el .travis.yml en él.&lt;br /&gt;
# Lee la [https://docs.travis-ci.com/user/deployment/heroku/ documentación del despliegue en Heroku] para ver las distintas opciones de configuración que ofrece.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Flujo_de_trabajo_con_GitHub&amp;diff=6931</id>
		<title>Flujo de trabajo con GitHub</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Flujo_de_trabajo_con_GitHub&amp;diff=6931"/>
				<updated>2017-12-11T13:37:16Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Como ya hemos comentado en la asignatura, una forma muy habitual de trabajar con GitHub es por medio de [https://help.github.com/articles/about-pull-requests/ pull requests]. Las pull requests se crean desde una rama a otra del repositorio y permite decirle a otros qué cambios has hecho en un repositorio en GitHub. Una vez que un pull request se abre, puedes discutir y revisar los cambios potenciales con colaboradores y continuar haciendo commits antes de que los cambios se integren en el repositorio. Un escenario muy habitual donde se trabaja con pull requests es si se sigue un flujo de desarrollo del estilo de [https://guides.github.com/introduction/flow/ GitHub Flow]. &lt;br /&gt;
&lt;br /&gt;
Cuando se abre una pull request, Travis CI recibe una notificación de pull request de GitHub. Esta notificación se transforma en una nueva build. Durante la build se actualiza el estado de los commits a uno de los siguientes:&lt;br /&gt;
* un warning porque aún se está construyendo&lt;br /&gt;
* que la pull request se debe de integrar con cuidado porque la build falló&lt;br /&gt;
* que la pull request se puede integrar sin problemas porque la build tuvo éxito&lt;br /&gt;
&lt;br /&gt;
Travis CI inicia una build cuando se abre por primera vez una pull request y cuando se añaden commits a ella. Además, la prueba se realiza a partir de un merge de la rama con la feature y la rama master, no únicamente de la rama con la feature.&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
&lt;br /&gt;
# Vamos a añadir una nueva característica a nuestra aplicación que permita decir hola en distintos idiomas. Para eso, vamos a crear una rama con nombre add-languages.&lt;br /&gt;
# En la nueva rama creada vamos a editar el fichero greeting.html en src/main/resources/templates con este contenido&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns:th=&amp;quot;http://www.thymeleaf.org&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Getting Started: Serving Web Content&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p th:text=&amp;quot;${hello} + ', ' + ${name} + '!'&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# añadimos la clase GreetingTranslator:&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package hello;&lt;br /&gt;
&lt;br /&gt;
public class GreetingTranslator {&lt;br /&gt;
	&lt;br /&gt;
	public String sayHelloIn(String lang) {&lt;br /&gt;
		String hello;&lt;br /&gt;
		if (&amp;quot;en&amp;quot;.equals(lang)) {&lt;br /&gt;
			hello = &amp;quot;hello&amp;quot;;&lt;br /&gt;
		} else if (&amp;quot;es&amp;quot;.equals(lang)) {&lt;br /&gt;
			hello = &amp;quot;hola&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			hello = &amp;quot;no hablo tu idioma&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# y modificamos el método greeting de la clase GreetingController como sigue:&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    @RequestMapping(&amp;quot;/greeting&amp;quot;)&lt;br /&gt;
    public String greeting(@RequestParam(value=&amp;quot;name&amp;quot;, required=false, defaultValue=&amp;quot;World&amp;quot;) String name, &lt;br /&gt;
    					   @RequestParam(value=&amp;quot;lang&amp;quot;, required=false, defaultValue=&amp;quot;en&amp;quot;) String lang, &lt;br /&gt;
    					   Model model) {&lt;br /&gt;
    	model.addAttribute(&amp;quot;hello&amp;quot;, greetingTranslator.sayHelloIn(lang));&lt;br /&gt;
        model.addAttribute(&amp;quot;name&amp;quot;, name);&lt;br /&gt;
        return &amp;quot;greeting&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# Haz un commit de estos cambios y haz un push de la nueva rama a GitHub&lt;br /&gt;
# Una vez que hemos decidido que estos cambios abarcan la funcionalidad deseada, vamos a crear una pull request siguiendo estas instrucciones: https://help.github.com/articles/creating-a-pull-request/#creating-the-pull-request (Fíjate bien que la pull request la haces a la rama &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt; de tu repositorio y no a otro repositorio ni a &amp;lt;code&amp;gt;resinas/master&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Si abres la pull request que se ha creado, podrás observar abajo cómo se ejecuta una nueva build en Travis CI con la pull request.&lt;br /&gt;
# ¿Ha funcionado con éxito la build de la pull request o ha fallado? ¿Por qué motivo?&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Jobs_con_m%C3%BAltiples_builds&amp;diff=6930</id>
		<title>Jobs con múltiples builds</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Jobs_con_m%C3%BAltiples_builds&amp;diff=6930"/>
				<updated>2017-12-11T13:35:01Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Una de las ventajas que ofrecen los sistemas de integración continua es que permiten automatizar la prueba del código en distintos entornos o con distintos servicios (por ejemplo, distintas bases de datos), algo que resultaría muy tedioso en caso de hacerlo cada desarrollador individualmente. &lt;br /&gt;
&lt;br /&gt;
En Travis CI, esto se puede realizar a través de la llamada ''build matrix'', que es una combinación de posibles configuraciones del entorno de ejecución de la build. Por ejemplo, para el lenguaje Java, la build matrix que se puede especificar incluye la versión de JDK que se utilizará y las variables de entorno que se definen en la construcción. &lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
# Utilizando la documentación de https://docs.travis-ci.com/user/languages/java/ configura el &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; para que construya el proyecto en Oracle JDK 7, Open JDK 7 y Oracle JDK 8&lt;br /&gt;
# '''(Avanzado)''' Añade ahora para que construya el proyecto probándolo con dos bases de datos distintas: MySQL y PostgreSQL (los datos del driver de PostgreSQL para la configuración se pueden encontrar en: https://jdbc.postgresql.org/documentation/head/load.html). No te olvides de añadir el driver de PostgreSQL al pom.xml (http://search.maven.org/#artifactdetails%7Corg.postgresql%7Cpostgresql%7C42.1.4.jre7%7Cbundle). &lt;br /&gt;
# '''(Avanzado)''' ¿Cuántos jobs se están lanzando ahora por cada build?&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_17/18&amp;diff=6881</id>
		<title>Prácticas - 17/18</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_17/18&amp;diff=6881"/>
				<updated>2017-12-09T01:48:47Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Práctica 1: [[Taller de docker]]&lt;br /&gt;
* Práctica 2: [[Gestión de incidencias]]&lt;br /&gt;
* Práctica 3: [[Gestión de versiones con git]]&lt;br /&gt;
* Práctica 4: [[Gestión de la construcción]]&lt;br /&gt;
* Práctica 5: [[Integración continua con Travis CI]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Jobs_con_m%C3%BAltiples_builds&amp;diff=6880</id>
		<title>Jobs con múltiples builds</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Jobs_con_m%C3%BAltiples_builds&amp;diff=6880"/>
				<updated>2017-12-09T01:47:21Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Una de las ventajas que ofrecen los sistemas de integración continua es que permiten automatizar la prueba del código en distintos entornos o con distintos servicios (por ejemplo, distintas bases de datos), algo que resultaría muy tedioso en caso de hacerlo cada desarrollador individualmente. &lt;br /&gt;
&lt;br /&gt;
En Travis CI, esto se puede realizar a través de la llamada ''build matrix'', que es una combinación de posibles configuraciones del entorno de ejecución de la build. Por ejemplo, para el lenguaje Java, la build matrix que se puede especificar incluye la versión de JDK que se utilizará y las variables de entorno que se definen en la construcción. &lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
# Utilizando la documentación de https://docs.travis-ci.com/user/languages/java/ configura el &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; para que construya el proyecto en Oracle JDK 7, Open JDK 7 y Oracle JDK 8&lt;br /&gt;
# Añade ahora para que construya el proyecto probándolo con dos bases de datos distintas: MySQL y PostgreSQL (los datos del driver de PostgreSQL para la configuración se pueden encontrar en: https://jdbc.postgresql.org/documentation/head/load.html). No te olvides de añadir el driver de PostgreSQL al pom.xml (http://search.maven.org/#artifactdetails%7Corg.postgresql%7Cpostgresql%7C42.1.4.jre7%7Cbundle). &lt;br /&gt;
# ¿Cuántos jobs se están lanzando ahora por cada build?&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Uso_con_bases_de_datos&amp;diff=6879</id>
		<title>Uso con bases de datos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Uso_con_bases_de_datos&amp;diff=6879"/>
				<updated>2017-12-09T01:40:34Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «Es frecuente que una aplicación requiera de bases de datos u otros servicios externos para poder probarse. Travis CI tiene soporte de serie para las bases de datos más ha...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es frecuente que una aplicación requiera de bases de datos u otros servicios externos para poder probarse. Travis CI tiene soporte de serie para las bases de datos más habituales como MySQL, PostgreSQL, MongoDB o ElasticSearch. La lista completa se puede encontrar en https://docs.travis-ci.com/user/database-setup/ así como la forma de configurar cada una de ellas que, de nuevo, se realiza a través de &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt;. Por ejemplo, para configurar mysql hay que añadir a &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
services:&lt;br /&gt;
  - mysql&lt;br /&gt;
&lt;br /&gt;
before_install:&lt;br /&gt;
  - mysql -e 'CREATE DATABASE IF NOT EXISTS hello_test;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La primera instrucción le dice a Travis CI que instale mysql pues lo vamos a utilizar y la segunda instrucción le indica que cree la base de datos justo antes de la fase de instalación. Travis ya crea dos usuarios por defecto: travis y root, ambos con password vacío. El resto de bases de datos se configuran de una forma bastante similar. &lt;br /&gt;
&lt;br /&gt;
No obstante, la configuración de la base de datos es sólo la mitad del recorrido. Una vez configurada, es necesario indicar a nuestra aplicación cuál es la base de datos que vamos a utilizar. Una de las formas más habituales de hacer esto hoy en día es por medio de variables de entorno. Además de para indicar la base de datos a utilizar, las variables de entorno también se suelen usar con frecuencia para almacenar las credenciales de acceso a servicios externos como Amazon S3 o Facebook. Lógicamente para poder hacer esto, nuestra aplicación tiene que estar preparado para leer las variables de configuración del entorno. Además, es necesario configurar esas variables de entorno en Travis CI. Eso se puede hacer de dos formas (ver más detalles en https://docs.travis-ci.com/user/environment-variables/):&lt;br /&gt;
* A través de la configuración del repositorio en la web de Travis CI&lt;br /&gt;
* A través del fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si elegimos esta segunda opción, las variables de entorno se definen añadiendo a &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; lo siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
env: &lt;br /&gt;
  - DATABASE=jdbc:mysql://localhost:3306/hello_test DB_USERNAME=travis DB_PASSWORD=&amp;quot;&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta configuración define cuatro variables de entorno: DATABASE, DB_USERNAME y DB_PASSWORD, que son las necesarias para definir la configuración de bases de datos en una aplicación Java que utilice Spring Data. En este caso, está configurando el acceso a una base de datos MySQL llamada hello_test que está en localhost y a la que accede por medio del usuario travis con contraseña vacía.&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
&lt;br /&gt;
# Cámbiate a la rama add-databases del repositorio hello-java. En esta rama, se modifica el código para que el saludo, en lugar de estar definido a mano en un fichero de código, esté almacenado en una base de datos. Para eso, se usa Spring JPA y las variables de entorno que se necesitan son:&lt;br /&gt;
#* SPRING_DATASOURCE_DRIVERCLASSNAME, que debe tomar el valor com.mysql.jdbc.Driver para una base de datos MySQL&lt;br /&gt;
#* SPRING_DATASOURCE_URL, que debe tomar el valor jdbc:mysql://localhost:3306/nombredelabasededatos&lt;br /&gt;
#* SPRING_DATASOURCE_USERNAME, que es el nombre del usuario de acceso a la base de datos&lt;br /&gt;
#* SPRING_DATASOURCE_PASSWORD, que es la contraseña de ese usuario&lt;br /&gt;
# Añade un fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; que construya la aplicación utilizando para las pruebas una base de datos MySQL.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Primeros_pasos_con_Travis_CI&amp;diff=6878</id>
		<title>Primeros pasos con Travis CI</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Primeros_pasos_con_Travis_CI&amp;diff=6878"/>
				<updated>2017-12-09T00:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Para empezar con Travis CI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El funcionamiento básico de Travis CI es clonar el repositorio de GitHub a un nuevo entorno virtual y llevar a cabo una serie de tareas para construir y probar tu código. Si alguna de estas tareas falla, el build se considera ''broken''. Si no falla ninguna tarea, el build se considera ''passed'' y Travis CI puede desplegar tu código a un servidor web, por ejemplo. A continuación vamos a ver lo que hay que hacer para habilitar el sistema de integración continua y describiremos algunos conceptos básicos de Travis CI.&lt;br /&gt;
&lt;br /&gt;
== Para empezar con Travis CI ==&lt;br /&gt;
# Haz un fork del repositorio de GitHub: https://github.com/resinas/hello-java&lt;br /&gt;
# Usando tu cuenta de GitHub entra en https://travis-ci.org y acepta la confirmación de permisos de GitHub.&lt;br /&gt;
# Una vez que estés logueado en Travis CI y se hayan sincronizado tus repositorios de GitHub, ve a tu perfil y activa el repositorio que quieras construir [[Archivo:Enable.png]].&lt;br /&gt;
# Añade un fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; a tu repositorio para indicar a Travis CI lo que tiene que hacer. Travis CI ya tiene una [https://docs.travis-ci.com/user/languages/java/ configuración por defecto para proyectos Java] por lo que el &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; puede ser tan sencillo como: &amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
language: java&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# Haz commit y push del &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; para iniciar una build de Travis CI&lt;br /&gt;
# Comprueba en la [https://travis-ci.org/auth página de estado de la construcción] si tu build ha pasado o falla.&lt;br /&gt;
# Haz una modificación en el código del proyecto para que falle una prueba. Haz commit y push del código y observa cómo la construcción falla.&lt;br /&gt;
&lt;br /&gt;
= Conceptos básicos =&lt;br /&gt;
&lt;br /&gt;
En Travis CI hay 4 palabras que tienen un significado específico (obtenido de https://docs.travis-ci.com/user/for-beginners):&lt;br /&gt;
&lt;br /&gt;
== job == &lt;br /&gt;
Un proceso automatizado que clona tu repositorio en un entorno virtual y realiza una serie de ''phases'' como compilar el código, ejecutar tests, etc. Un job falla si el código que devuelve la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; no es cero.&lt;br /&gt;
&lt;br /&gt;
== phase == &lt;br /&gt;
El conjunto de pasos secuenciales de un job. Por ejemplo, la fase &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; viene antes de la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;, que viene antes de la fase opcional &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt;. Las fases de Travis CI son las siguientes:&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;Install apt addons&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;Install cache components&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt;: instalar paquetes del SO necesarios para la construcción del proyecto&lt;br /&gt;
# &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;: instalar las dependencias (librerías) que sean necesarias para la construcción del proyecto&lt;br /&gt;
# &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;: ejecutar el script de construcción del proyecto. &lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;before_cache&amp;lt;/code&amp;gt;: para limpiar la caché&lt;br /&gt;
# &amp;lt;code&amp;gt;after_success&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;after_failure&amp;lt;/code&amp;gt;: after_success se ejecutará si la construcción se realiza correctamente como generar la documentación. after_failure se ejecutará en caso de que la construcción falle.&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;before_deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt;: desplegar la aplicación a una plataforma integrada con Travis CI como Heroku o Engine Yard.&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;after_deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;after_script&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== build ==&lt;br /&gt;
Un grupo de jobs. Por ejemplo, un build puede tener dos jobs, cada uno prueba un proyecto con una versión distinta de Java. Un build termina cuando todos sus jobs terminan. Una build se considera broken si uno o más de sus jobs termina con un estado que no es ''passed''. Esto puede ocurrir por una de estas tres razones:&lt;br /&gt;
* ''errored'': un comando en la fase &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt; falló. En este caso el job termina inmediatamente.&lt;br /&gt;
* ''failed'': un comando en la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; falló. El job se ejecuta hasta que se termina&lt;br /&gt;
* ''canceled'': un usuario cancela el job antes de que complete.&lt;br /&gt;
&lt;br /&gt;
En https://docs.travis-ci.com/user/common-build-problems/ se recogen una relación de problemas comunes en la construcción de un proyecto y cómo resolverlo.&lt;br /&gt;
&lt;br /&gt;
== stage == &lt;br /&gt;
Un grupo de jobs que se ejecutan en paralelo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Infraestructura =&lt;br /&gt;
Travis CI ofrece tres tipos de infraestructuras diferentes:&lt;br /&gt;
* Basada en contenedores, que es la opción por defecto. Es un Linux Ubuntu ejecutándose en un contenedor. Se ejecuta más rápido que la basada en máquinas virtuales, pero no soporte el uso de sudo, setuid o setgid.&lt;br /&gt;
* Basada en máquinas virtuales. Es un Linux Ubuntu ejecutándose en una máquina virtual completa. Es un poco más lenta que la basada en contenedores para iniciarse, pero tiene más recursos y soporta sudo, setuid y setgid.&lt;br /&gt;
* OS X. Para probar software que necesite el entorno OS X para funcionar.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_con_Travis_CI&amp;diff=6877</id>
		<title>Integración continua con Travis CI</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_con_Travis_CI&amp;diff=6877"/>
				<updated>2017-12-08T15:20:16Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Primeros pasos con Travis CI]]&lt;br /&gt;
* [[Flujo de trabajo con GitHub]]&lt;br /&gt;
* [[Notificaciones]]&lt;br /&gt;
* [[Uso con bases de datos]]&lt;br /&gt;
* [[Jobs con múltiples builds]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Jobs_con_m%C3%BAltiples_builds&amp;diff=6876</id>
		<title>Jobs con múltiples builds</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Jobs_con_m%C3%BAltiples_builds&amp;diff=6876"/>
				<updated>2017-12-08T15:19:17Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «Una de las ventajas que ofrecen los sistemas de integración continua es que permiten automatizar la prueba del código en distintos entornos o con distintos servicios (por...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Una de las ventajas que ofrecen los sistemas de integración continua es que permiten automatizar la prueba del código en distintos entornos o con distintos servicios (por ejemplo, distintas bases de datos), algo que resultaría muy tedioso en caso de hacerlo cada desarrollador individualmente. &lt;br /&gt;
&lt;br /&gt;
En Travis CI, esto se puede realizar a través de la llamada ''build matrix'', que es una combinación de posibles configuraciones del entorno de ejecución de la build. Por ejemplo, para el lenguaje Java, la build matrix que se puede especificar incluye la versión de JDK que se utilizará y las variables de entorno que se definen en la construcción. &lt;br /&gt;
&lt;br /&gt;
'''Ejercicio: ''' Utilizando la documentación de https://docs.travis-ci.com/user/languages/java/ configura el &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; para que construya el proyecto en Oracle JDK 7, Open JDK 7 y Oracle JDK 8.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Notificaciones&amp;diff=6873</id>
		<title>Notificaciones</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Notificaciones&amp;diff=6873"/>
				<updated>2017-12-08T09:35:24Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Por defecto, Travis CI envía notificaciones de correo electrónico al autor del commit cuando es miembro del repositorio, esto es cuando tienen:&lt;br /&gt;
* permisos de push o administración en repositorios públicos&lt;br /&gt;
* permisos de pull, push o administración en repositorios privados&lt;br /&gt;
&lt;br /&gt;
Los correos se envían cuando, en una rama dada:&lt;br /&gt;
* un build se ha ejecutado y ha fallado&lt;br /&gt;
* se acaba de corregir un build que había fallado previamente&lt;br /&gt;
&lt;br /&gt;
No obstante, es posible mostrar información de la construcción y configurar más detalles acerca de las notificaciones. A continuación se describe dos formas de llevarlo a cabo:&lt;br /&gt;
&lt;br /&gt;
= Mostrando imágenes con el estado de la construcción =&lt;br /&gt;
Es posible mostrar información de la construcción en una página web o en el README.md de los repositorios de GitHub. Para hacerlo, tan sólo hay que seguir las instrucciones que aparece aquí: https://docs.travis-ci.com/user/status-images/, seleccionando en el desplegable la opción &amp;quot;Markdown&amp;quot; y copiando el texto que aparece en el fichero README.md del repositorio.&lt;br /&gt;
&lt;br /&gt;
'''Ejercicio:''' Configura el README.md de tu proyecto para que muestre una imagen con el estado de la construcción.&lt;br /&gt;
&lt;br /&gt;
= Configurando notificaciones =&lt;br /&gt;
Travis CI te permite configurar el comportamiento por defecto de envíos de correos así como habilitar notificaciones a otros servicios como Slack, Pushover o IRC. La configuración de las notificaciones se hace también a través del fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; aunque en algunos casos es necesario configurar previamente la integración con el servicio. La documentación sobre cómo configurar las notificaciones está en https://docs.travis-ci.com/user/notifications/&lt;br /&gt;
&lt;br /&gt;
'''Ejercicio:''' Configura Travis CI para que envíe un correo siempre que haya una nueva build, tanto si tiene éxito como si falla, y que además notifique siempre a tu correo electrónico independientemente de quién haya hecho el commit.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Notificaciones&amp;diff=6852</id>
		<title>Notificaciones</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Notificaciones&amp;diff=6852"/>
				<updated>2017-12-07T18:40:20Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «Por defecto, Travis CI envía notificaciones de correo electrónico al autor del commit cuando es miembro del repositorio, esto es cuando tienen: * permisos de push o admin...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Por defecto, Travis CI envía notificaciones de correo electrónico al autor del commit cuando es miembro del repositorio, esto es cuando tienen:&lt;br /&gt;
* permisos de push o administración en repositorios públicos&lt;br /&gt;
* permisos de pull, push o administración en repositorios privados&lt;br /&gt;
&lt;br /&gt;
Los correos se envían cuando, en una rama dada:&lt;br /&gt;
* un build se ha ejecutado y ha fallado&lt;br /&gt;
* se acaba de corregir un build que había fallado previamente&lt;br /&gt;
&lt;br /&gt;
No obstante, es posible mostrar información de la construcción y configurar más detalles acerca de las notificaciones. A continuación se describe dos formas de llevarlo a cabo:&lt;br /&gt;
&lt;br /&gt;
= Mostrando imágenes con el estado de la construcción =&lt;br /&gt;
Es posible mostrar información de la construcción en una página web o en el README.md de los repositorios de GitHub. Para hacerlo, tan sólo hay que seguir las instrucciones que aparece aquí: https://docs.travis-ci.com/user/status-images/, seleccionando en el desplegable la opción &amp;quot;Markdown&amp;quot; y copiando el texto que aparece en el fichero README.md del repositorio.&lt;br /&gt;
&lt;br /&gt;
'''Ejercicio:''' Configura el README.md de tu proyecto para que muestre una imagen con el estado de la construcción.&lt;br /&gt;
&lt;br /&gt;
= Configurando notificaciones =&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Flujo_de_trabajo_con_GitHub&amp;diff=6851</id>
		<title>Flujo de trabajo con GitHub</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Flujo_de_trabajo_con_GitHub&amp;diff=6851"/>
				<updated>2017-12-07T18:33:30Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «Como ya hemos comentado en la asignatura, una forma muy habitual de trabajar con GitHub es por medio de [https://help.github.com/articles/about-pull-requests/ pull requests...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Como ya hemos comentado en la asignatura, una forma muy habitual de trabajar con GitHub es por medio de [https://help.github.com/articles/about-pull-requests/ pull requests]. Las pull requests se crean desde una rama a otra del repositorio y permite decirle a otros qué cambios has hecho en un repositorio en GitHub. Una vez que un pull request se abre, puedes discutir y revisar los cambios potenciales con colaboradores y continuar haciendo commits antes de que los cambios se integren en el repositorio. Un escenario muy habitual donde se trabaja con pull requests es si se sigue un flujo de desarrollo del estilo de [https://guides.github.com/introduction/flow/ GitHub Flow]. &lt;br /&gt;
&lt;br /&gt;
Cuando se abre una pull request, Travis CI recibe una notificación de pull request de GitHub. Esta notificación se transforma en una nueva build. Durante la build se actualiza el estado de los commits a uno de los siguientes:&lt;br /&gt;
* un warning porque aún se está construyendo&lt;br /&gt;
* que la pull request se debe de integrar con cuidado porque la build falló&lt;br /&gt;
* que la pull request se puede integrar sin problemas porque la build tuvo éxito&lt;br /&gt;
&lt;br /&gt;
Travis CI inicia una build cuando se abre por primera vez una pull request y cuando se añaden commits a ella. Además, la prueba se realiza a partir de un merge de la rama con la feature y la rama master, no únicamente de la rama con la feature.&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
&lt;br /&gt;
# Vamos a añadir una nueva característica a nuestra aplicación que permita decir hola en distintos idiomas. Para eso, vamos a crear una rama con nombre add-languages.&lt;br /&gt;
# En la nueva rama creada vamos a editar el fichero greeting.html en src/main/resources/templates con este contenido&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns:th=&amp;quot;http://www.thymeleaf.org&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Getting Started: Serving Web Content&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p th:text=&amp;quot;${hello} + ', ' + ${name} + '!'&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# añadimos la clase GreetingTranslator:&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package hello;&lt;br /&gt;
&lt;br /&gt;
public class GreetingTranslator {&lt;br /&gt;
	&lt;br /&gt;
	public String sayHelloIn(String lang) {&lt;br /&gt;
		String hello;&lt;br /&gt;
		if (&amp;quot;en&amp;quot;.equals(lang)) {&lt;br /&gt;
			hello = &amp;quot;hello&amp;quot;;&lt;br /&gt;
		} else if (&amp;quot;es&amp;quot;.equals(lang)) {&lt;br /&gt;
			hello = &amp;quot;hola&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			hello = &amp;quot;no hablo tu idioma&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# y modificamos el método greeting de la clase GreetingController como sigue:&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    @RequestMapping(&amp;quot;/greeting&amp;quot;)&lt;br /&gt;
    public String greeting(@RequestParam(value=&amp;quot;name&amp;quot;, required=false, defaultValue=&amp;quot;World&amp;quot;) String name, &lt;br /&gt;
    					   @RequestParam(value=&amp;quot;lang&amp;quot;, required=false, defaultValue=&amp;quot;en&amp;quot;) String lang, &lt;br /&gt;
    					   Model model) {&lt;br /&gt;
    	model.addAttribute(&amp;quot;hello&amp;quot;, greetingTranslator.sayHelloIn(lang));&lt;br /&gt;
        model.addAttribute(&amp;quot;name&amp;quot;, name);&lt;br /&gt;
        return &amp;quot;greeting&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# Haz un commit de estos cambios y haz un push de la nueva rama a GitHub&lt;br /&gt;
# Una vez que hemos decidido que estos cambios abarcan la funcionalidad deseada, vamos a crear una pull request siguiendo estas instrucciones: https://help.github.com/articles/creating-a-pull-request/#creating-the-pull-request&lt;br /&gt;
# Si abres la pull request que se ha creado, podrás observar abajo cómo se ejecuta una nueva build en Travis CI con la pull request.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Introducci%C3%B3n_a_Composer&amp;diff=6850</id>
		<title>Introducción a Composer</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Introducci%C3%B3n_a_Composer&amp;diff=6850"/>
				<updated>2017-12-07T18:00:18Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En PHP no existen herramientas tan asentadas y frecuentemente usadas para la gestión de la construcción de proyectos como en Java. No obstante, recientemente si que han aparecido varias de entre las que cabe destacar a [https://getcomposer.org Composer] por su uso extendido. A diferencia de Maven, Composer se encarga exclusivamente de la gestión de dependencias por lo que no ofrece funcionalidades para la ejecución de las distintas tareas del proceso de construcción del proyecto.&lt;br /&gt;
&lt;br /&gt;
La gestión de dependencias que realiza Composer es muy similar a la de Maven y, sobre todo, a la de [http://npmjs.com/ NPM], que es un sistema de gestión de dependencias en Javascript.&lt;br /&gt;
&lt;br /&gt;
= Instalar Composer =&lt;br /&gt;
&lt;br /&gt;
La instalación de Composer requiere tener instalado PHP y poder acceder a él desde línea de comandos. Si no lo tienes instalado, una opción es utilizar la imagen de PHP de Docker de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker run -it -v &amp;quot;$PWD&amp;quot;:/usr/src/myapp -w /usr/src/myapp php:7.0-cli /bin/bash&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eso crea un contenedor con PHP 7.0 e inicia una sesión en terminal. Además, mapea el directorio actual al directorio /usr/src/myapp del contenedor. Por último, antes de usar Composer tenemos que instalar git y zip/unzip pues Composer los utiliza para descargarse las dependencias. Eso se puede hacer de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get update&lt;br /&gt;
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]&lt;br /&gt;
Ign http://deb.debian.org jessie InRelease                                  &lt;br /&gt;
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]&lt;br /&gt;
Get:3 http://security.debian.org jessie/updates/main amd64 Packages [588 kB] &lt;br /&gt;
Get:4 http://deb.debian.org jessie Release.gpg [2373 B]                                 &lt;br /&gt;
Get:5 http://deb.debian.org jessie Release [148 kB]                                            &lt;br /&gt;
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [23.2 kB]                 &lt;br /&gt;
Get:7 http://deb.debian.org jessie/main amd64 Packages [9063 kB]&lt;br /&gt;
Fetched 10.0 MB in 5s (1865 kB/s)   &lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get install git&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree       &lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following extra packages will be installed:&lt;br /&gt;
  git-man less libcurl3-gnutls liberror-perl libexpat1 libpopt0 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6&lt;br /&gt;
  libxext6 libxmuu1 openssh-client rsync xauth&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  gettext-base git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs&lt;br /&gt;
  git-mediawiki git-svn ssh-askpass libpam-ssh keychain monkeysphere openssh-server&lt;br /&gt;
Recommended packages:&lt;br /&gt;
  ssh-client&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  git git-man less libcurl3-gnutls liberror-perl libexpat1 libpopt0 libx11-6 libx11-data libxau6 libxcb1&lt;br /&gt;
  libxdmcp6 libxext6 libxmuu1 openssh-client rsync xauth&lt;br /&gt;
0 upgraded, 17 newly installed, 0 to remove and 1 not upgraded.&lt;br /&gt;
Need to get 7629 kB of archives.&lt;br /&gt;
After this operation, 33.5 MB of additional disk space will be used.&lt;br /&gt;
Do you want to continue? [Y/n] Y&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get install zip&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree       &lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following extra packages will be installed:&lt;br /&gt;
  unzip&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  unzip zip&lt;br /&gt;
0 upgraded, 2 newly installed, 0 to remove and 1 not upgraded.&lt;br /&gt;
Need to get 390 kB of archives.&lt;br /&gt;
After this operation, 1002 kB of additional disk space will be used.&lt;br /&gt;
Do you want to continue? [Y/n] Y&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez tenemos nuestro contenedor listo, ya podemos instalar Composer siguiendo las [https://getcomposer.org/doc/00-intro.md instrucciones de su web]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;&lt;br /&gt;
Installer verified&lt;br /&gt;
root@e20f7160c57c:/usr/src# php composer-setup.php&lt;br /&gt;
All settings correct for using Composer&lt;br /&gt;
Downloading...&lt;br /&gt;
&lt;br /&gt;
Composer (version 1.5.5) successfully installed to: /usr/src/composer.phar&lt;br /&gt;
Use it: php composer.phar&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;unlink('composer-setup.php');&amp;quot;&lt;br /&gt;
root@e20f7160c57c:/usr/src# mv composer.phar /usr/local/bin/composer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma alternativa, se puede crear un Dockerfile con estos comandos:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
FROM php:7.0-cli&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y git unzip zip --no-install-recommends &amp;amp;&amp;amp; rm -r /var/lib/apt/lists/*&lt;br /&gt;
RUN mkdir -p /usr/src; \&lt;br /&gt;
      cd /usr/src; \&lt;br /&gt;
      php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;; \&lt;br /&gt;
      php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;; \&lt;br /&gt;
      php composer-setup.php; \&lt;br /&gt;
      php -r &amp;quot;unlink('composer-setup.php');&amp;quot;; \&lt;br /&gt;
      mv /usr/src/composer.phar /usr/local/bin/composer; \&lt;br /&gt;
      cd /&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear una nueva imagen a partir de ese Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker build -t php:7.0-composer .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y crear un contenedor con la nueva imagen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker run -it -v &amp;quot;$PWD&amp;quot;:/usr/src/myapp -w /usr/src/myapp php:7.0-composer /bin/bash&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Uso básico de Composer =&lt;br /&gt;
&lt;br /&gt;
Para ilustrar el funcionamiento de Composer vamos a añadir un par de dependencias a un proyecto en PHP. El equivalente en Composer al pom.xml de Maven es el fichero composer.json. Lo que ocurre es que, a diferencia de lo que ocurre en Maven, el fichero se puede editar directamente o podemos dejar que Composer lo vaya modificando de forma automática a partir de los comandos que vamos ejecutando en línea de comandos. &lt;br /&gt;
&lt;br /&gt;
El fichero composer.json describe las dependencias del proyecto y puede tener también otros datos adicionales como el nombre o versión del proyecto. El elemento básico que se especifica en un composer.json es el elemento require. Simplemente sirve para decir los paquetes de los que depende el proyecto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;require&amp;quot;: {&lt;br /&gt;
        &amp;quot;monolog/monolog&amp;quot;: &amp;quot;1.0.*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este composer.json se está indicando que el proyecto depende de un paquete llamado monolog del desarrollador monolog y fija la versión a la 1.0.* (es decir, cualquiera que tenga 1.0). &lt;br /&gt;
&lt;br /&gt;
Una vez que tenemos un composer.json creado en nuestro proyecto, podemos descargarnos todas sus dependencias mediante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proceso es similar al de Maven y, al igual que Maven, existe un repositorio central donde se buscan por defecto los paquetes. Este repositorio se llama [https://packagist.org/ Packagist]. Puedes encontrar más información sobre él en la [https://getcomposer.org/doc/01-basic-usage.md#packagist documentación de Composer]. &lt;br /&gt;
&lt;br /&gt;
Si se quiere actualizar las dependencias a las últimas versiones se puede hacer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Scopes en las dependencias =&lt;br /&gt;
&lt;br /&gt;
Al igual que ocurre en Maven, es posible indicar varios ''scopes'' para las dependencias de un proyecto, aunque en Composer sólo hay dos scopes: normal, que significa que la dependencia se usa tanto en desarrollo como en ejecución y ''development'', que significa que la dependencia se usa durante el desarrollo, por ejemplo, para ejecutar pruebas unitarias. La forma de indicarlo es que el elemento donde se indican las dependencias de desarrollo se llama &amp;lt;code&amp;gt;require-dev&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;require-dev&amp;quot;: {&lt;br /&gt;
        &amp;quot;phpunit/phpunit&amp;quot;: &amp;quot;^6.5&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Composer por línea de comandos =&lt;br /&gt;
&lt;br /&gt;
El composer.json lo podemos editar nosotros directamente, igual que se hace en maven con el pom.xml, o podemos añadir o eliminar dependencias haciendo uso de la interfaz de línea de comandos de Composer. Para añadir dependencias se hace por medio de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer require monolog/monolog&lt;br /&gt;
% composer require --dev phpunit/phpunit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las dependencias se pueden eliminar utilizando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer remove phpunit/phpunit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
&lt;br /&gt;
# Instala Composer&lt;br /&gt;
# Crea un fichero composer.json con las siguientes dependencias:&lt;br /&gt;
#* Última versión del paquete psr/log&lt;br /&gt;
#* Versión igual o superior a la 1.2.0 del driver de mongodb &lt;br /&gt;
#* Versión superior a la 1.1.0 del SDK de Dropbox para PHP&lt;br /&gt;
#* Versión igual o superior a la 6 del framework de pruebas unitarias phpunit para desarrollo&lt;br /&gt;
# Descarga las dependencias en tu ordenador.&lt;br /&gt;
&lt;br /&gt;
= ¿Vas rápido? =&lt;br /&gt;
Echa un vistazo a https://getcomposer.org/doc/02-libraries.md y sigue el tutorial para hacer público un proyecto de hola mundo en PHP.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_con_Travis_CI&amp;diff=6845</id>
		<title>Integración continua con Travis CI</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Integraci%C3%B3n_continua_con_Travis_CI&amp;diff=6845"/>
				<updated>2017-12-07T16:12:39Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «* Primeros pasos con Travis CI * Flujo de trabajo con GitHub * Jobs con múltiples builds * Notificaciones * Uso con bases de datos»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Primeros pasos con Travis CI]]&lt;br /&gt;
* [[Flujo de trabajo con GitHub]]&lt;br /&gt;
* [[Jobs con múltiples builds]]&lt;br /&gt;
* [[Notificaciones]]&lt;br /&gt;
* [[Uso con bases de datos]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Primeros_pasos_con_Travis_CI&amp;diff=6842</id>
		<title>Primeros pasos con Travis CI</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Primeros_pasos_con_Travis_CI&amp;diff=6842"/>
				<updated>2017-12-07T16:09:17Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «El funcionamiento básico de Travis CI es clonar el repositorio de GitHub a un nuevo entorno virtual y llevar a cabo una serie de tareas para construir y probar tu código....»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El funcionamiento básico de Travis CI es clonar el repositorio de GitHub a un nuevo entorno virtual y llevar a cabo una serie de tareas para construir y probar tu código. Si alguna de estas tareas falla, el build se considera ''broken''. Si no falla ninguna tarea, el build se considera ''passed'' y Travis CI puede desplegar tu código a un servidor web, por ejemplo. A continuación vamos a ver lo que hay que hacer para habilitar el sistema de integración continua y describiremos algunos conceptos básicos de Travis CI.&lt;br /&gt;
&lt;br /&gt;
== Para empezar con Travis CI ==&lt;br /&gt;
# Haz un fork del repositorio de GitHub: https://github.com/resinas/egc-1718&lt;br /&gt;
# Usando tu cuenta de GitHub entra en https://travis-ci.org y acepta la confirmación de permisos de GitHub.&lt;br /&gt;
# Una vez que estés logueado en Travis CI y se hayan sincronizado tus repositorios de GitHub, ve a tu perfil y activa el repositorio que quieras construir [[Archivo:Enable.png]].&lt;br /&gt;
# Añade un fichero &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; a tu repositorio para indicar a Travis CI lo que tiene que hacer. Travis CI ya tiene una [https://docs.travis-ci.com/user/languages/java/ configuración por defecto para proyectos Java] por lo que el &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; puede ser tan sencillo como: &amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
language: java&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# Haz commit y push del &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; para iniciar una build de Travis CI&lt;br /&gt;
# Comprueba en la [https://travis-ci.org/auth página de estado de la construcción] si tu build ha pasado o falla.&lt;br /&gt;
# Haz una modificación en el código del proyecto para que falle una prueba. Haz commit y push del código y observa cómo la construcción falla.&lt;br /&gt;
&lt;br /&gt;
= Conceptos básicos =&lt;br /&gt;
&lt;br /&gt;
En Travis CI hay 4 palabras que tienen un significado específico (obtenido de https://docs.travis-ci.com/user/for-beginners):&lt;br /&gt;
&lt;br /&gt;
== job == &lt;br /&gt;
Un proceso automatizado que clona tu repositorio en un entorno virtual y realiza una serie de ''phases'' como compilar el código, ejecutar tests, etc. Un job falla si el código que devuelve la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; no es cero.&lt;br /&gt;
&lt;br /&gt;
== phase == &lt;br /&gt;
El conjunto de pasos secuenciales de un job. Por ejemplo, la fase &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; viene antes de la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;, que viene antes de la fase opcional &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt;. Las fases de Travis CI son las siguientes:&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;Install apt addons&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;Install cache components&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt;: instalar paquetes del SO necesarios para la construcción del proyecto&lt;br /&gt;
# &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;: instalar las dependencias (librerías) que sean necesarias para la construcción del proyecto&lt;br /&gt;
# &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;: ejecutar el script de construcción del proyecto. &lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;before_cache&amp;lt;/code&amp;gt;: para limpiar la caché&lt;br /&gt;
# &amp;lt;code&amp;gt;after_success&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;after_failure&amp;lt;/code&amp;gt;: after_success se ejecutará si la construcción se realiza correctamente como generar la documentación. after_failure se ejecutará en caso de que la construcción falle.&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;before_deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt;: desplegar la aplicación a una plataforma integrada con Travis CI como Heroku o Engine Yard.&lt;br /&gt;
# OPTIONAL &amp;lt;code&amp;gt;after_deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;after_script&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== build ==&lt;br /&gt;
Un grupo de jobs. Por ejemplo, un build puede tener dos jobs, cada uno prueba un proyecto con una versión distinta de Java. Un build termina cuando todos sus jobs terminan. Una build se considera broken si uno o más de sus jobs termina con un estado que no es ''passed''. Esto puede ocurrir por una de estas tres razones:&lt;br /&gt;
* ''errored'': un comando en la fase &amp;lt;code&amp;gt;before_install&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;before_script&amp;lt;/code&amp;gt; falló. En este caso el job termina inmediatamente.&lt;br /&gt;
* ''failed'': un comando en la fase &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt; falló. El job se ejecuta hasta que se termina&lt;br /&gt;
* ''canceled'': un usuario cancela el job antes de que complete.&lt;br /&gt;
&lt;br /&gt;
En https://docs.travis-ci.com/user/common-build-problems/ se recogen una relación de problemas comunes en la construcción de un proyecto y cómo resolverlo.&lt;br /&gt;
&lt;br /&gt;
== stage == &lt;br /&gt;
Un grupo de jobs que se ejecutan en paralelo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Infraestructura =&lt;br /&gt;
Travis CI ofrece tres tipos de infraestructuras diferentes:&lt;br /&gt;
* Basada en contenedores, que es la opción por defecto. Es un Linux Ubuntu ejecutándose en un contenedor. Se ejecuta más rápido que la basada en máquinas virtuales, pero no soporte el uso de sudo, setuid o setgid.&lt;br /&gt;
* Basada en máquinas virtuales. Es un Linux Ubuntu ejecutándose en una máquina virtual completa. Es un poco más lenta que la basada en contenedores para iniciarse, pero tiene más recursos y soporta sudo, setuid y setgid.&lt;br /&gt;
* OS X. Para probar software que necesite el entorno OS X para funcionar.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Archivo:Enable.png&amp;diff=6838</id>
		<title>Archivo:Enable.png</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Archivo:Enable.png&amp;diff=6838"/>
				<updated>2017-12-07T15:29:57Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Introducci%C3%B3n_a_Composer&amp;diff=6757</id>
		<title>Introducción a Composer</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Introducci%C3%B3n_a_Composer&amp;diff=6757"/>
				<updated>2017-12-04T11:48:08Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En PHP no existen herramientas tan asentadas y frecuentemente usadas para la gestión de la construcción de proyectos como en Java. No obstante, recientemente si que han aparecido varias de entre las que cabe destacar a [https://getcomposer.org Composer] por su uso extendido. A diferencia de Maven, Composer se encarga exclusivamente de la gestión de dependencias por lo que no ofrece funcionalidades para la ejecución de las distintas tareas del proceso de construcción del proyecto.&lt;br /&gt;
&lt;br /&gt;
La gestión de dependencias que realiza Composer es muy similar a la de Maven y, sobre todo, a la de [http://npmjs.com/ NPM], que es un sistema de gestión de dependencias en Javascript.&lt;br /&gt;
&lt;br /&gt;
= Instalar Composer =&lt;br /&gt;
&lt;br /&gt;
La instalación de Composer requiere tener instalado PHP y poder acceder a él desde línea de comandos. Si no lo tienes instalado, una opción es utilizar la imagen de PHP de Docker de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker run -it -v &amp;quot;$PWD&amp;quot;:/usr/src/myapp -w /usr/src/myapp php:7.0-cli /bin/bash&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eso crea un contenedor con PHP 7.0 e inicia una sesión en terminal. Además, mapea el directorio actual al directorio /usr/src/myapp del contenedor. Por último, antes de usar Composer tenemos que instalar git y zip/unzip pues Composer los utiliza para descargarse las dependencias. Eso se puede hacer de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get update&lt;br /&gt;
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]&lt;br /&gt;
Ign http://deb.debian.org jessie InRelease                                  &lt;br /&gt;
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]&lt;br /&gt;
Get:3 http://security.debian.org jessie/updates/main amd64 Packages [588 kB] &lt;br /&gt;
Get:4 http://deb.debian.org jessie Release.gpg [2373 B]                                 &lt;br /&gt;
Get:5 http://deb.debian.org jessie Release [148 kB]                                            &lt;br /&gt;
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [23.2 kB]                 &lt;br /&gt;
Get:7 http://deb.debian.org jessie/main amd64 Packages [9063 kB]&lt;br /&gt;
Fetched 10.0 MB in 5s (1865 kB/s)   &lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get install git&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree       &lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following extra packages will be installed:&lt;br /&gt;
  git-man less libcurl3-gnutls liberror-perl libexpat1 libpopt0 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6&lt;br /&gt;
  libxext6 libxmuu1 openssh-client rsync xauth&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  gettext-base git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs&lt;br /&gt;
  git-mediawiki git-svn ssh-askpass libpam-ssh keychain monkeysphere openssh-server&lt;br /&gt;
Recommended packages:&lt;br /&gt;
  ssh-client&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  git git-man less libcurl3-gnutls liberror-perl libexpat1 libpopt0 libx11-6 libx11-data libxau6 libxcb1&lt;br /&gt;
  libxdmcp6 libxext6 libxmuu1 openssh-client rsync xauth&lt;br /&gt;
0 upgraded, 17 newly installed, 0 to remove and 1 not upgraded.&lt;br /&gt;
Need to get 7629 kB of archives.&lt;br /&gt;
After this operation, 33.5 MB of additional disk space will be used.&lt;br /&gt;
Do you want to continue? [Y/n] Y&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get install zip&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree       &lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following extra packages will be installed:&lt;br /&gt;
  unzip&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  unzip zip&lt;br /&gt;
0 upgraded, 2 newly installed, 0 to remove and 1 not upgraded.&lt;br /&gt;
Need to get 390 kB of archives.&lt;br /&gt;
After this operation, 1002 kB of additional disk space will be used.&lt;br /&gt;
Do you want to continue? [Y/n] Y&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez tenemos nuestro contenedor listo, ya podemos instalar Composer siguiendo las [https://getcomposer.org/doc/00-intro.md instrucciones de su web]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;&lt;br /&gt;
Installer verified&lt;br /&gt;
root@e20f7160c57c:/usr/src# php composer-setup.php&lt;br /&gt;
All settings correct for using Composer&lt;br /&gt;
Downloading...&lt;br /&gt;
&lt;br /&gt;
Composer (version 1.5.5) successfully installed to: /usr/src/composer.phar&lt;br /&gt;
Use it: php composer.phar&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;unlink('composer-setup.php');&amp;quot;&lt;br /&gt;
root@e20f7160c57c:/usr/src# mv composer.phar /usr/local/bin/composer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma alternativa, se puede crear un Dockerfile con estos comandos:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
FROM php:7.0-cli&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y git zip --no-install-recommends &amp;amp;&amp;amp; rm -r /var/lib/apt/lists/*&lt;br /&gt;
RUN mkdir -p /usr/src; \&lt;br /&gt;
      cd /usr/src; \&lt;br /&gt;
      php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;; \&lt;br /&gt;
      php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;; \&lt;br /&gt;
      php composer-setup.php; \&lt;br /&gt;
      php -r &amp;quot;unlink('composer-setup.php');&amp;quot;; \&lt;br /&gt;
      mv /usr/src/composer.phar /usr/local/bin/composer; \&lt;br /&gt;
      cd /&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear una nueva imagen a partir de ese Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker build -t php:7.0-composer .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y crear un contenedor con la nueva imagen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker run -it -v &amp;quot;$PWD&amp;quot;:/usr/src/myapp -w /usr/src/myapp php:7.0-composer /bin/bash&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Uso básico de Composer =&lt;br /&gt;
&lt;br /&gt;
Para ilustrar el funcionamiento de Composer vamos a añadir un par de dependencias a un proyecto en PHP. El equivalente en Composer al pom.xml de Maven es el fichero composer.json. Lo que ocurre es que, a diferencia de lo que ocurre en Maven, el fichero se puede editar directamente o podemos dejar que Composer lo vaya modificando de forma automática a partir de los comandos que vamos ejecutando en línea de comandos. &lt;br /&gt;
&lt;br /&gt;
El fichero composer.json describe las dependencias del proyecto y puede tener también otros datos adicionales como el nombre o versión del proyecto. El elemento básico que se especifica en un composer.json es el elemento require. Simplemente sirve para decir los paquetes de los que depende el proyecto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;require&amp;quot;: {&lt;br /&gt;
        &amp;quot;monolog/monolog&amp;quot;: &amp;quot;1.0.*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este composer.json se está indicando que el proyecto depende de un paquete llamado monolog del desarrollador monolog y fija la versión a la 1.0.* (es decir, cualquiera que tenga 1.0). &lt;br /&gt;
&lt;br /&gt;
Una vez que tenemos un composer.json creado en nuestro proyecto, podemos descargarnos todas sus dependencias mediante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proceso es similar al de Maven y, al igual que Maven, existe un repositorio central donde se buscan por defecto los paquetes. Este repositorio se llama [https://packagist.org/ Packagist]. Puedes encontrar más información sobre él en la [https://getcomposer.org/doc/01-basic-usage.md#packagist documentación de Composer]. &lt;br /&gt;
&lt;br /&gt;
Si se quiere actualizar las dependencias a las últimas versiones se puede hacer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Scopes en las dependencias =&lt;br /&gt;
&lt;br /&gt;
Al igual que ocurre en Maven, es posible indicar varios ''scopes'' para las dependencias de un proyecto, aunque en Composer sólo hay dos scopes: normal, que significa que la dependencia se usa tanto en desarrollo como en ejecución y ''development'', que significa que la dependencia se usa durante el desarrollo, por ejemplo, para ejecutar pruebas unitarias. La forma de indicarlo es que el elemento donde se indican las dependencias de desarrollo se llama &amp;lt;code&amp;gt;require-dev&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;require-dev&amp;quot;: {&lt;br /&gt;
        &amp;quot;phpunit/phpunit&amp;quot;: &amp;quot;^6.5&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Composer por línea de comandos =&lt;br /&gt;
&lt;br /&gt;
El composer.json lo podemos editar nosotros directamente, igual que se hace en maven con el pom.xml, o podemos añadir o eliminar dependencias haciendo uso de la interfaz de línea de comandos de Composer. Para añadir dependencias se hace por medio de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer require monolog/monolog&lt;br /&gt;
% composer require --dev phpunit/phpunit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las dependencias se pueden eliminar utilizando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer remove phpunit/phpunit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
&lt;br /&gt;
# Instala Composer&lt;br /&gt;
# Crea un fichero composer.json con las siguientes dependencias:&lt;br /&gt;
#* Última versión del paquete psr/log&lt;br /&gt;
#* Versión igual o superior a la 1.2.0 del driver de mongodb &lt;br /&gt;
#* Versión superior a la 1.1.0 del SDK de Dropbox para PHP&lt;br /&gt;
#* Versión igual o superior a la 6 del framework de pruebas unitarias phpunit para desarrollo&lt;br /&gt;
# Descarga las dependencias en tu ordenador.&lt;br /&gt;
&lt;br /&gt;
= ¿Vas rápido? =&lt;br /&gt;
Echa un vistazo a https://getcomposer.org/doc/02-libraries.md y sigue el tutorial para hacer público un proyecto de hola mundo en PHP.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_de_la_construcci%C3%B3n&amp;diff=6752</id>
		<title>Gestión de la construcción</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_de_la_construcci%C3%B3n&amp;diff=6752"/>
				<updated>2017-12-03T23:54:00Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Gestión de la construcción con Maven */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gestión de la construcción con Maven=&lt;br /&gt;
* [[Primeros pasos con Maven]]&lt;br /&gt;
* [[Introducción de dependencias]]&lt;br /&gt;
* [[Configuración de plugins]]&lt;br /&gt;
* [[Despliegue de proyectos]]&lt;br /&gt;
* [[Creación un propio archetype]] (opcional)&lt;br /&gt;
* [[Perfiles de configuración]] (opcional)&lt;br /&gt;
&lt;br /&gt;
= Gestión de la construcción en PHP =&lt;br /&gt;
* [[Introducción a Composer]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Introducci%C3%B3n_a_Composer&amp;diff=6751</id>
		<title>Introducción a Composer</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Introducci%C3%B3n_a_Composer&amp;diff=6751"/>
				<updated>2017-12-03T23:52:58Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «En PHP no existen herramientas tan asentadas y frecuentemente usadas para la gestión de la construcción de proyectos como en Java. No obstante, recientemente si que han a...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En PHP no existen herramientas tan asentadas y frecuentemente usadas para la gestión de la construcción de proyectos como en Java. No obstante, recientemente si que han aparecido varias de entre las que cabe destacar a [https://getcomposer.org Composer] por su uso extendido. A diferencia de Maven, Composer se encarga exclusivamente de la gestión de dependencias por lo que no ofrece funcionalidades para la ejecución de las distintas tareas del proceso de construcción del proyecto.&lt;br /&gt;
&lt;br /&gt;
La gestión de dependencias que realiza Composer es muy similar a la de Maven y, sobre todo, a la de [http://npmjs.com/ NPM], que es un sistema de gestión de dependencias en Javascript.&lt;br /&gt;
&lt;br /&gt;
= Instalar Composer =&lt;br /&gt;
&lt;br /&gt;
La instalación de Composer requiere tener instalado PHP y poder acceder a él desde línea de comandos. Si no lo tienes instalado, una opción es utilizar la imagen de PHP de Docker de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker run -it -v &amp;quot;$PWD&amp;quot;:/usr/src/myapp -w /usr/src/myapp php:7.0-cli /bin/bash&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eso crea un contenedor con PHP 7.0 e inicia una sesión en terminal. Además, mapea el directorio actual al directorio /usr/src/myapp del contenedor. Por último, antes de usar Composer tenemos que instalar git y zip/unzip pues Composer los utiliza para descargarse las dependencias. Eso se puede hacer de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get update&lt;br /&gt;
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]&lt;br /&gt;
Ign http://deb.debian.org jessie InRelease                                  &lt;br /&gt;
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]&lt;br /&gt;
Get:3 http://security.debian.org jessie/updates/main amd64 Packages [588 kB] &lt;br /&gt;
Get:4 http://deb.debian.org jessie Release.gpg [2373 B]                                 &lt;br /&gt;
Get:5 http://deb.debian.org jessie Release [148 kB]                                            &lt;br /&gt;
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [23.2 kB]                 &lt;br /&gt;
Get:7 http://deb.debian.org jessie/main amd64 Packages [9063 kB]&lt;br /&gt;
Fetched 10.0 MB in 5s (1865 kB/s)   &lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get install git&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree       &lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following extra packages will be installed:&lt;br /&gt;
  git-man less libcurl3-gnutls liberror-perl libexpat1 libpopt0 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6&lt;br /&gt;
  libxext6 libxmuu1 openssh-client rsync xauth&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  gettext-base git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs&lt;br /&gt;
  git-mediawiki git-svn ssh-askpass libpam-ssh keychain monkeysphere openssh-server&lt;br /&gt;
Recommended packages:&lt;br /&gt;
  ssh-client&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  git git-man less libcurl3-gnutls liberror-perl libexpat1 libpopt0 libx11-6 libx11-data libxau6 libxcb1&lt;br /&gt;
  libxdmcp6 libxext6 libxmuu1 openssh-client rsync xauth&lt;br /&gt;
0 upgraded, 17 newly installed, 0 to remove and 1 not upgraded.&lt;br /&gt;
Need to get 7629 kB of archives.&lt;br /&gt;
After this operation, 33.5 MB of additional disk space will be used.&lt;br /&gt;
Do you want to continue? [Y/n] Y&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src/example# apt-get install zip&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree       &lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following extra packages will be installed:&lt;br /&gt;
  unzip&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  unzip zip&lt;br /&gt;
0 upgraded, 2 newly installed, 0 to remove and 1 not upgraded.&lt;br /&gt;
Need to get 390 kB of archives.&lt;br /&gt;
After this operation, 1002 kB of additional disk space will be used.&lt;br /&gt;
Do you want to continue? [Y/n] Y&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez tenemos nuestro contenedor listo, ya podemos instalar Composer siguiendo las [https://getcomposer.org/doc/00-intro.md instrucciones de su web]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;&lt;br /&gt;
Installer verified&lt;br /&gt;
root@e20f7160c57c:/usr/src# php composer-setup.php&lt;br /&gt;
All settings correct for using Composer&lt;br /&gt;
Downloading...&lt;br /&gt;
&lt;br /&gt;
Composer (version 1.5.5) successfully installed to: /usr/src/composer.phar&lt;br /&gt;
Use it: php composer.phar&lt;br /&gt;
&lt;br /&gt;
root@e20f7160c57c:/usr/src# php -r &amp;quot;unlink('composer-setup.php');&amp;quot;&lt;br /&gt;
root@e20f7160c57c:/usr/src# mv composer.phar /usr/local/bin/composer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma alternativa, se puede crear un Dockerfile con estos comandos:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
FROM php:7.0-cli&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y git zip unzip --no-install-recommends &amp;amp;&amp;amp; rm -r /var/lib/apt/lists/*&lt;br /&gt;
RUN mkdir -p /usr/src; \&lt;br /&gt;
      cd /usr/src; \&lt;br /&gt;
      php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;; \&lt;br /&gt;
      php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c$&lt;br /&gt;
      php composer-setup.php; \&lt;br /&gt;
      php -r &amp;quot;unlink('composer-setup.php');&amp;quot;; \&lt;br /&gt;
      mv /usr/src/composer.phar /usr/local/bin/composer; \&lt;br /&gt;
      cd /&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear una nueva imagen a partir de ese Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker build -t php:7.0-composer .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y crear un contenedor con la nueva imagen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% docker run -it -v &amp;quot;$PWD&amp;quot;:/usr/src/myapp -w /usr/src/myapp php:7.0-composer /bin/bash&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Uso básico de Composer =&lt;br /&gt;
&lt;br /&gt;
Para ilustrar el funcionamiento de Composer vamos a añadir un par de dependencias a un proyecto en PHP. El equivalente en Composer al pom.xml de Maven es el fichero composer.json. Lo que ocurre es que, a diferencia de lo que ocurre en Maven, el fichero se puede editar directamente o podemos dejar que Composer lo vaya modificando de forma automática a partir de los comandos que vamos ejecutando en línea de comandos. &lt;br /&gt;
&lt;br /&gt;
El fichero composer.json describe las dependencias del proyecto y puede tener también otros datos adicionales como el nombre o versión del proyecto. El elemento básico que se especifica en un composer.json es el elemento require. Simplemente sirve para decir los paquetes de los que depende el proyecto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;require&amp;quot;: {&lt;br /&gt;
        &amp;quot;monolog/monolog&amp;quot;: &amp;quot;1.0.*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este composer.json se está indicando que el proyecto depende de un paquete llamado monolog del desarrollador monolog y fija la versión a la 1.0.* (es decir, cualquiera que tenga 1.0). &lt;br /&gt;
&lt;br /&gt;
Una vez que tenemos un composer.json creado en nuestro proyecto, podemos descargarnos todas sus dependencias mediante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proceso es similar al de Maven y, al igual que Maven, existe un repositorio central donde se buscan por defecto los paquetes. Este repositorio se llama [https://packagist.org/ Packagist]. Puedes encontrar más información sobre él en la [https://getcomposer.org/doc/01-basic-usage.md#packagist documentación de Composer]. &lt;br /&gt;
&lt;br /&gt;
Si se quiere actualizar las dependencias a las últimas versiones se puede hacer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Scopes en las dependencias =&lt;br /&gt;
&lt;br /&gt;
Al igual que ocurre en Maven, es posible indicar varios ''scopes'' para las dependencias de un proyecto, aunque en Composer sólo hay dos scopes: normal, que significa que la dependencia se usa tanto en desarrollo como en ejecución y ''development'', que significa que la dependencia se usa durante el desarrollo, por ejemplo, para ejecutar pruebas unitarias. La forma de indicarlo es que el elemento donde se indican las dependencias de desarrollo se llama &amp;lt;code&amp;gt;require-dev&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;require-dev&amp;quot;: {&lt;br /&gt;
        &amp;quot;phpunit/phpunit&amp;quot;: &amp;quot;^6.5&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Composer por línea de comandos =&lt;br /&gt;
&lt;br /&gt;
El composer.json lo podemos editar nosotros directamente, igual que se hace en maven con el pom.xml, o podemos añadir o eliminar dependencias haciendo uso de la interfaz de línea de comandos de Composer. Para añadir dependencias se hace por medio de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer require monolog/monolog&lt;br /&gt;
% composer require --dev phpunit/phpunit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las dependencias se pueden eliminar utilizando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% composer remove phpunit/phpunit&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicio =&lt;br /&gt;
&lt;br /&gt;
# Instala Composer&lt;br /&gt;
# Crea un fichero composer.json con las siguientes dependencias:&lt;br /&gt;
#* Última versión del paquete psr/log&lt;br /&gt;
#* Versión igual o superior a la 1.2.0 del driver de mongodb &lt;br /&gt;
#* Versión superior a la 1.1.0 del SDK de Dropbox para PHP&lt;br /&gt;
#* Versión igual o superior a la 6 del framework de pruebas unitarias phpunit para desarrollo&lt;br /&gt;
# Descarga las dependencias en tu ordenador.&lt;br /&gt;
&lt;br /&gt;
= ¿Vas rápido? =&lt;br /&gt;
Echa un vistazo a https://getcomposer.org/doc/02-libraries.md y sigue el tutorial para hacer público un proyecto de hola mundo en PHP.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_de_la_construcci%C3%B3n&amp;diff=6750</id>
		<title>Gestión de la construcción</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_de_la_construcci%C3%B3n&amp;diff=6750"/>
				<updated>2017-12-03T22:43:19Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gestión de la construcción con Maven=&lt;br /&gt;
* [[Primeros pasos con Maven]]&lt;br /&gt;
* [[Introducción de dependencias]]&lt;br /&gt;
* [[Configuración de plugins]]&lt;br /&gt;
* [[Despliegue de proyectos]]&lt;br /&gt;
* [[Creación un propio archetype]]&lt;br /&gt;
* [[Perfiles de configuración]]&lt;br /&gt;
&lt;br /&gt;
= Gestión de la construcción en PHP =&lt;br /&gt;
* [[Introducción a Composer]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue_de_proyectos&amp;diff=6749</id>
		<title>Despliegue de proyectos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue_de_proyectos&amp;diff=6749"/>
				<updated>2017-12-03T22:23:36Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Desplegar un proyecto significa enviar tu artefacto a un lugar (repositorio) para ser compartido con otros. Se establecerá un repositorio para esto.&lt;br /&gt;
&lt;br /&gt;
= Desplegar el proyecto y observar el resultado =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn deploy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Especificar un lugar para los despliegues =&lt;br /&gt;
Añada al pom.xml la configuarción para que los despliegues vayan a una carpeta de su equipo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
&amp;lt;distributionManagement&amp;gt;&lt;br /&gt;
    &amp;lt;repository&amp;gt;&lt;br /&gt;
      &amp;lt;id&amp;gt; idRepo&amp;lt;/id&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt; nombreRepo&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;url&amp;gt; file://ruta_carpeta_despliegue &amp;lt;/url&amp;gt;&lt;br /&gt;
    &amp;lt;/repository&amp;gt;&lt;br /&gt;
&amp;lt;/distributionManagement&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vuelva a desplegar&lt;br /&gt;
&lt;br /&gt;
= Analice el contenido =&lt;br /&gt;
Vaya a la carpeta de despliegue y observe su contenido.&lt;br /&gt;
&lt;br /&gt;
= Actualize el proyecto= &lt;br /&gt;
Abra el pom.xml de su proyecto y cambien la versión de éste. Vuelva a desplegar el proyecto.&lt;br /&gt;
&lt;br /&gt;
= Analice el contenido=&lt;br /&gt;
Vuelva a la carpeta de despliegue y analícela de nuevo.&lt;br /&gt;
¿Que ocurre si..?:&lt;br /&gt;
* La versión acaba en &amp;lt;code&amp;gt;-SNAPSHOT&amp;lt;/code&amp;gt;.&lt;br /&gt;
* La versión acaba en cualquier otra cosa.&lt;br /&gt;
&lt;br /&gt;
Observe en el &amp;lt;code&amp;gt;maven-metadata.xml&amp;lt;/code&amp;gt; que ''release'' es la última versión actualizada que no es de desarrollo. ''lastUpdate'' es la ultima actualización, ya sea de desarrollo o no.&lt;br /&gt;
&lt;br /&gt;
= Gestión de versiones =&lt;br /&gt;
&lt;br /&gt;
En Maven, cuando la versión de un proyecto termina en &amp;lt;code&amp;gt;-SNAPSHOT&amp;lt;/code&amp;gt; indica que esa versión aún está en desarrollo activo. Por ejemplo, un proyecto cuya versión sea &amp;lt;code&amp;gt;1.0-SNAPSHOT&amp;lt;/code&amp;gt; indica que sus desarrolladores están trabajando en la versión &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, pero aún no la han terminado. Esto tiene otra implicación adicional: cuando estemos desarrollando, debemos evitar añadir versiones &amp;lt;code&amp;gt;-SNAPSHOT&amp;lt;/code&amp;gt; como dependencia pues están en pleno desarrollo. Lo habitual es que esas dependencias sólo se encuentren en proyectos que se están desarrollando en paralelo.&lt;br /&gt;
&lt;br /&gt;
Cuando el equipo de desarrollo decide que es hora de sacar la versión &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; el proceso que se suele seguir es el siguiente:&lt;br /&gt;
&lt;br /&gt;
# Comprobar que no hay dependencias a versiones SNAPSHOT.&lt;br /&gt;
# Cambiar la versión del POM de x-SNAPSHOT a una nueva versión (lo ideal es utilizar [https://semver.org versionado semántico].&lt;br /&gt;
# Ejecutar los tests con el POM modificado para comprobar que todo está funcionando correctamente.&lt;br /&gt;
# Hacer commit de los POMs modificados&lt;br /&gt;
# Etiquetar el código en el sistema de control de versiones con el nombre de la versión. En git se puede hacer por medio del comando &amp;lt;code&amp;gt;git tag &amp;lt;tagName&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Desplegar el proyecto con &amp;lt;code&amp;gt;mvn deploy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vez desplegado el proyecto, lo normal es que queramos empezar a desarrollar la nueva versión de nuestra aplicación. Para ello, no hay que olvidar:&lt;br /&gt;
&lt;br /&gt;
# Subir la versión del proyecto en el POM a y-SNAPSHOT.&lt;br /&gt;
# Hacer commit del POM modificado.&lt;br /&gt;
&lt;br /&gt;
Estos pasos se pueden hacer manualmente, aunque existe un plugin de maven especialmente diseñado para la gestión de versiones llamado [http://maven.apache.org/maven-release/maven-release-plugin/index.html maven-release-plugin].&lt;br /&gt;
&lt;br /&gt;
'''Ejercicio:''' Sigue manualmente o con la ayuda del maven-release-plugin el proceso descrito anteriormente para hacer el release de la versión 1.0 y pasar a desarrollar la 1.1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Uso de un repositorio remoto =&lt;br /&gt;
En el apartado anterior hemos utilizado un repositorio local donde desplegar nuestros JAR, pero eso resulta de poca utilidad si queremos compartirlos con otros desarrolladores. Lo habitual es utilizar repositorios remotos. Si estás desarrollando un proyecto open source lo usual es que se utilice Maven Central, pero para otro tipo de proyectos o para ejemplos como el que estamos haciendo debemos utilizar otros repositorios. Si no, estaríamos incurriendo en un mal uso de Maven Central.&lt;br /&gt;
&lt;br /&gt;
Por suerte, hay otros repositorios remotos disponibles de Maven y, algunos de ellos, tienen una versión gratuita para probar como es el caso de http://mymavenrepo.com.&lt;br /&gt;
&lt;br /&gt;
# Entrar en http://mymavenrepo.com y crear una cuenta&lt;br /&gt;
# Sigue las instrucciones para configurar tu pom.xml para tu repositorio. Fíjate que la configuración es muy similar a la que hemos hecho antes. La diferencia más significativa es que en las instrucciones de mymavenrepo te recomiendan poner las URL en un fichero settings.xml para evitar que queden públicas en el pom.xml y cualquiera pueda acceder a ellas.&lt;br /&gt;
# Haz un &amp;lt;code&amp;gt;mvn deploy&amp;lt;/code&amp;gt; y observa el resultado.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Primeros_pasos_con_Maven&amp;diff=6540</id>
		<title>Primeros pasos con Maven</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Primeros_pasos_con_Maven&amp;diff=6540"/>
				<updated>2017-11-27T07:58:41Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Descarga e instala Maven=&lt;br /&gt;
Descargue Maven y siguen las instrucciones de instalación (para Windows puedes usar [https://www.mkyong.com/maven/how-to-install-maven-in-windows/ estas]). &lt;br /&gt;
Tras instalar, ejecute &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn --version &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si todo está correcto, debería observar algo como lo que sigue:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Apache Maven 3.3.3&lt;br /&gt;
Maven home: C:\...\apache-maven-3.3.3\bin\..&lt;br /&gt;
Java version: 1.8.0_25, vendor: Oracle Corporation&lt;br /&gt;
Java home: C:\Program Files\Java\jdk1.8.0_25\jre&lt;br /&gt;
Default locale: es_ES, platform encoding: Cp1252&lt;br /&gt;
OS name: &amp;quot;windows 7&amp;quot;, version: &amp;quot;6.1&amp;quot;, arch: &amp;quot;amd64&amp;quot;, family: &amp;quot;dos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cambiar la configuración de ''usuario'' del repositorio local para no contener espacios (opcional) =&lt;br /&gt;
Hay tres niveles de configuración: instalación (mavenInst/conf/settings.xml), usuario (userHome/.m2/settings.xml), proyecto (projectHome/pom.xml)&lt;br /&gt;
&lt;br /&gt;
Por defecto, el repositorio local está en ${user.home}/.m2/repository. Si se desea cambiar (para no contener espacios), en la carpeta ${user.home}/.m2 crear un archivo settings.xml con el siguiente contenido.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;settings xmlns=&amp;quot;http://maven.apache.org/SETTINGS/1.1.0&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
  xsi:schemaLocation=&amp;quot;http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;localRepository&amp;gt; nuevaRuta &amp;lt;/localRepository&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Generar el primer proyecto. El archetype utilizado por defecto es el maven-archetype-quickstart=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn -B archetype:generate -DgroupId=es.egc.app -DartifactId=proy1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ó &lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn -B archetype:generate -DgroupId=es.egc.app -DartifactId=proy1 -DarchetypeArtifactId=maven-archetype-quickstart&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven utiliza la convención de ficheros para encontrar los diferentes elementos del proyecto (cf. [https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html Ficheros]). De este modo, todos los proyectos que usan maven deben seguir la misma estructura. Esto es conveniente pues asegura que cualquier desarrollador puede entender la estructura de directorios de un proyecto con mayor facilidad.&lt;br /&gt;
&lt;br /&gt;
Siguiendo esta convención, la carpeta generada debido al arquetipo seleccionado tendrá el siguiente contenido:&lt;br /&gt;
* src/main contiene el código fuente&lt;br /&gt;
* src/test contiene el código para testeo&lt;br /&gt;
* un fichero pom.xml con la configuración del proyecto en Maven. El contenido de este fichero será el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;project xmlns=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
  xsi:schemaLocation=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;es.egc.app&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;proy1&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;proy1&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;&lt;br /&gt;
  &amp;lt;dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
  &amp;lt;/dependencies&amp;gt;&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que define este pom.xml es lo siguiente:&lt;br /&gt;
* groupId y artifactId, que son un identificador del proyecto y juega un papel similar al de los paquetes en Java.&lt;br /&gt;
* packaging, que establece el tipo de empaquetado que va a tener el proyecto. Por defecto es &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
* version, que fija la versión actual del proyecto.&lt;br /&gt;
* name, que da un nombre descriptivo al proyecto. No sirve para identificar el proyecto (para eso está el groupId y artifactId). Simplemente sirve para dar una descripción orientada a humanos.&lt;br /&gt;
* dependencies, que especifica las dependencias del proyecto. En este caso, se incluye la dependencia a JUnit.&lt;br /&gt;
&lt;br /&gt;
Maven ofrece dos funcionalidades básicas:&lt;br /&gt;
* Gestión de la construcción de un proyecto&lt;br /&gt;
* Gestión de las dependencias de un proyecto&lt;br /&gt;
&lt;br /&gt;
Ambas funcionalidades se configuran a través del fichero pom.xml&lt;br /&gt;
&lt;br /&gt;
=Plugins y objetivos=&lt;br /&gt;
Un concepto clave de Maven son los plugins. Toda la funcionalidad de Maven se realiza a través de plugins. Hay plugins encargados de gestionar las dependencias, plugins encargados de compilar código Java, plugins encargados de ejecutar pruebas de JUnit, plugins encargados de empaquetar el código en un fichero JAR, etc. Los plugins ofrecen su funcionalidad a través de lo que se conoce como objetivos (goals). Por ejemplo, el plugin encargado de la compilación de código ([https://maven.apache.org/plugins/maven-compiler-plugin/ compiler]) tiene dos objetivos:&lt;br /&gt;
* compiler:compile que compila el código fuente del proyecto, que está en la carpeta main/src/java&lt;br /&gt;
* compiler:testCompile que compila el código de las pruebas del proyecto, que está en la carpeta main/src/test&lt;br /&gt;
&lt;br /&gt;
Otro ejemplo puede ser el plugin encargado de crear un paquete JAR ([https://maven.apache.org/plugins/maven-jar-plugin/ jar]), que tiene también dos objetivos:&lt;br /&gt;
* jar:jar que crea un fichero jar con el código del proyecto y el contenido de la carpeta src/main/resources&lt;br /&gt;
* jar:test-jar que crea un fichero jar con el código de las pruebas del proyecto y el contenido de la carpeta src/test/resources&lt;br /&gt;
&lt;br /&gt;
Los plugins se pueden configurar en el fichero pom.xml del proyecto y los objetivos de un plugin se pueden invocar por línea de comandos de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn plugin1:objetivo1..pluginN:objetivoN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los objetivos se ejecutan siguiendo el orden en que son invocados. Por tanto se podría hacer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn compiler:compile jar:jar&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para compilar el código de nuestro proyecto y empaquetarlo en un JAR.&lt;br /&gt;
&lt;br /&gt;
=Ciclo de vida y fases=&lt;br /&gt;
El otro concepto fundamental de Maven para la gestión de la construcción de un proyecto es el ciclo de vida. Un ciclo de vida está compuesto por un conjunto de fases. En Maven se definen tres ciclos de vida por defecto y normalmente nunca te vas a ver en la necesidad de definir ninguno adicional. Los tres ciclos de vida de Maven son:&lt;br /&gt;
* El ciclo de vida default, que gestiona la construcción y despliegue del proyecto.&lt;br /&gt;
* El ciclo de vida clean, que gestiona la limpieza del directorio del proyecto. Es decir, se encarga de eliminar todos los archivos generados en el proceso de construcción y despliegue.&lt;br /&gt;
* El ciclo de vida site, que gestiona la creación de la documentación del proyecto.&lt;br /&gt;
&lt;br /&gt;
Las fases que componen cada ciclo de vida también están predefinidas. Por ejemplo, el ciclo de vida default está compuesto por las siguientes fases:&lt;br /&gt;
&lt;br /&gt;
'''validate''', initialize, generate-sources, process-sources, generate-resources, process-resources, '''compile''', process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, '''test''', prepare-package, '''package''', pre-integration-test, integration-test, post-integration-test, verify, '''install''', '''deploy'''&lt;br /&gt;
&lt;br /&gt;
De entre todas ellas las más relevantes son:&lt;br /&gt;
* validate: Que valida que el proyecto es correcto y que está disponible toda la información necesaria&lt;br /&gt;
* compile: Que compila el código fuente del proyecto&lt;br /&gt;
* test: Que prueba el código compilado utilizando algún framework de pruebas unitarias. Estas pruebas no deben requerir que el código esté empaquetado o desplegado.&lt;br /&gt;
* package: Coge el código compilado y lo empaqueta en un formato distribuible. Por ejemplo, como un JAR.&lt;br /&gt;
* verify: Ejecuta comprobaciones de pruebas de integración para asegurarse que se cumplen los criterios de calidad&lt;br /&gt;
* install: Instala el paquete en el repositorio local (el directorio ${user.home}/.m2) para que se pueda usar como dependencia en otros proyectos localmente&lt;br /&gt;
* deploy: Copia el paquete final a un repositorio remoto para compartirlo con otros desarrolladores. Hay que tener en cuenta que este despliegue no se refiere en general al despliegue de la aplicación en un servidor web, sino a dejarlo disponible en un repositorio para que lo usen otros desarrolladores (más información en [Introducción de dependencias]).&lt;br /&gt;
&lt;br /&gt;
En [https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference Lifecycles] se recogen todas las fases definidas en cada ciclo de vida y una breve descripción de cada una de ellas.&lt;br /&gt;
&lt;br /&gt;
Aunque cada fase es responsable de un paso específico en el ciclo de vida al que corresponda, la manera en la que se realizan esas responsabilidades puede variar en función del tipo de proyecto (ej. si es un proyecto web, una aplicación de consola, una librería, una aplicación de móviles...), del tipo de empaquetado utilizado (ej. si es WAR, JAR, EAR...), etc. Para configurar qué se hace en cada fase, cada fase se enlaza con uno o más objetivos de plugins. De este modo, ejecutar una fase del ciclo de vida equivale a ejecutar los objetivos de plugins vinculados a esa fase. Algunas fases tienen ya vinculadas objetivos de plugins por defecto. Esta vinculación varía dependiendo del tipo de packaging del proyecto. Por ejemplo, para un packaging jar, las fases con objetivos de plugin vinculados son las siguientes (puedes ver la lista completa en [https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings Built-in Lifecycle Bindings]):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Fase'''&lt;br /&gt;
| '''Plugin:objetivo'''&lt;br /&gt;
|-&lt;br /&gt;
| process-resources&lt;br /&gt;
| resources:resources&lt;br /&gt;
|-&lt;br /&gt;
| compile&lt;br /&gt;
| compiler:compile&lt;br /&gt;
|-&lt;br /&gt;
| process-test-resources&lt;br /&gt;
| resources:testResources&lt;br /&gt;
|-&lt;br /&gt;
| test-compile&lt;br /&gt;
| compiler:testCompile&lt;br /&gt;
|-&lt;br /&gt;
| test&lt;br /&gt;
| surefire:test&lt;br /&gt;
|-&lt;br /&gt;
| package&lt;br /&gt;
| jar:jar&lt;br /&gt;
|-&lt;br /&gt;
| install&lt;br /&gt;
| install:install&lt;br /&gt;
|-&lt;br /&gt;
| deploy&lt;br /&gt;
| deploy:deploy&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Además, esa vinculación se puede configurar a través del fichero pom.xml.&lt;br /&gt;
&lt;br /&gt;
Un ciclo de vida no se ejecuta directamente por línea de comandos, sino que lo que se ejecuta esa una fase del ciclo de vida. La forma de ejecutarlo es igual que los objetivos de plugins:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn fase1..faseN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando se ejecuta una fase, se ejecutan también todas las fases previas definidas en el ciclo de vida. Por tanto, si ejecutamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn package&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se ejecutaran todas las fases del ciclo de vida default desde la primera, que es validate, hasta package, incluyendo por tanto: validate, initialize, generate-sources, process-sources, generate-resources, '''process-resources''', '''compile''', process-classes, generate-test-sources, process-test-sources, generate-test-resources, '''process-test-resources''', '''test-compile''', process-test-classes, '''test''', prepare-package, '''package'''. &lt;br /&gt;
&lt;br /&gt;
Todas las fases que no tengan objetivos de plugins vinculados (por defecto, todas las que no están en negrita) simplemente se ignoran durante la ejecución.&lt;br /&gt;
&lt;br /&gt;
En una misma llamada a Maven es posible mezclar fases con objetivos de plugins. Como siempre, el orden en que se ejecutan es el que aparecen en línea de comandos. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn clean dependency:copy-dependencies package&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que hace es:&lt;br /&gt;
# Invocar a la fase clean del ciclo de vida clean, que limpia el directorio del proyecto de todos los ficheros generados durante la construcción del mismo.&lt;br /&gt;
# Invocar al objetivo copy-dependencies del plugin dependency, que lo que hace es copiar los JAR de los que depende del proyecto a una carpeta dentro del mismo.&lt;br /&gt;
# Invocar a la fase package del ciclo de vida default, que compila, prueba y empaqueta el proyecto.&lt;br /&gt;
&lt;br /&gt;
=Ejercicio=&lt;br /&gt;
&lt;br /&gt;
==Compilar el proyecto==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mvn compile&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Buscará los fuentes en src/main y las clases compiladas las situará en target/classes. Ambas son convenciones empleadas por maven. &lt;br /&gt;
&lt;br /&gt;
==Modificar el proyecto==&lt;br /&gt;
*Introducir método en la clase App.java&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
static int getVal(){&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Modificar test de la clase AppTest.java&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
assertTrue(App.getVal()==1);&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testear el proyecto==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mvn test&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Buscará los fuentes en src/test&lt;br /&gt;
&lt;br /&gt;
==Introducir error en el test y tratar de generar el .jar==&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mvn package&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Resuelve el error introducido y genera el .jar==&lt;br /&gt;
Observa como el JAR obtenido está en la carpeta target. En general, en maven, todos los resultados del proceso de construcción de nuestro proyecto va a ir a la carpeta target. Por esta razón, es conveniente añadir esta carpeta en el .gitignore (o equivalente) de nuestro sistema de control de versiones.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_de_la_construcci%C3%B3n&amp;diff=6493</id>
		<title>Gestión de la construcción</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Gesti%C3%B3n_de_la_construcci%C3%B3n&amp;diff=6493"/>
				<updated>2017-11-24T12:50:03Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: Página creada con «=Gestión de la construcción con Maven= * Primeros pasos con Maven * Introducción de dependencias * Configuración de plugins * Despliegue de proyectos *...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gestión de la construcción con Maven=&lt;br /&gt;
* [[Primeros pasos con Maven]]&lt;br /&gt;
* [[Introducción de dependencias]]&lt;br /&gt;
* [[Configuración de plugins]]&lt;br /&gt;
* [[Despliegue de proyectos]]&lt;br /&gt;
* [[Creación un propio archetype]]&lt;br /&gt;
* [[Perfiles de configuración]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_17/18&amp;diff=6492</id>
		<title>Prácticas - 17/18</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Pr%C3%A1cticas_-_17/18&amp;diff=6492"/>
				<updated>2017-11-24T12:49:52Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Práctica 1: [[Taller de docker]]&lt;br /&gt;
&lt;br /&gt;
* Práctica 2: [[Gestión de incidencias]]&lt;br /&gt;
&lt;br /&gt;
* Práctica 3: [[Gestión de versiones con git]]&lt;br /&gt;
&lt;br /&gt;
* Práctica 4: [[Gestión de la construcción]]&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue_de_proyectos&amp;diff=6491</id>
		<title>Despliegue de proyectos</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Despliegue_de_proyectos&amp;diff=6491"/>
				<updated>2017-11-24T12:48:06Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Desplegar un proyecto significa enviar tu artefacto a un lugar (repositorio) para ser compartido con otros. Se establecerá un repositorio para esto.&lt;br /&gt;
&lt;br /&gt;
= Desplegar el proyecto y observar el resultado =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn deploy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Especificar un lugar para los despliegues =&lt;br /&gt;
Añada al pom.xml la configuarción para que los despliegues vayan a una carpeta de su equipo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
&amp;lt;distributionManagement&amp;gt;&lt;br /&gt;
    &amp;lt;repository&amp;gt;&lt;br /&gt;
      &amp;lt;id&amp;gt; idRepo&amp;lt;/id&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt; nombreRepo&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;url&amp;gt; file://ruta_carpeta_despliegue &amp;lt;/url&amp;gt;&lt;br /&gt;
    &amp;lt;/repository&amp;gt;&lt;br /&gt;
&amp;lt;/distributionManagement&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vuelva a desplegar&lt;br /&gt;
&lt;br /&gt;
= Analice el contenido =&lt;br /&gt;
Vaya a la carpeta de despliegue y observe su contenido.&lt;br /&gt;
&lt;br /&gt;
= Actualize el proyecto= &lt;br /&gt;
Abra el pom.xml de su proyecto y cambien la versión de éste. Vuelva a desplegar el proyecto.&lt;br /&gt;
&lt;br /&gt;
= Analice el contenido=&lt;br /&gt;
Vuelva a la carpeta de despliegue y analícela de nuevo.&lt;br /&gt;
¿Que ocurre si..?:&lt;br /&gt;
* La versión acaba en &amp;lt;code&amp;gt;-SNAPSHOT&amp;lt;/code&amp;gt;.&lt;br /&gt;
* La versión acaba en cualquier otra cosa.&lt;br /&gt;
&lt;br /&gt;
Observe en el &amp;lt;code&amp;gt;maven-metadata.xml&amp;lt;/code&amp;gt; que ''release'' es la última versión actualizada que no es de desarrollo. ''lastUpdate'' es la ultima actualización, ya sea de desarrollo o no.&lt;br /&gt;
&lt;br /&gt;
= Uso de un repositorio remoto =&lt;br /&gt;
En el apartado anterior hemos utilizado un repositorio local donde desplegar nuestros JAR, pero eso resulta de poca utilidad si queremos compartirlos con otros desarrolladores. Lo habitual es utilizar repositorios remotos. Si estás desarrollando un proyecto open source lo usual es que se utilice Maven Central, pero para otro tipo de proyectos o para ejemplos como el que estamos haciendo debemos utilizar otros repositorios. Si no, estaríamos incurriendo en un mal uso de Maven Central.&lt;br /&gt;
&lt;br /&gt;
Por suerte, hay otros repositorios remotos disponibles de Maven y, algunos de ellos, tienen una versión gratuita para probar como es el caso de http://mymavenrepo.com.&lt;br /&gt;
&lt;br /&gt;
# Entrar en http://mymavenrepo.com y crear una cuenta&lt;br /&gt;
# Sigue las instrucciones para configurar tu pom.xml para tu repositorio. Fíjate que la configuración es muy similar a la que hemos hecho antes. La diferencia más significativa es que en las instrucciones de mymavenrepo te recomiendan poner las URL en un fichero settings.xml para evitar que queden públicas en el pom.xml y cualquiera pueda acceder a ellas.&lt;br /&gt;
# Haz un &amp;lt;code&amp;gt;mvn deploy&amp;lt;/code&amp;gt; y observa el resultado.&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Configuraci%C3%B3n_de_plugins&amp;diff=6490</id>
		<title>Configuración de plugins</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Configuraci%C3%B3n_de_plugins&amp;diff=6490"/>
				<updated>2017-11-24T12:30:39Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Ejecute el .jar generado */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La configuración de plugins en Maven se realiza siempre a través del fichero pom.xml. En general, la configuración de plugins me va a servir para dos cosas:&lt;br /&gt;
* Adaptar el funcionamiento de un plugin a la forma que me interese en el proyecto.&lt;br /&gt;
* Vincular objetivos de un plugin a fases del ciclo de vida de maven.&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver tres ejemplos de cosas que se pueden conseguir por medio de la configuración de plugins.&lt;br /&gt;
&lt;br /&gt;
=Seleccionar la versión de Java para compilación y ejecución con maven-compiler-plugin=&lt;br /&gt;
Por defecto, el plugin de compilación de maven fija tanto la versión del código (source) como la versión del .class generado (target) con la versión 1.5 de Java. Si queremos cambiarlo, es necesario configurar el plugin que se encarga de compilar el código (maven-compiler-plugin).&lt;br /&gt;
&lt;br /&gt;
==Añadir el siguiente código al método main de la clase App==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
[...]&lt;br /&gt;
List&amp;lt;String&amp;gt; myList =&lt;br /&gt;
    Arrays.asList(&amp;quot;a1&amp;quot;, &amp;quot;a2&amp;quot;, &amp;quot;b1&amp;quot;, &amp;quot;c2&amp;quot;, &amp;quot;c1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
myList&lt;br /&gt;
    .stream()&lt;br /&gt;
    .filter(s -&amp;gt; s.startsWith(&amp;quot;c&amp;quot;))&lt;br /&gt;
    .map(String::toUpperCase)&lt;br /&gt;
    .sorted()&lt;br /&gt;
    .forEach(System.out::println);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este código utiliza la funcionalidad de Streams de Java 1.8.&lt;br /&gt;
&lt;br /&gt;
==Compilar el código modificado==&lt;br /&gt;
Observar el mensaje de error. ¿Por qué falla?&lt;br /&gt;
&lt;br /&gt;
==Configurar pom.xml para que maven-compiler-plugin use la versión 1.8 de java==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
  [...]&lt;br /&gt;
  &amp;lt;build&amp;gt;&lt;br /&gt;
    [...]&lt;br /&gt;
    &amp;lt;plugins&amp;gt;&lt;br /&gt;
      &amp;lt;plugin&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;3.7.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;configuration&amp;gt;&lt;br /&gt;
          &amp;lt;source&amp;gt;1.8&amp;lt; /source&amp;gt;&lt;br /&gt;
          &amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt;&lt;br /&gt;
        &amp;lt;/configuration&amp;gt;&lt;br /&gt;
      &amp;lt;/plugin&amp;gt;&lt;br /&gt;
    &amp;lt;/plugins&amp;gt;&lt;br /&gt;
    [...]&lt;br /&gt;
  &amp;lt;/build&amp;gt;&lt;br /&gt;
  [...]&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compilar de nuevo el código ==&lt;br /&gt;
Observar como ahora funciona ya correctamente. Si da errores, comprueba que la versión de JDK que tienes instalada es la 1.8.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modificar el manifest con maven-jar-plugin=&lt;br /&gt;
El manifest es un fichero que se puede incluir en los JAR y que indica cuál es el punto de entrada del mismo. Este fichero permite que se pueda ejecutar el JAR directamente con &amp;lt;code&amp;gt;java -jar fichero.jar&amp;lt;/code&amp;gt; en lugar de tener que indicar la clase donde está el método main. Esto se puede conseguir configurando de forma adecuada el [https://maven.apache.org/plugins/maven-jar-plugin/ maven-jar-plugin] para establecer el punto de entrada del mismo.&lt;br /&gt;
&lt;br /&gt;
==Moficar el pom.xml==&lt;br /&gt;
Añadir lo siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
&amp;lt;build&amp;gt;&lt;br /&gt;
	&amp;lt;plugins&amp;gt;&lt;br /&gt;
  		&amp;lt;!-- Make this jar executable --&amp;gt;&lt;br /&gt;
		&amp;lt;plugin&amp;gt;&lt;br /&gt;
			&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
			&amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
			&amp;lt;version&amp;gt;2.6&amp;lt;/version&amp;gt;&lt;br /&gt;
			&amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;lt;!--Pluging configuration --&amp;gt;&lt;br /&gt;
			 &amp;lt;archive&amp;gt;&lt;br /&gt;
				&amp;lt;manifest&amp;gt;&lt;br /&gt;
					&amp;lt;!-- Jar file entry point --&amp;gt;&lt;br /&gt;
					&amp;lt;mainClass&amp;gt;${project.groupId}.App&amp;lt;/mainClass&amp;gt;&lt;br /&gt;
				&amp;lt;/manifest&amp;gt;&lt;br /&gt;
			  &amp;lt;/archive&amp;gt;&lt;br /&gt;
			&amp;lt;/configuration&amp;gt;&lt;br /&gt;
		&amp;lt;/plugin&amp;gt;&lt;br /&gt;
	&amp;lt;/plugins&amp;gt;&lt;br /&gt;
  &amp;lt;/build&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Esto configura el plugin ''jar'' para que defina el entry point del fichero JAR generado. Esta configuración se aplicará tanto al ejecutar el objetivo &amp;quot;jar:jar&amp;quot; como al ejecutar la fase &amp;quot;package&amp;quot; (a la que está vinculada por defecto el objetivo &amp;quot;jar:jar&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Cree el .jar==&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mvn clean package&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ó &lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mvn clean jar:jar&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
¿Qué diferencias hay? ¿Es correcta esta segunda invocación? ¿Por qué?&lt;br /&gt;
&lt;br /&gt;
==Ejecute el .jar generado==&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
java -jar target/proy1-1.0-SNAPSHOT.jar&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ups. ¿Por qué falla?&lt;br /&gt;
&lt;br /&gt;
=Copiar las dependencias con maven-dependency-plugin=&lt;br /&gt;
Se establecerá una carpeta dentro de target donde estarán todos los jars dependientes usando el [https://maven.apache.org/plugins/maven-dependency-plugin/ maven-dependency-plugin].&lt;br /&gt;
&lt;br /&gt;
==Edite el pom.xml==&lt;br /&gt;
Añada el siguiente código&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;plugin&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;2.10&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;executions&amp;gt;&lt;br /&gt;
          &amp;lt;execution&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;copy-dependencies&amp;lt;/id&amp;gt;&lt;br /&gt;
            &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;
            &amp;lt;goals&amp;gt;&lt;br /&gt;
              &amp;lt;goal&amp;gt;copy-dependencies&amp;lt;/goal&amp;gt;&lt;br /&gt;
            &amp;lt;/goals&amp;gt;&lt;br /&gt;
            &amp;lt;configuration&amp;gt;&lt;br /&gt;
              &amp;lt;outputDirectory&amp;gt;${project.build.directory}/dependencies&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;
              &amp;lt;includeScope&amp;gt; runtime &amp;lt;/includeScope&amp;gt; &lt;br /&gt;
            &amp;lt;/configuration&amp;gt;&lt;br /&gt;
          &amp;lt;/execution&amp;gt;&lt;br /&gt;
        &amp;lt;/executions&amp;gt;&lt;br /&gt;
      &amp;lt;/plugin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se ha configurado el plugin ''dependency''. El objetivo ''copy-dependencies'' se ha asociado a la fase ''package'' y se ha configurado para que las dependencias de runtime se copien en la carpeta ''dependencies''.&lt;br /&gt;
&lt;br /&gt;
==Cree el .jar y ejecute==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn package&lt;br /&gt;
java -jar target/proy1-1.0-SNAPSHOT.jar&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
¿Sigue fallando?&lt;br /&gt;
&lt;br /&gt;
==Hay que terminar de configurar el plugin Jar==&lt;br /&gt;
Hay que añadir las referencias en el manifest. Añada las siguientes líneas de configuración del plugin ''Jar'' anterior.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;addClasspath&amp;gt;true&amp;lt;/addClasspath&amp;gt;&lt;br /&gt;
&amp;lt;classpathPrefix&amp;gt; dependencies/&amp;lt;/classpathPrefix&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ¿Vas rápido? -&amp;gt; Tarea adicional =&lt;br /&gt;
&lt;br /&gt;
El plugin Jar se ha configurado para que, durante su ejecución dentro del ciclo de vida default, se comporte de cierta manera. Sin embargo, el plugin dependency, que no se ejecuta normalmente, se ha configurado para que sí se ejecute.&lt;br /&gt;
&lt;br /&gt;
Haga, ahora, que se creen 2 jars, uno con la configuración que hemos indicado arriba y otro sin que tenga ninguna configuración por nuestra parte. Esto no es habitualmente recomendable ya que lo ideal es que cada proyecto tenga un único resultado, pero sirve a modo de ejemplo para probar las características de Maven.&lt;br /&gt;
&lt;br /&gt;
''Indicación:'' Además de tocar el atributo &amp;lt;code&amp;gt;manifest&amp;lt;/code&amp;gt; tendrá que tocar el &amp;lt;code&amp;gt;finalName&amp;lt;/code&amp;gt; para que cada jar tenga un nombre diferente (cf. [https://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html Jar Parameters]).&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-egc/index.php?title=Configuraci%C3%B3n_de_plugins&amp;diff=6489</id>
		<title>Configuración de plugins</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-egc/index.php?title=Configuraci%C3%B3n_de_plugins&amp;diff=6489"/>
				<updated>2017-11-24T12:30:23Z</updated>
		
		<summary type="html">&lt;p&gt;Resinas: /* Cree el .jar y ejecute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La configuración de plugins en Maven se realiza siempre a través del fichero pom.xml. En general, la configuración de plugins me va a servir para dos cosas:&lt;br /&gt;
* Adaptar el funcionamiento de un plugin a la forma que me interese en el proyecto.&lt;br /&gt;
* Vincular objetivos de un plugin a fases del ciclo de vida de maven.&lt;br /&gt;
&lt;br /&gt;
A continuación vamos a ver tres ejemplos de cosas que se pueden conseguir por medio de la configuración de plugins.&lt;br /&gt;
&lt;br /&gt;
=Seleccionar la versión de Java para compilación y ejecución con maven-compiler-plugin=&lt;br /&gt;
Por defecto, el plugin de compilación de maven fija tanto la versión del código (source) como la versión del .class generado (target) con la versión 1.5 de Java. Si queremos cambiarlo, es necesario configurar el plugin que se encarga de compilar el código (maven-compiler-plugin).&lt;br /&gt;
&lt;br /&gt;
==Añadir el siguiente código al método main de la clase App==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
[...]&lt;br /&gt;
List&amp;lt;String&amp;gt; myList =&lt;br /&gt;
    Arrays.asList(&amp;quot;a1&amp;quot;, &amp;quot;a2&amp;quot;, &amp;quot;b1&amp;quot;, &amp;quot;c2&amp;quot;, &amp;quot;c1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
myList&lt;br /&gt;
    .stream()&lt;br /&gt;
    .filter(s -&amp;gt; s.startsWith(&amp;quot;c&amp;quot;))&lt;br /&gt;
    .map(String::toUpperCase)&lt;br /&gt;
    .sorted()&lt;br /&gt;
    .forEach(System.out::println);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este código utiliza la funcionalidad de Streams de Java 1.8.&lt;br /&gt;
&lt;br /&gt;
==Compilar el código modificado==&lt;br /&gt;
Observar el mensaje de error. ¿Por qué falla?&lt;br /&gt;
&lt;br /&gt;
==Configurar pom.xml para que maven-compiler-plugin use la versión 1.8 de java==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;project&amp;gt;&lt;br /&gt;
  [...]&lt;br /&gt;
  &amp;lt;build&amp;gt;&lt;br /&gt;
    [...]&lt;br /&gt;
    &amp;lt;plugins&amp;gt;&lt;br /&gt;
      &amp;lt;plugin&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;3.7.0&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;configuration&amp;gt;&lt;br /&gt;
          &amp;lt;source&amp;gt;1.8&amp;lt; /source&amp;gt;&lt;br /&gt;
          &amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt;&lt;br /&gt;
        &amp;lt;/configuration&amp;gt;&lt;br /&gt;
      &amp;lt;/plugin&amp;gt;&lt;br /&gt;
    &amp;lt;/plugins&amp;gt;&lt;br /&gt;
    [...]&lt;br /&gt;
  &amp;lt;/build&amp;gt;&lt;br /&gt;
  [...]&lt;br /&gt;
&amp;lt;/project&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compilar de nuevo el código ==&lt;br /&gt;
Observar como ahora funciona ya correctamente. Si da errores, comprueba que la versión de JDK que tienes instalada es la 1.8.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modificar el manifest con maven-jar-plugin=&lt;br /&gt;
El manifest es un fichero que se puede incluir en los JAR y que indica cuál es el punto de entrada del mismo. Este fichero permite que se pueda ejecutar el JAR directamente con &amp;lt;code&amp;gt;java -jar fichero.jar&amp;lt;/code&amp;gt; en lugar de tener que indicar la clase donde está el método main. Esto se puede conseguir configurando de forma adecuada el [https://maven.apache.org/plugins/maven-jar-plugin/ maven-jar-plugin] para establecer el punto de entrada del mismo.&lt;br /&gt;
&lt;br /&gt;
==Moficar el pom.xml==&lt;br /&gt;
Añadir lo siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
&amp;lt;build&amp;gt;&lt;br /&gt;
	&amp;lt;plugins&amp;gt;&lt;br /&gt;
  		&amp;lt;!-- Make this jar executable --&amp;gt;&lt;br /&gt;
		&amp;lt;plugin&amp;gt;&lt;br /&gt;
			&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
			&amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
			&amp;lt;version&amp;gt;2.6&amp;lt;/version&amp;gt;&lt;br /&gt;
			&amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;lt;!--Pluging configuration --&amp;gt;&lt;br /&gt;
			 &amp;lt;archive&amp;gt;&lt;br /&gt;
				&amp;lt;manifest&amp;gt;&lt;br /&gt;
					&amp;lt;!-- Jar file entry point --&amp;gt;&lt;br /&gt;
					&amp;lt;mainClass&amp;gt;${project.groupId}.App&amp;lt;/mainClass&amp;gt;&lt;br /&gt;
				&amp;lt;/manifest&amp;gt;&lt;br /&gt;
			  &amp;lt;/archive&amp;gt;&lt;br /&gt;
			&amp;lt;/configuration&amp;gt;&lt;br /&gt;
		&amp;lt;/plugin&amp;gt;&lt;br /&gt;
	&amp;lt;/plugins&amp;gt;&lt;br /&gt;
  &amp;lt;/build&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Esto configura el plugin ''jar'' para que defina el entry point del fichero JAR generado. Esta configuración se aplicará tanto al ejecutar el objetivo &amp;quot;jar:jar&amp;quot; como al ejecutar la fase &amp;quot;package&amp;quot; (a la que está vinculada por defecto el objetivo &amp;quot;jar:jar&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Cree el .jar==&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mvn clean package&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ó &lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mvn clean jar:jar&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
¿Qué diferencias hay? ¿Es correcta esta segunda invocación? ¿Por qué?&lt;br /&gt;
&lt;br /&gt;
==Ejecute el .jar generado==&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
java -jar target\proy1-1.0-SNAPSHOT.jar&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ups. ¿Por qué falla?&lt;br /&gt;
&lt;br /&gt;
=Copiar las dependencias con maven-dependency-plugin=&lt;br /&gt;
Se establecerá una carpeta dentro de target donde estarán todos los jars dependientes usando el [https://maven.apache.org/plugins/maven-dependency-plugin/ maven-dependency-plugin].&lt;br /&gt;
&lt;br /&gt;
==Edite el pom.xml==&lt;br /&gt;
Añada el siguiente código&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;plugin&amp;gt;&lt;br /&gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
        &amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;2.10&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;executions&amp;gt;&lt;br /&gt;
          &amp;lt;execution&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;copy-dependencies&amp;lt;/id&amp;gt;&lt;br /&gt;
            &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;
            &amp;lt;goals&amp;gt;&lt;br /&gt;
              &amp;lt;goal&amp;gt;copy-dependencies&amp;lt;/goal&amp;gt;&lt;br /&gt;
            &amp;lt;/goals&amp;gt;&lt;br /&gt;
            &amp;lt;configuration&amp;gt;&lt;br /&gt;
              &amp;lt;outputDirectory&amp;gt;${project.build.directory}/dependencies&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;
              &amp;lt;includeScope&amp;gt; runtime &amp;lt;/includeScope&amp;gt; &lt;br /&gt;
            &amp;lt;/configuration&amp;gt;&lt;br /&gt;
          &amp;lt;/execution&amp;gt;&lt;br /&gt;
        &amp;lt;/executions&amp;gt;&lt;br /&gt;
      &amp;lt;/plugin&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se ha configurado el plugin ''dependency''. El objetivo ''copy-dependencies'' se ha asociado a la fase ''package'' y se ha configurado para que las dependencias de runtime se copien en la carpeta ''dependencies''.&lt;br /&gt;
&lt;br /&gt;
==Cree el .jar y ejecute==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mvn package&lt;br /&gt;
java -jar target/proy1-1.0-SNAPSHOT.jar&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
¿Sigue fallando?&lt;br /&gt;
&lt;br /&gt;
==Hay que terminar de configurar el plugin Jar==&lt;br /&gt;
Hay que añadir las referencias en el manifest. Añada las siguientes líneas de configuración del plugin ''Jar'' anterior.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;addClasspath&amp;gt;true&amp;lt;/addClasspath&amp;gt;&lt;br /&gt;
&amp;lt;classpathPrefix&amp;gt; dependencies/&amp;lt;/classpathPrefix&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ¿Vas rápido? -&amp;gt; Tarea adicional =&lt;br /&gt;
&lt;br /&gt;
El plugin Jar se ha configurado para que, durante su ejecución dentro del ciclo de vida default, se comporte de cierta manera. Sin embargo, el plugin dependency, que no se ejecuta normalmente, se ha configurado para que sí se ejecute.&lt;br /&gt;
&lt;br /&gt;
Haga, ahora, que se creen 2 jars, uno con la configuración que hemos indicado arriba y otro sin que tenga ninguna configuración por nuestra parte. Esto no es habitualmente recomendable ya que lo ideal es que cada proyecto tenga un único resultado, pero sirve a modo de ejemplo para probar las características de Maven.&lt;br /&gt;
&lt;br /&gt;
''Indicación:'' Además de tocar el atributo &amp;lt;code&amp;gt;manifest&amp;lt;/code&amp;gt; tendrá que tocar el &amp;lt;code&amp;gt;finalName&amp;lt;/code&amp;gt; para que cada jar tenga un nombre diferente (cf. [https://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html Jar Parameters]).&lt;/div&gt;</summary>
		<author><name>Resinas</name></author>	</entry>

	</feed>