Flyway: formas de configurar y usos

0
1836
Tutorial Flyway

Índice de contenidos

    1. Introducción a Flyway
    2. Formas de configurar Flyway
    3. Uso de Flyway para test de integración.
    4. Conclusiones
    5. Referencias

1. Introducción a Flyway

Flyway es una herramienta usada para migraciones de bases de datos. Permite que la configuración inicial de un proyecto sea una tarea sencilla, con mínimo coste y fácil de aplicar para todo el mundo.
Si no conoces Flyway te recomiendo consultar otros tutoriales de Adictos como:

  • Integrar Flyway con Maven donde se explican conceptos básicos de Flyway y el uso del plugin de flyway-maven.
  • Refactorizar con Flyway donde se explican cómo se comporta Flyway cuando se levanta la aplicación, configuracion y establecer baseline.

En este tutorial vamos a profundizar un poco más sobre el uso de Flyway ya que hay varias formas de configurarlo dependiendo lo que más nos encaje con nuestro proyecto y varias formas de uso.

2. Formas de configurar Flyway

Hay varias formas de configurar Flyway y sobre todo depende de lo que busquemos y de nuestro proyecto, puesto que muchas de ellas pueden aplicarse al mismo proyecto con algunas ventajas o desventajas. Vamos a comentar 3 de ellas rápidamente.

Configurar Flyway en un proyecto que usa Spring Boot

    1. Añadir dependencia flyway-core
      <dependency>
      	<groupId>org.flywaydb</groupId>
      	<artifactId>flyway-core</artifactId>
      	<version>9.8.1</version>
      </dependency>
      
    2. Configuración de propiedades en application.properties o application.yml La ruta de los scripts que queremos que se ejecuten, los esquemas… Hay una amplia lista de las propiedades disponibles para configurar en la documentación de Flyway: Parámetros de configuración
    3. Crear y ordenar nuestros scripts. Tanto en este modo de configurar como cualquier otro es importante la nomenclatura de los scripts de migración, deben seguir unas reglas si no no serán ejecutados. Consultar en la documentación cuáles son estas reglas: Naming Scripts

Configurar Flyway en un proyecto que usa Spring clásico

    1. Añadir dependencia flyway-core
      <dependency>
      	<groupId>org.flywaydb</groupId>
      	<artifactId>flyway-core</artifactId>
      	<version>9.8.1</version>
      </dependency>
      
    2. Añadir bean de Flyway en el contexto de Spring
      <bean id="flywayConfig" class="org.flywaydb.core.api.configuration.ClassicConfiguration">
         <property name="dataSource" ref="dataSource"/>
         <property name="baselineOnMigrate" value="false"/>
      </bean>
      
      <bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
         <constructor-arg ref="flywayConfig"/>
      </bean>
    3. Crear y ordenar nuestros scripts.

Configurar Flyway con el plugin de Maven

    1. Añadir dependencia flyway-core
      <plugin>
      	<groupId>org.flywaydb</groupId>
      	<artifactId>flyway-maven-plugin</artifactId>
      	<version>9.8.1</version>
      	<configuration>
      			...
      	</configuration>
      </plugin>
      

      Para los parámetros de configuración, mencionados anteriormente en la configuración con Spring Boot, se pueden poner de varias formas:

        • Dentro del plugin con la etiqueta configuration:
          <configuration>
          	<user>databaseUser</user>
          	<password>databasePassword</password>
          	<schemas>
          		<schema>schemaName</schema>
          	</schemas>
          	...
          </configuration>
        • Mediante propiedades de Maven
          <properties>
          	<flyway.user>databaseUser</flyway.user>
          	<flyway.password>databasePassword</flyway.password>
          	<flyway.schemas>schemaName</flyway.schemas>
          	...
          </properties>
        • En un fichero externo por defecto se debería llamar flyway.conf
          flyway.user=databaseUser
          flyway.password=databasePassword
          flyway.schemas=schemaName
          ...
    2. Crear y ordenar nuestros scripts.

Lo que nos aporta el plugin de Maven frente a la configuración por dependencia tanto de Spring clásico como Spring Boot es la posibilidad de ejecutar Flyway únicamente cuando necesitemos. Es decir, no ejecutarlo cuándo se arranque o despliegues la aplicación, evitando así ejecuciones innecesarias cuando no haya habido ninguna actualización en la base de datos o entornos que no migran como localmente. Así agilizamos procesos y evitamos que nuestra aplicación tarde más en arrancar.

3. Uso de Flyway para test de integración

Ya se ha explicado tres formas diferentes de configurar Flyway y comentado cuál es su objetivo principal, que es la migración de base de datos. Pero esta migración no solo sirve para montar nuestro proyecto, sino también se puede dar uso para test de integración.

Podríamos decir que hay dos casos para llevar a cabo esto, mediante el uso de TestContainer o el plugin maven-docker.

TestContainer

Biblioteca de Java que nos permite ejecutar pruebas simulando nuestra base de datos real, es decir, se levanta un contenedor Docker, se realizan las pruebas y finalmente se destruye.

Existe ya algún tutorial sobre TestContainer Dockeriza tus tests de integración en Java
Pero resumiendo, para un contexto de Spring Boot sería necesario, mediante las propiedades de configuración, configurar la base de datos que queremos para pruebas. Se puede hacer creando otro archivo de configuración o como se explica el tutorial mencionado anteriormente. Si decidimos crear un nuevo archivo de configuración, ese debe llamarse con el sufijo del nombre del perfil y así Spring Boot es capaz de distinguir el perfil activo y el archivo de configuración correspondiente. Por ejemplo: application-test-containers.yml

Para poder utilizar Flyway junto con TestContainer basta con seguir la forma de configuración del punto anterior, además de deshabilitar primero Flyway en el archivo de configuración y crear un nuevo archivo de configuración con las propiedades de Flyway que queramos.

application-test-containers.yml

spring:
  datasource:
    url: jdbc:tc:postgresql:9.6.8:///test_database
    username: user
    password: password
  jpa:
    hibernate:
      ddl-auto: create
  flyway:
    enabled: false

application-test-containers-flyway.yml

spring:
  datasource:
    url: jdbc:tc:postgresql:9.6.8:///test_database
    username: user
    password: password

Para más información, consultar la documentación oficial de TestContainer: https://www.testcontainers.org/modules/databases/jdbc/

Plugin maven-docker

Otra forma de ejecutar test container sería usando el plugin de maven-docker, también contamos ya con un tutorial profundizando un poco más sobre este uso junto con Flyway: Tests de integración automáticos Docker, Flyway y Maven
Esta forma sigue la configuración de Flyway mediante plugin de Maven por lo que es necesario configurar ambos plugin. Para declarar que queremos usar Flyway para los test de integración debemos establecer dentro del plugin de flyway-maven la fase que queramos con los goals deseados. Por ejemplo:

<plugin>
	<groupId>org.flywaydb</groupId>
	<artifactId>flyway-maven-plugin</artifactId>
	<version>9.8.1</version>
	<configuration>
			...
	</configuration>
    <executions>
        <execution>
            <id>flyway</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>clean</goal>
                <goal>migrate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Ventajas y desventajas

Como hemos visto ambas formas son muy fáciles de usar con un par de configuraciones, podemos lanzar nuestros test de integración sobre un entorno real.
Tanto uno como otro son buenas opciones, pero por comentar ventajas y desventajas de ambos casos separados:

TestContainer es más estable, pero tiene una curva de aprendizaje mayor.
Por lo contrario, el plugin de maven-docker es más sencillo, pero se puede convertir en una herramienta más rudimentaria con necesidades manuales.

4. Conclusiones

Se ha podido ver que Flyway permite tanto diferentes formas de configuración como de uso y todo dependerá de nuestro caso personal enfocado a nuestro proyecto. Es por ello que Flyway es de las opciones más elegidas cuando hablamos de migraciones de bases de datos, ya que es fácil de usar, diferentes enfoques y tiene detrás una documentación amplia.

Además, si analizamos lo que nos aporta Flyway podemos ver que nos permite cubrir 3 niveles

  • Control de versiones: histórico automatizado de versiones y actualizaciones de base de datos.
  • Configuración inicial: ayuda a que la tarea de montar el entorno sea fácil para todo el mundo.
  • Test de integración: fácil configuración y tests de buena calidad en un entorno lo más real posible

5. Referencias

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