Exécution d’un déploiement « Scénario »
par Jason Lee
Cette rubrique explique comment effectuer des déploiements « what if » (ou simulés) à l’aide de l’outil de déploiement web iis (Web Deploy) et VSDBCMD. Cela vous permet de déterminer les effets de votre logique de déploiement sur un environnement cible particulier avant de déployer votre application.
Cette rubrique fait partie d’une série de tutoriels basés sur les exigences de déploiement d’entreprise d’une société fictive nommée Fabrikam, Inc. Cette série de tutoriels utilise un exemple de solution, la solution Gestionnaire de contacts, pour représenter une application web avec un niveau de complexité réaliste, notamment une application ASP.NET MVC 3, un service Windows Communication Foundation (WCF) et un projet de base de données.
La méthode de déploiement au cœur de ces didacticiels est basée sur l’approche de fichier projet fractionné décrite dans Présentation du fichier projet, dans laquelle le processus de génération et de déploiement est contrôlé par deux fichiers projet : l’un contenant des instructions de génération qui s’appliquent à chaque environnement de destination et l’autre contenant des paramètres de build et de déploiement spécifiques à l’environnement. Au moment de la génération, le fichier projet spécifique à l’environnement est fusionné dans le fichier projet indépendant de l’environnement pour former un ensemble complet d’instructions de génération.
Exécution d’un déploiement « What If » pour les packages web
Web Deploy inclut des fonctionnalités qui vous permettent d’effectuer des déploiements en mode « what if » (ou version d’évaluation). Lorsque vous déployez des artefacts en mode « what if », Web Deploy génère un fichier journal comme si vous aviez effectué le déploiement, mais il ne change rien sur le serveur de destination. L’examen du fichier journal peut vous aider à comprendre l’impact de votre déploiement sur le serveur de destination, en particulier :
- Ce qui sera ajouté.
- Ce qui sera mis à jour.
- Éléments qui seront supprimés.
Étant donné qu’un déploiement « what if » ne change rien sur le serveur de destination, il ne peut pas toujours prédire si un déploiement réussira.
Comme décrit dans Déploiement de packages web, vous pouvez déployer des packages web à l’aide de Web Deploy de deux manières : en utilisant directement l’utilitaire de ligne de commande MSDeploy.exe ou en exécutant le fichier .deploy.cmd généré par le processus de génération.
Si vous utilisez MSDeploy.exe directement, vous pouvez exécuter un déploiement « what if » en ajoutant l’indicateur –whatif à votre commande. Par exemple, pour évaluer ce qui se passerait si vous déployiez le package ContactManager.Mvc.zip dans un environnement intermédiaire, la commande MSDeploy doit ressembler à ce qui suit. Notez que l’exemple suivant utilise $CREDENTIAL_PLACEHOLDER$ comme espace réservé pour la paire clé-valeur de mot de passe :
MSDeploy.exe
-whatif
-source:package="[path]\ContactManager.Mvc.zip"
-dest:auto,
computerName="https://stageweb1:8172/MSDeploy.axd?site=DemoSite",
username="FABRIKAM\stagingdeployer",
password=$CREDENTIAL_PLACEHOLDER$,
authtype="Basic",
includeAcls="False"
-verb:sync
-disableLink:AppPoolExtension
-disableLink:ContentExtension
-disableLink:CertificateExtension
-setParamFile:"[path]\ContactManager.Mvc.SetParameters.xml"
-allowUntrusted
Lorsque vous êtes satisfait des résultats de votre déploiement « what if », vous pouvez supprimer l’indicateur –whatif pour exécuter un déploiement en direct.
Notes
Pour plus d’informations sur les options de ligne de commande pour MSDeploy.exe, consultez Paramètres d’opération de déploiement web.
Si vous utilisez le fichier .deploy.cmd , vous pouvez exécuter un déploiement « what if » en incluant l’indicateur /t (mode d’évaluation) au lieu de l’indicateur /y (« oui », ou le mode de mise à jour) dans votre commande. Par exemple, pour évaluer ce qui se passerait si vous déployiez le package ContactManager.Mvc.zip en exécutant le fichier .deploy.cmd , votre commande doit ressembler à ceci :
ContactManager.Mvc.deploy.cmd /t /m:TESTWEB1 /a:NTLM
Lorsque vous êtes satisfait des résultats de votre déploiement en « mode d’évaluation », vous pouvez remplacer l’indicateur /t par un indicateur /y pour exécuter un déploiement en direct :
ContactManager.Mvc.deploy.cmd /y /m:TESTWEB1 /a:NTLM
Notes
Pour plus d’informations sur les options de ligne de commande pour les fichiers .deploy.cmd , consultez Guide pratique pour installer un package de déploiement à l’aide du fichier deploy.cmd. Si vous exécutez le fichier .deploy.cmd sans spécifier d’indicateur, l’invite de commandes affiche la liste des indicateurs disponibles.
Exécution d’un déploiement « What If » pour les bases de données
Cette section suppose que vous utilisez l’utilitaire VSDBCMD pour effectuer un déploiement incrémentiel de base de données basé sur un schéma. Cette approche est décrite plus en détail dans Déploiement de projets de base de données. Nous vous recommandons de vous familiariser avec cette rubrique avant d’appliquer les concepts décrits ici.
Lorsque vous utilisez VSDBCMD en mode Déploiement , vous pouvez utiliser l’indicateur /dd (ou /DeployToDatabase) pour contrôler si VSDBCMD déploie réellement la base de données ou génère simplement un script de déploiement. Si vous déployez un fichier .dbschema, il s’agit du comportement suivant :
- Si vous spécifiez /dd+ ou /dd, VSDBCMD génère un script de déploiement et déploie la base de données.
- Si vous spécifiez /dd- ou omettez le commutateur, VSDBCMD génère un script de déploiement uniquement.
Notes
Si vous déployez un fichier .deploymanifest plutôt qu’un fichier .dbschema, le comportement du commutateur /dd est beaucoup plus compliqué. Essentiellement, VSDBCMD ignore la valeur du commutateur /dd si le fichier .deploymanifest inclut un élément DeployToDatabase avec la valeur True. Le déploiement de projets de base de données décrit ce comportement dans son intégralité.
Par exemple, pour générer un script de déploiement pour la base de données ContactManager sans déployer réellement la base de données, votre commande VSDBCMD doit ressembler à ceci :
vsdbcmd.exe /a:Deploy
/manifest:"…\ContactManager.Database.deploymanifest"
/cs:"Data Source=TESTDB1;Integrated Security=true"
/p:TargetDatabase=ContactManager
/dd-
/script:"…\Publish-ContactManager-Db.sql"
VSDBCMD est un outil de déploiement de base de données différentielle et, par conséquent, le script de déploiement est généré dynamiquement pour contenir toutes les commandes SQL nécessaires pour mettre à jour la base de données actuelle, le cas échéant, vers le schéma spécifié. L’examen du script de déploiement est un moyen utile de déterminer l’impact de votre déploiement sur la base de données actuelle et les données qu’elle contient. Par exemple, vous souhaiterez peut-être déterminer :
- Indique si des tables existantes seront supprimées et si cela entraînera une perte de données.
- Indique si l’ordre des opérations comporte un risque de perte de données, par exemple, si vous fractionner ou fusionner des tables.
Si vous êtes satisfait du script de déploiement, vous pouvez répéter vsDBCMD avec un indicateur /dd+ pour apporter les modifications. Vous pouvez également modifier le script de déploiement pour répondre à vos besoins, puis l’exécuter manuellement sur le serveur de base de données.
Intégration de la fonctionnalité « What If » dans des fichiers projet personnalisés
Dans les scénarios de déploiement plus complexes, vous souhaiterez utiliser un fichier projet Microsoft Build Engine personnalisé (MSBuild) pour encapsuler votre logique de génération et de déploiement, comme décrit dans Présentation du fichier projet. Par exemple, dans l’exemple de solution gestionnaire de contacts, le fichier Publish.proj :
- Génère la solution.
- Utilise Web Deploy pour empaqueter et déployer l’application ContactManager.Mvc.
- Utilise Web Deploy pour empaqueter et déployer l’application ContactManager.Service.
- Déploie la base de données ContactManager .
Lorsque vous intégrez le déploiement de plusieurs packages web et/ou bases de données dans un processus en une seule étape de cette façon, vous pouvez également avoir la possibilité d’effectuer l’ensemble du déploiement en mode « what if ».
Le fichier Publish.proj montre comment procéder. Tout d’abord, vous devez créer une propriété pour stocker la valeur « what if » :
<PropertyGroup>
<WhatIf Condition=" '$(WhatIf)'=='' ">false</WhatIf>
</PropertyGroup>
Dans ce cas, vous avez créé une propriété nommée WhatIf avec la valeur par défaut false. Les utilisateurs peuvent remplacer cette valeur en définissant la propriété sur true dans un paramètre de ligne de commande, comme vous le verrez sous peu.
L’étape suivante consiste à paramétrer les commandes Web Deploy et VSDBCMD afin que les indicateurs reflètent la valeur de la propriété WhatIf . Par exemple, la cible suivante (extraite du fichier Publish.proj et simplifiée) exécute le fichier .deploy.cmd pour déployer un package web. Par défaut, la commande inclut un commutateur /Y (« oui » ou mode de mise à jour). Si WhatIf est défini sur true, il est remplacé par un commutateur /T (version d’évaluation ou « what if »).
<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">
<PropertyGroup>
<_WhatIfSwitch>/Y</_WhatIfSwitch>
<_WhatIfSwitch Condition=" '$(WhatIf)'=='true' ">/T</_WhatIfSwitch>
<_Cmd>%(PublishPackages.FullPath) $(_WhatifSwitch)
/M:$(MSDeployComputerName)
/U:$(MSDeployUsername)
/P:$(MSDeployPassword)
/A:$(MSDeployAuth)
%(PublishPackages.AdditionalMSDeployParameters)
</_Cmd>
</PropertyGroup>
<Exec Command="$(_Cmd)"/>
</Target>
De même, la cible suivante utilise l’utilitaire VSDBCMD pour déployer une base de données. Par défaut, un commutateur /dd n’est pas inclus. Cela signifie que VSDBCMD génère un script de déploiement, mais ne déploie pas la base de données, c’est-à-dire un scénario « what if ». Si la propriété WhatIf n’a pas la valeur true, un commutateur /dd est ajouté et VSDBCMD déploie la base de données.
<Target Name="PublishDbPackages" Outputs="%(DbPublishPackages.Identity)">
<PropertyGroup>
<_DbDeployOrScript></_DbDeployOrScript>
<_DbDeployOrScript Condition=" '$(Whatif)'!='true' ">/dd</_DbDeployOrScript>
<_Cmd>"$(VsdbCmdExe)" /a:Deploy
/cs:"%(DbPublishPackages.DatabaseConnectionString)"
/p:TargetDatabase=%(DbPublishPackages.TargetDatabase)
/manifest:"%(DbPublishPackages.FullPath)"
/script:"$(_CmDbScriptPath)"
$(_DbDeployOrScript)
</_Cmd>
</PropertyGroup>
<Exec Command="$(_Cmd)"/>
</Target>
Vous pouvez utiliser la même approche pour paramétrer toutes les commandes pertinentes dans votre fichier projet. Lorsque vous souhaitez exécuter un déploiement « what if », vous pouvez simplement fournir une valeur de propriété WhatIf à partir de la ligne de commande :
MSBuild.exe Publish.proj /p:WhatIf=true;TargetEnvPropsFile=EnvConfig\Env-Dev.proj
De cette façon, vous pouvez exécuter un déploiement « what if » pour tous les composants de votre projet en une seule étape.
Conclusion
Cette rubrique décrit comment exécuter des déploiements « what if » à l’aide de Web Deploy, VSDBCMD et MSBuild. Un déploiement « what if » vous permet d’évaluer l’impact d’un déploiement proposé avant d’apporter des modifications à l’environnement de destination.
En savoir plus
Pour plus d’informations sur la syntaxe de ligne de commande Web Deploy, consultez Paramètres de l’opération Web Deploy. Pour obtenir des conseils sur les options de ligne de commande lorsque vous utilisez le fichier .deploy.cmd , consultez Guide pratique pour installer un package de déploiement à l’aide du fichier deploy.cmd. Pour obtenir des conseils sur la syntaxe de ligne de commande VSDBCMD, consultez Référence de ligne de commande pour VSDBCMD.EXE (déploiement et importation de schémas).