sábado, 15 de noviembre de 2014

Liquibase + Grunt + MySQL



He encontrado un paquete en NPM, grunt-liquibase, que permite gestionar Liquibase con sencillos comandos en Grunt. Lo que nos va a facilitar la integración en nuestro proyecto una gestión eficiente de control de cambios en la estructura y contenido de la base de datos.

Una buena gestión de cambios en la base de datos en un proyecto durante el proceso de desarrollo es muy útil, pero un paso seguro y eficiente a otros entornos como producción es imprescindible.
Podríamos pensar que es el equivalente a un gestor de repositorio de código, pero con la base de datos. Si estamos como es usual en un equipo de desarrollo y cada uno modela la base de datos según su "Story User" puede convertirse en un martirio cada "update".
Para ello Liquibase se basa en changesets o acciones que se ejecutan de manera atómica y secuencial, de así podemos ir añadiendo cambios sin entrar en conflicto con los cambios de otros desarrolladores, además de saber exactamente que es lo que se va a desplegar y cuando.

Por otro lado tenemos Grunt. Ya hemos hablado un poco sobre este poderoso gestor de tareas.
Y finalmente pero no menos importante la base de datos. Por defecto grunt-liquibase viene por defecto con soporte para posgreSQL, pero para este ejemplo en cuestión vamos a utilizar la extensión del mismo para MySQL grunt-liquibase-mysql.

Ya tenemos los ingredientes, y el entorno (NodeJS y NPM), encendemos el fuego y manos a la obra:

Como todo proyecto en Node vamos a necesitar configurar las dependencias en nuestro fichero package.json, si no lo tenemos lo podemos inicializar con el comando npm init o usar mio de ejemplo:


{
  "name": "LiquibaseGruntMySQL",
  "version": "0.0.0",
  "description": "Testing Liquibase, Grunt & MySQL integration",
  "main": "Gruntfile.js",
  "dependencies": {
    "grunt": "~0.4.5",
    "grunt-liquibase": "~0.1.5",
    "grunt-liquibase-mysql": "~0.1.6"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "reqtangular",
  "license": "BSD-2-Clause"
}


ya con las dependencias configuradas podemos ejecutar la instalación:

npm install

Muy bien, ahora tenemos las herramientas. El siguiente paso sería la configuración del fichero para Grunt, Gruntfile.js, podríamos agregar la tarea si ya lo tuviésemos o crear uno nuevo como el que sigue:


grunt.initConfig({
  liquibase : {
    options: {
      changeLogFile : 'dbchangelog.xml',
      username : 'root',
      password : 'root',
      url : 'jdbc:mysql://localhost/liquibase_test',
      driver: 'com.mysql.jdbc.Driver',
      classpath: 'node_modules/grunt-liquibase-mysql/lib/mysql-connector-java-5.1.30-bin.jar'
    },
    update: {
      command: 'update'
    },
    dropAll: {
      command: 'dropAll'
    },
    version : {
      command: 'version'
    }
  },
});

  // Default task(s).
  grunt.registerTask('default', ['liquibase']);
};



En la sección de options parametrizamos el plugin, Base de datos, driver, classpath del mísmo y lo mas importante el fichero de registro de cambios para Liquibase, en este caso llamado dbchangelog.xml, pero si no lo definimos el nombre por defecto será changelog.xml. El resto de opciones las podéis encontrar en la propia página del plugin.

Para terminar el ejemplo solo quedaría definir nuestros cambios en la base de datos, tablas, campos en ellas, relaciones entre entidades, datos inyectados por defecto, vistas, etc.

Vamos a crear una tabla en la base de datos "liquibase_test" (que tendremos que tener creada previamente)

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

 <changeSet id="1" author="bob">
        <createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="active" type="boolean" defaultValueBoolean="true"/>
        </createTable>
    </changeSet>


</databaseChangeLog>



Y con todo esto ya estamos preparados para hacer nuestro primer update, para ello bastaría con ejecutar el comando:

 grunt liquibase:update --verbose

Si la última línea es de color verde y dice "Done, without errors." es que todo ha ido a pedir de boca. Rico, rico!

Espero que os haya sido útil. Saludos!








No hay comentarios:

Publicar un comentario