23
Gestionnaire de migrations

Liquibase en action

Embed Size (px)

DESCRIPTION

Présentation Liquibase mise à jour pour être plus exhaustive (v2.0.5) avec une démo plus complète. Merci de mentionner "Florent Biville" en tant qu'auteur original si vous souhaitez reprendre cette présentation.

Citation preview

Page 1: Liquibase en action

Gestionnaire de migrations

Page 2: Liquibase en action

Plan

1. Motivations

2. API

3. Démo

4. Stratégies pour l'existant

Page 3: Liquibase en action

Motivations

Modifier BDD en continu

Industrialiser ses migrations

Rapprocher DBA et DÉV

Page 4: Liquibase en action

Motivations

Refactoring

Modifier une portion de code, en maintenant la

sémantique de celui-ci.

Page 5: Liquibase en action

Motivations

Refactoring

Principe de substitution de Liskov

Couverture de tests

...

Page 6: Liquibase en action

Motivations

Refactoring de BDD

Modifier une partie du schéma (structures, données, triggers,

procédures stockées...) tout en maintenant sa sémantique.

Page 7: Liquibase en action

Motivations

Refactoring de BDD

Contrats ?

Tests ?

Outillage ?

http://databaserefactoring.com/

Page 9: Liquibase en action

@author: Nathan Voxland

@license: Apache License 2.0

@source: Java (GITHUB)

@currentVersion: 2.0.5 / 3.0.0.RC2

@supports: Oracle, MySQL, PostgreSQL, DB2, ...

Page 10: Liquibase en action

Concepts

Historique

Changelog / changesets

Preconditions / contexts

Page 11: Liquibase en action

Historique

DATABASECHANGELOG+---------------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------------+--------------+------+-----+---------+-------+| ID | varchar(63) | NO | PRI | NULL | || AUTHOR | varchar(63) | NO | PRI | NULL | || FILENAME | varchar(200) | NO | PRI | NULL | || DATEEXECUTED | datetime | NO | | NULL | || ORDEREXECUTED | int(11) | NO | | NULL | || EXECTYPE | varchar(10) | NO | | NULL | || MD5SUM | varchar(35) | YES | | NULL | || DESCRIPTION | varchar(255) | YES | | NULL | || COMMENTS | varchar(255) | YES | | NULL | || TAG | varchar(255) | YES | | NULL | || LIQUIBASE | varchar(20) | YES | | NULL | |+---------------+--------------+------+-----+---------+-------+

Page 12: Liquibase en action

Changelog ~ point(s) d'entrée

<databaseChangeLog xmlns...>

<include file="my/company/migrations/9.1/changelog.xml"

relativeToChangelogFile="true" />

<include file="my/company/migrations/10.0/changelog.xml"

relativeToChangelogFile="true" />

<!-- [...] -->

</databaseChangeLog>

Page 13: Liquibase en action

Changeset ~ unité de migration

Identité = Path + ID + Auteur

<changeSet id="exemple_de_changeset" author="florent.biville">

<comment>Vente en ligne de minitels</comment>

<createTable tableName="minitels"

remarks="EVOL-42">

<column name="id" type="INTEGER" />

</createTable>

</changeSet>joué une seule fois sauf si runAlways="true"

changements ensuite interdits sauf si runOnChange="true"

Page 14: Liquibase en action

Changeset ~ unité de migration

Pourquoi XML* ?

1. indépendance vendor

2. rollback automatique

3. utilisation SQL possible ;-)

* ou JSON/YAML/"SQL annoté"

Page 15: Liquibase en action

Changeset ~ rollback

Rollback manuel (SQL ou tags Liquibase standards)

<changeSet id="exemple_de_changeset" author="florent.biville">

<comment>Vente en ligne de minitels</comment>

<sql>UPDATE Persons SET age = age + 42;</sql>

<rollback>

UPDATE Persons SET age = age - 42;

</rollback>

<!-- <rollback /> pour désactiver le rollback sur un changeset -->

</changeSet>

Page 16: Liquibase en action

Preconditions

Requête custom ou tags Liquibase standard

<changeSet id="only_as_system" author="florent.biville">

<comment>Un grand pouvoir implique...</comment>

<preConditions><!-- DRY: <xi:include href="../common/run_as_system.xml" /> -->

<dbms type="oracle" />

<runningAs username="SYSTEM" />

</preConditions>

<!-- danger! high voltage! -->

</changeSet>

Page 17: Liquibase en action

Context

Contexte paramétré à l'exécution

<changeSet id="exemple_contexte" context="local,test"

author="florent.biville">

<!-- danger! high voltage! -->

</changeSet>

il suffit qu'un seul des contextes corresponde

Page 18: Liquibase en action

DÉMO

https://github.com/fbiville/liquibase-demo

Page 19: Liquibase en action

Stratégies pour l'existant : initialisation

Stratégie n°1 Stratégie n°2 Stratégie n°3

Définir 1 état de référence.Définir toutes les migrations à partir de cet état.

Inclure un changeset de dump de la BDD de référence.Définir les migrations ensuite.

Reconstruire toutes les migrations manuellement.Y ajouter ensuite un changeset de dump de données.

Page 20: Liquibase en action

Stratégies pour l'existant : initialisation

Stratégie n°1 Stratégie n°2 Stratégie n°3

+ simple- récupération / exécution du dump à la charge de chaque user

+ simple- couplage fort avec le vendor de BDD

+ indépendance vis-à-vis du vendor- fastidieux

Page 21: Liquibase en action

Stratégies pour l'existant : intégration

Spring Maven CLI

Utiliser le bean SpringLiquibase.Idéal pour déploiement sur PAAS.

Utiliser le plugin Maven.Idéal pour la CI, aussi riche en options que le client CLI.

Utiliser l'utilitaire en ligne de commandes."Implémentation" de référence.

autres modes disponibles: Ant, listener de Servlet

Page 22: Liquibase en action

CONCLUSION

Page 23: Liquibase en action

?