J'ai eu du mal à trouver de bons exemples de gestion des schémas de base de données et des données entre les serveurs de développement, de test et de production.
Voici notre configuration. Chaque développeur dispose d'une machine virtuelle exécutant notre application et la base de données MySQL. C'est leur bac à sable personnel pour faire ce qu'ils veulent. Actuellement, les développeurs apporteront une modification au schéma SQL et effectueront un vidage de la base de données dans un fichier texte qu'ils valideront dans SVN.
Nous souhaitons déployer un serveur de développement d'intégration continue qui exécutera toujours le dernier code validé. Si nous faisons cela maintenant, il rechargera la base de données à partir de SVN pour chaque build.
Nous avons un serveur de test (virtuel) qui exécute des "release candidates". Le déploiement sur le serveur de test est actuellement un processus très manuel et implique généralement de charger le dernier SQL à partir de SVN et de le peaufiner. En outre, les données sur le serveur de test sont incohérentes. Vous vous retrouvez avec les données de test que le dernier développeur à s'engager avait sur son serveur sandbox.
Là où tout tombe en panne, c'est le déploiement en production. Étant donné que nous ne pouvons pas remplacer les données en direct par des données de test, cela implique de recréer manuellement toutes les modifications de schéma. S'il y avait un grand nombre de changements de schéma ou de scripts de conversion pour manipuler les données, cela peut devenir vraiment poilu.
Si le problème n'était que le schéma, ce serait un problème plus facile, mais il y a des données «de base» dans la base de données qui sont également mises à jour pendant le développement, comme les méta-données dans les tables de sécurité et d'autorisations.
C'est le plus gros obstacle que je vois dans la transition vers une intégration continue et des constructions en une étape. Comment le résolvez- vous ?
Une question de suivi: comment suivre les versions de base de données afin de savoir quels scripts exécuter pour mettre à niveau une instance de base de données donnée? Une table de version comme Lance mentionne-t-elle en dessous de la procédure standard?
Merci pour la référence à Tarantino. Je ne suis pas dans un environnement .NET, mais j'ai trouvé leur page wiki DataBaseChangeMangement très utile. Surtout cette présentation Powerpoint (.ppt)
Je vais écrire un script Python qui vérifie les noms des *.sql
scripts dans un répertoire donné par rapport à une table de la base de données et exécute ceux qui ne sont pas là dans l'ordre basé sur un entier qui forme la première partie du nom de fichier. Si c'est une solution assez simple, comme je suppose que ce sera le cas, je la posterai ici.
J'ai un script de travail pour cela. Il gère l'initialisation de la base de données si elle n'existe pas et exécute des scripts de mise à niveau si nécessaire. Il existe également des commutateurs pour effacer une base de données existante et importer des données de test à partir d'un fichier. Il fait environ 200 lignes, donc je ne le posterai pas (bien que je puisse le mettre sur pastebin s'il y a de l'intérêt).