Integración de pruebas con Docker

1
8986

Siguiendo con la serie de tutoriales dedicados a Docker,
vamos a ver como integrar Docker dentro de nuestros proyectos a través de Maven
y como lanzar nuestros test de integración sobre una base de datos creada en un contenedor.

0. Índice de contenidos

1. Introducción

En el tutorial Docker para Bases de Datos
habíamos creado una serie de imágenes con diferentes motores de BBDD, ahora vamos a dar un paso más y vamos a integrar una de estas
imágenes (en concreto la imagen con DB2 )
dentro de nuestro proyecto Maven.

El objetivo es que durante la fase de tests de integración, construyamos la imagen con DB2, arranquemos el contenedor, ejecutemos los test de integración y destruyamos el
contenedor.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: MacBook Pro 15' (2.3 GHz Intel Core i7, 16GB DDR3 SDRAM)
  • Sistema Operativo: Mac OS X El Capitan 10.11
  • Software: Docker 1.9.1, Docker Machine 0.5.2

3. Plugins Maven Docker

En la actualidad existen varios plugin para integrar docker con nuestros proyectos java, entre ellos destacamos:

Entre estas alternativas nos hemos decantado por rhuss/docker-maven-plugin, básicamente porque dispone de una documentación más completa.

Gracias a este plugin podemos hacer uso de docker a traves de Maven con los siguientes goals:

Goal Description
docker:start Arranca un contenedor
docker:stop Para y destruye el contenedor
docker:build Construye la imagen
docker:watch Habilita la reconstrucción de imágenes y rearranque de contenedores en caso de cambios
docker:push Sube la imagen al repositorio
docker:remove Elimina la imagen
docker:logs Muestra los logs del contenedor

4. Configuración del plugin

En este apartado vamos a ver como configuramos el plugin:

<plugin>
	<groupId>org.jolokia</groupId>
	<artifactId>docker-maven-plugin</artifactId>
	<version>0.13.6</version>
	<configuration>
		<logDate>default</logDate>
		<autoPull>true</autoPull>
		<images>
			<image>
				<alias>db</alias>
				<name>jpacheco/db2-formacion</name>
				<build>
					<assembly>
						<dockerFileDir>demo</dockerFileDir>
					</assembly>
				</build>
				<run>
					<privileged>true</privileged>
					<ports>
						<port>50001:50000</port>
					</ports>
					<wait>
						<time>200</time>
					</wait>
					<log>
						<color>yellow</color>
						<prefix>DB PRUEBA DOCKER MAVEN</prefix>
					</log>
					<cmd>db2start</cmd>
				</run>
			</image>
		</images>
	</configuration>

En el apartado configuration indicamos:

  • logDate: que tome la configuración de fecha por defecto para los logs
  • autoPull: indicamos que si las imágenes base no están en nuestro repositorio local, intente hacer un docker pull ..

En el apartado images describimos las imágenes que podemos gestionar desde nuestro proyecto.
En nuestro ejemplo vamos a describir la imagen con DB2
dentro del tag image :

  • alias: Alias de la imagen (puede ser usada para vincularla a otra imagen)
  • name: Nombre de la imagen

En la sección build le indicamos la configuración necesaria para construir la imagen, la información que tomará cuando ejecutemos mvn docker:build

  • assembly / dockerFileDir :Directorio donde se encuentra el DockerFile y ficheros necesarios para construir la imagen

En la sección run le indicamos la configuración necesaria para arrancar un contenedor mvn docker:start

  • privileged :Directorio donde se encuentra el DockerFile y ficheros necesarios para construir la imagen
  • ports / port : Mapeo de puertos entre el contenedor y la máquina anfitriona
  • wait / time : Tiempo en ms de espera a que arranque el contenedor
  • log / color / prefix : Configuramos el color y el prefijo de los logs del plugin
  • cmd : Comando de arranque del contenedor

Una vez configurado podemos ejecutar alguno de los goals del plugin:

mvn docker:build

Con la que construimos la imagen.

mvn docker:start

Arranca el contenedor, como podemos comprobar con docker ps.

mvn docker:stop

Paramos y destruimos el contenedor, como podemos comprobar con docker ps -a.

5. Integración con Test de Integración

Una vez hemos configurado correctamente el plugin, vamos a engancharlo con nuestros test de integración, para ello vamos a partir de un proyecto Spring + MyBatis + Maven que esta disponible
aquí

No se trata de explicar el código del proyecto, basta decir que hemos usado el plugin de Maven Failsafe
para lanzar los test de integración usando la
configuración básica y cumpliendo con la convención de llamar a nuestros tests de integración
con el sufijo «IntegrationTest». (conviene indicar que asociaremos la fase de de test de integración a un ‘profile’ maven llamado integration)

Sólo nos falta enganchar el plugin de Docker en las fases pre-integration-test (construimos la imagen y arrancamos el contenedor)
y post-integration-test (paramos – borramos el contenedor y destruimos la imagen)

Para ello basta con añadir a la configuración del plugin lo siguiente:

	<executions>
	  <execution>
	    <id>start</id>
	    <phase>pre-integration-test</phase>
	    <goals>
	      <goal>build</goal>
	      <goal>start</goal>
	    </goals>
	  </execution>
	  <execution>
	    <id>stop</id>
	    <phase>post-integration-test</phase>
	    <goals>
	      <goal>stop</goal>
	      <goal>remove</goal>
	    </goals>
	  </execution>
	</executions>

como se puede observar en el código estamos vinculando los goals de build y start a la fase de pre-integration-test y los de stop y remove
a la fase post-integration-test

Una vez configurado todo podemos lanzar los test de integración, ejecutando

	mvn clean verify -P integration

Como podemos apreciar en la imagen se construye la imagen Built image 38786c137995, arranca el contenedor
Start container 5b7eb588ea26, se lanzan los test org.autentia.tutoriales.ProfesorMapperIntegrationTest y finalmente
paramos y destruimos el contenedor Stop and remove container 5b7eb588ea26 y eliminamos la imagen Remove

6. Conclusiones

Como hemos podido comprobar a través de esta serie de tutoriales, los ámbitos de aplicación de Docker parecen ilimitados,
en próximos tutoriales seguiremos descubriendo nuevas características y usos de Docker.

Un saludo.

7. Referencias

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad