mardi 26 juillet 2011

Bases de Données et Intégration Continue avec Visual Studio 2010

Introduction

Au coeur du concept d'industrialisation, on retrouve bien évidemment l'intégration continue avec notamment le couplage du déploiement. Après la qualité, Microsoft au travers du concept "No waste" s'attaque sur l'ensemble de la plate forme ALM TFS 2010 au chantier de l'automatisation pour éliminer tout temps gaspillé par les équipes dans des taches fastidieuses, répétitives à faible valeur ajoutée. Un des piliers de ce concept est la nouvelle version de Team Build 2010 entièrement refondu au dessus de la technologie WF 4.0 lui conférant plus de capacités et de flexibilité.

Dans cet article nous allons démontrer l'utilisation de Team Build pour automatiser le déploiement d'un projet de base de données dans un contexte d'intégration continue. Nous utiliserons la base exemple Adventure Works pour la mise en oeuvre de ce Build Template personnalisé

Etape 1 : Création du Projet de Base de données

Démarrer Visual Studio 2010 et créer un nouveau projet de Type "SQL Server 2008 Wizard", nommer le projet ADVDatabase par exemple, choisir l'emplacement de stockage du projet :

Cliquer sur OK puis sur Next
Choisir l'option User Defined Database et la représentation de votre choix, ici nous prenons par type d'objet sans le nom du schéma pour éviter la limitation des 256 caractères qui peut être très vite dépassée avec des projets de bases de données. Cliquer sur Next
Modifier les Options de la base de données en fonction du contexte, ici nous garderons les options par défaut, cliquer sur Next
Cocher l'option Import Existing Schema et se connecter à la base de données AdventureWorks (ou autre) à partir de laquelle le projet sera crée au travers du scriptage de l'ensemble des objets du schéma de la base de données, nous décocherons l'ensemble des options d'import, cliquer sur Next.
Pour la configuration du build et du déploiement, choisir l'option créer le script de déploiement et déployer la base de données, spécifier ensuite le serveur SQL cible pour le déploiement et indiquer le nom de la base de données. A noter que ces options peuvent être modifées à posteriori via la fenêtre de propriétés du projet de base de données.
Cliquer sur Finish, le processus d'acquisition du schéma de la base de données est lancé. Cliquer à nouveau sur Finish lorsque le scriptage des objets est terminé.
Le projet de base de données apparait alors dans la fenêtre Solution Explorer, il peut être inspecté également en utilisant la vue "Schema View" analogue à celle de SSMS.
On compile alors pour s'assurer que le projet ne comporte pas d'erreurs.
On teste ensuite un déploiement en utilisant la commande Deploy du menu contextuel
Si aucune erreur n'est survenue, on peut par exemple avec SSMS vérifier que la base de données a bien été déployée sur le serveur SQL cible.
Le projet est prêt pour être configuré en intégration continue, nous allons donc l'ajouter au Source Control en utilisant la commande contextuelle (à partir du noeud de la solution contenant le projet) Add solution to Source Control.
Puis nous archivons la solution via la commande Check in Pending Changes.
Etape 2 : Création du Build personnalisé pour le déploiement automatisé du projet de base de données

Nous allons personnaliser ce fichier XAML en utilisant le Designer de Workflow de Visual Studio 2010, dans cet étape nous ajouterons une séquence au workflow dans laquelle nous déploierons la base de données en utilisant l'utilitaire VSDBCMD.EXE. Les préconditions seront : Le build a été exécuté avec succès et les tests sont passés.
Je vous recommande de consulter la page de référence MSDN de l'utilitaire VSDBCMD afin de connaitre l'ensemble des options de l'outil.
Afficher la fenêtre du Team Explorer et se positionner sur l'onglet Builds du projet d'équipe contenant le projet de base de données. Lancer la commande contextuelle New Build Definition
Se positionner directement sur l'onglet Process
Cliquer sur le bouton Show Details puis cliquer sur le bouton New pour créer un nouveau Template de Build basé sur le template standard
Renommer le fichier template en DatabaseCI_Template.xaml par exemple puis valider
Cliquer sur l'hyperlien permettant d'accèder au Source Control dans le dossier des Build Templates puis lancer la commande Get Latest Version pour récupérer ce fichier dans notre Workspace courant :
Passer le fichier en Check out pour pouvoir le modifier puis ouvrir ce template simplement en double cliquant dessus
Le workflow de ce build apparait sur la surface de design XAML de Visual Studio 2010.
Cliquer sur le bouton Collapse All en haut à droit de la surface de design pour masquer les détails du processus de build standard.
Dans le cadre de l'intégration continue, le déploiement doit s'effectuer en fin de processus de build à la condition ou le processus de build ait réussi
Nous allons afficher la boite à Outils (Ctrl Alt X). On constate que Visual Studio vient en standard avec une collection impressionnante d'activités dédiées à Team Build en plus des activités de base Workflow Foundation 4.0
L'étape suivante va consister à glisser une activité Sequence située dans la catégorie Control Flow de la boite à outils, juste au dessous de la séquence Check in Gated Changes To, puis renommer le titre de la séquence en Deploy Database
Il suffit ensuite de glisser le bloc If à l'intérieur de la séquence pour gérer les préconditions d'exécution du déploiement
Double cliquer sur le bloc If pour afficher le détails de ses propriétés
Tant que les paramètres ne sont pas complets ou incorrect, un icone de warning apparaît en haut à droite du bloc concerné.
Nous allons entrer la condition du bloc If, pour cela appuyer sur F4 pour afficher la fenêtre de propriétés et cliquer sur le bouton à droite de la propriété Condition. Dans la boite, entrer la condition suivante :
BuildDetail.CompilationStatus = BuildPhaseStatus.Succeeded And (BuildDetail.TestStatus = BuildPhaseStatus.Succeeded Or BuildDetail.TestStatus = BuildPhaseStatus.Unknown)
Au passage on renommera également le bloc If en If Build and Tests Succeeded
Le lancement de l'utilitaire VSDBCMD se fera grace à l'activité InvokeProcess. Cette activité fait partie de la rubrique Team Foundation Build Activities.
Glisser l'activité InvokeProcess dans le bloc Then du Bloc If comme démontré ci dessous :
Double cliquer sur le bloc InvokeProcess pour afficher son détail puis presser la touche F4 pour afficher la fenêtre de propriétés.
Editer la zone Display Name et entrer "InvokeVSDBCMD"
Editre la zone Arguments et entrer la valeur : "/a:Deploy /dd+ /dsp:Sql /manifest: AdvDatabase.deploymanifest"
Attention : AdvDatabase représente le nom de votre projet de base de données
Editer la zone FileName et entrer la valeur : "C:\Program Files\Microsoft Visual Studio 10.0\VSTSDB\Deploy\VSDBCMD.EXE" (Attention à bien vérifier que ce chemin existe sur le serveur de build. Si le chemin est différent, modifier ce paramètre en conséquence. Vsdbcmd est installé avec Visual Studio 2010, il est d'ailleurs toujours conseillé de l'installer sur le serveur de build pour debugger plus facilement les erreurs de Builds)
Editer la zone Working Directory et entrer la valeur : BuildDetail.DropLocation
Nous terminerons par les messages d'output de l'activité Invoke Process, Glisser au dessous du bloc Standard Output l'activité WriteBuildMessage
Afficher la fenêtre de propriétés et configurer le Display Name à VSDBCMD Output, Configurer l'importance à : Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High. et enfin le message avec stdOutput comme indiqué ci dessous :
Glisser ensuite l'activité WriteMessageError au dessous du bloc Handle Error Output, et configurer le Display Name en VSDBCMD Error, et le message à errOutput.
A ce stade, le bloc se présente comme suit :
On se repositionne sur le bloc If et nous allons gérer le bloc Else. Simplement Glisser une activité WriteBuildWarning. Configurer le Display Name à Deployment Skipped et le message à : "The deployment was skipped"

Pour terminer l'implémentation, enregistrer le Template de Build, puis procéder au Check In.
Le template apparaitra maintenant dans la liste des templates, il suffit simplement de créer un nouveau Build et consommer ce template, en fin de build, la dernière version de la base de données sera déployée sur le serveur cible.
Conclusion
Au travers de cet article, nous avons démontré la facilité d'utilisation de WF 4.0 couplé à Team Build pour automatiser le déploiement de projets de bases de données. Sur des projets réels, ce type de déploiement sera adapté à l'aide des technologies de déploiemnet Web Setup Deployement pour des sites Webs ou encore Click Once afin de globaliser le déploiement d'une application complète incluant binaires et base de données.
A noter la possibilité de variabiliser les arguments du déploiement par exemple le nom du serveur SQL cible ainsi que le nom de la base de données en utilisant l'argument Metadata (au bas du designer WF), confèrant encore plus de flexibilité.

Aucun commentaire: