28 mars 2011

Liquibase et bdd distante

Toujours dans le cadre du développement agile, je voudrais vous parler (assez rapidement) d'une librairie open-source que nous utilisons (dans notre société) pour mettre à jour et suivre l'évolution des bases de données de nos applications : Liquibase.

Cette librairie est utilisée comme plugin de Grails (notre framework de développement d'application) pour mettre à jour nos bases de données (Postgresql - mais n'importe quelle base de données est supportée). Il est possible également de l'utiliser en ligne de commande (avec l'aide de Maven).

Chaque mise à jour fait l'objet d'un "changelog file" (structure XML) : le fichier est enregistré dans la base avec son checksum. A chaque exécution, les "changelogs" sont exécutés dans l'ordre, une vérification du checksum permet de s'assurer qu'il n'y a pas eu modification depuis leur enregistrement précédent dans la base.

Cette librairie est honnêtement d'une redoutable efficacité. Nous sommes tombés cependant sur une petit os ... qu'on a compris et dont je voulais vous faire part ...

Lors d'un récent changement de configuration (à savoir mise à jour de bases non plus locales mais distantes - sur un autre serveur), nous avons eu la désagréable surprise de voir que l'exécution de Liquibase plantait :
No X11 DISPLAY variable was set, but this program performed an operation which
requires it.
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.(Window.java:407)
at java.awt.Frame.(Frame.java:402)
at java.awt.Frame.(Frame.java:367)
at javax.swing.SwingUtilities$SharedOwnerFrame.(SwingUtilities.java:1731)
at javax.swing.SwingUtilities.getSharedOwnerFrame(SwingUtilities.java:1808)
at javax.swing.JOptionPane.getRootFrame(JOptionPane.java:1673)
at javax.swing.JOptionPane.showOptionDialog(JOptionPane.java:846)
at javax.swing.JOptionPane.showConfirmDialog(JOptionPane.java:779)
at javax.swing.JOptionPane.showConfirmDialog(JOptionPane.java:741)
at liquibase.SwingUIFacade.promptForNonLocalDatabase(SwingUIFacade.java:15)
La seule chose qui avait changé était l'emplacement des bases ... Curieux que l'on nous parle d'interface graphique.

En cherchant sur Internet, j'ai fini par découvrir que dans le cas de bases non-locales, Liquibase pose une question (du genre : attention, ce n'est pas une base locale que vous allez mettre à jour, vous confirmez ?) ... sauf que c'est une jolie boite de dialogue qui est sensée s'afficher (je suppose, mon environnement est un REDHAT sans serveur X11).
Et, comme toute application bien faite, il y a possibilité de paramétrer Liquibase pour qu'il ne nous pose pas la question.

C'est là que ça se gate : le paramètre visiblement utilisé, " promptForNonLocalDatabase" qu'il faut mettre à false pour ne pas avoir la question, n'a pas le résultat escompté ...

En lisant le code, certains ont trouvé : ce n'est pas "promptForNonLocalDatabase" mais " promptOnNonLocalDatabase" respectivement utilisé en ligne de commande et par le plugin ...

La question est de savoir pourquoi un même paramètre (même effet) porte un nom différent selon l'environnement d'exécution. Peut-être que Nathan Voxland, développeur à l'origine de Liquibase pourrait nous le dire ....

(Voir http://http://www.liquibase.org/fr/home)

1 commentaire:

Anonyme a dit…

I had the same issue and went through the source code, promptForNonLocalDatabase is correct,
prompt is NonLocalDatabase is just used as internal variable. I have fixed this issue in our project and have blogged the same at http://blog.nutpan.com/2012/03/liquibase-maven-plugin-issue-with-non.html