lundi 15 avril 2013

Bases de Données et Intégration Continue


TFS grace à son large panel d'outil permet d'adresser la problématique d'intégration continue pour l'activité de développement de base de données. L'idée est d'intégrer les développements de bases de données dans l'activité plus globale de développement d'application avec l'intégration dans le controle de code source des objets de base de données, mais également la capacité à intégrer ce code dans le processus d'intégration continue, permettant chaque nuit par exemple de compiler ce projet, procéder à l'analyse de code statique et lancer les tests unitaires sur les procédures stockées et enfin déployer la dernière version de la base de données sur un serveur cible.
Dans cet article, nous allons démontrer le processus de création d'un projet de base de données, son intégration dans le controle de code source, puis la modification du Template de Build afin de déployer automatiquement le projet de base de données sur un serveur cible défini dans le manifest du projet de base de données

ETAPE 1 : Création du projet de base de données, configuration du déploiement et intégration dans le controle de code Source

Lancer Visual Studio 2010 puis créer un projet de base de données en utilisant le template SQL Server 2008 Wizard. Dans cet exemple nous nous baserons sur la base exemple adventureworks.







Le wizard suivant se lance, cliquer sur Suivant
Choisir l'option base utilisateur et l'affichage par type d'objet comme monté ci dessous


En fonction du contexte projet, cocher les différentes options, A noter que ces options pourront être modifiées par la suite


Dans cette étape, cocher l'option importer le schéma existant, cliquer le bouton nouvelle connexion pour choisir la base de données dont on veut acquérir le schéma, puis cliquer sur suivant


Dans l'action de déploiement, choisir l'option "Créer un script de déploiement et déployer la base de données"

Cliquer sur Terminer, le processus de scriptage des objets est lancé, puis cliquer sur Terminer

Au bout de quelques secondes, le projet de base de données apparait dans l'explorateur de solutions comme montré ci dessous


A l'aide du bouton droit de la souris sélectionner la commande Propriétés du projet et configurer la section Connexion cible pour le déploiement de la base de données puis enregistrer la configuration

Pour vérifier le fonctionnement, en sélectionnant le Noeud du projet dans l'explorateur de solution, lancer la commande Déployer


La fenêtre d'Output affiche les informations de résultat du déploiement.

A partir du moment ou le projet de base de données compile et se déploie, nous allons pouvoir l'intégrer au controle de code source en utilisant la commande "Ajouter la solution au controle de code source" :



Configurer  la localisatioin de la solution dans le dossier Database de la structure de code source pour lancer la commande Archiver (Check in) pour intégrer le projet de base de données dans le Controle de code source



Etape 2 : Implementation de l'intégration continue

La première étape consiste à modifier le processus de Buid pour intégrer la capacité de déploiement, cet étape est très simple et se déroule comme suit :
A partir de Team Explorer Créer une nouvelle définition de Build

Cliquer ensuite sur l'onglet Process puis cliquer sur le bouton Nouveau à droite de la liste des modèles


La fenêtre de dialogue "Nouveau modèle de processus de génération" s'ouvre, entrer DBDeploy dans la zone nom du nouveau fichier Template. Cette astuce nous permet de créer un clone du modèle de processus que nous allons adapter pour le déploiement de notre projet de base de données.


Valider, lorsque la fenêtre se referme, le nouveau modèle de processus apparait dans la liste et un hyperlien permet de le localiser dans le controle de code source, cliquer sur cet hyperlien

Cette action ouvre la fenêtre du Source Control Explorer et affiche notre fichier Template. Sélectionner le fichier, cliquer sur Obtenir la dernière version


Puis extraire le fichier pour le modifier


Double cliquer sur le fichier DBDeploy.xaml pour l'ouvrir. Le fichier s'ouvre dans le designer Workflow Foundation. Cliquer sur Réduire Tout afin de compacter l'affichage



Appuyer la séquence de touches CTRL Alt X pour afficher la boite à outils, Déplier la catégorie "Flux de Controle" puis glisser l'activité Séquence au dessous la dernière séquence du workflow existant. L'objectif étant en fin de build, si la solution a compilé et que les tests ont réussi, permettre le déploiement de la base de données


La séquence apparait comme suit


Renommer le titre de la séquence en "Deploy Database" par exemple.
Pour afficher la fenêtre de propriété, simplement cliquer sur F4 après avoir sélectionner ladite séquence

Sélectionner l'activité If et la glisser à l'intérieur de la séquence Deploy Database. On remarquera l'apparition de warning rouges indiquant que la configuration n'est pas correctement finalisée.



Double cliquer sur l'activité If afin de pouvoir finaliser sa configuration

Dans la section Activités Team Foundation Build, sélectionner l'élément InvokeProcess puis la glisser dans la zone Then du If. Cette activité est très puissante car permet de lancer tout type de fichier exécutable tout en lui passant des paramètres



Sélectionner l'activité InvokeProcess puis cliquer sur F4 pour afficher la fenêtre de propriété, cliquer sur le bouton en regard de la propriété arguments et entrer l'expression d'arguments comme montré ci dessous. Attention à remplacer dans la section manifest DBDeploy par le nom de manifest de votre projet de base de données (par défaut le nom du projet de base de données)

Pour la commande Invokeprocess, l'objectif est de lancer l'utilitaire VSDBCMD qui permet de déployer en ligne de commande un projet de base de données. Pour plus d'information sur les arguments consulter la page msdn : http://msdn.microsoft.com/en-us/library/dd193283(v=vs.100).aspx
InvokeProcess étant lancé à partir du serveur de build, il faut non seulement qu'il soit installé sur ce serveur (normalement par défaut si Visual Studio est installé) et de plus, il faut connaitre son chemin sur le disque afin de le renseigner dans la propriété Filename de l'activité. Ci dessous le chemin attendu de VSDBCMD

Copier coller le chemin dans la propriété FileName de l'activité InvokeProcess comme montré ci dessous


Puis entrer BuildDetail.DropLocation pour la propriété Working Directory. On remarquera la fonctionnalité d'intellisense qui permet de fiabiliser les saisies.


La configuration de l'activité de déploiement est maintenant terminée, il reste simplement à rajouter des activités de type message pour apporter de l'information sur le déroulement du déploiement dans la Log du Build. Double cliquer sur l'activité Invoke Process














Glisser une activité WriteBuild Message au dessous du champ stdOutput dans la section "Gérer la sortie standard", choisir High pour l'importance (voir capture d'écran ci dessous) et taper stdOuput dans la propriété Message, changer le nom en VSDBCMD Output


 

Procéder de meme pour la sortie d'erreur, entrer errOutput dans la propriété Message et configurer à High l'importance.













Sauvegarder le workflow et fermer le Designer. Puis procéder au check in du fichier afin de pouvoir le consommer à partir d'une nouvelle définition de Build.
















Créer une nouvelle définition de build, choisir la solutin contenant le projet de base de données et dans la liste des modèles de processus choisir le template précédemment créé DBDeploy





Sauvegarder la définition de Build et Tester, la base de données est déployée automatiquement sur le serveur cible défini dans le Manifest.



 
IMPORTANT: Le déploiement de la base de données est lancé avec l'identité du service de Build, il faut donc s'assurer de bien avoir donné les droits adéquats au serveur de Build sur le serveur de bases de données cible.
Pour aller plus loin : cet article décrit un processus de déploiement simple, il est possible d'enrichir ce modèle en s'appuyant sur des arguments qui permettront au moment du lancement du build de passer en paramètre le nom de la base de données à déployer ainsi que le nom du serveur de base de données cible ceci afin d'avoir plus de souplesse dans l'activité de déploiement multi environnements
 

 

Aucun commentaire: