Exécution d’un déploiement « What If »

par Jason Lee

Cette rubrique explique comment effectuer des déploiements « si » (ou simulés) à l’aide de l’outil de déploiement web IIS (Internet Information Services) (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 réellement votre application.

Cette rubrique fait partie d’une série de didacticiels 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ée 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 , un contenant des instructions de génération qui s’appliquent à chaque environnement de destination et un qui contient 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 en fait 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.
  • Ce qui sera supprimé.

Étant donné qu’un déploiement « what if » ne modifie pas réellement quoi que ce soit sur le serveur de destination, ce qu’il ne peut pas toujours faire est de prédire si un déploiement réussit.

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 : à l’aide de l’utilitaire de ligne de commande MSDeploy.exe directement 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 avez déployé 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.

Note

Pour plus d’informations sur les options de ligne de commande pour MSDeploy.exe, consultez Paramètres des opérations 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 avez déployé 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 « 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

Note

Pour plus d’informations sur les options de ligne de commande des 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’indicateurs, l’invite de commandes affiche une liste d’indicateurs disponibles.

Exécution d’un déploiement « What If » pour les bases de données

Cette section part du principe que vous utilisez l’utilitaire VSDBCMD pour effectuer un déploiement de base de données incrémentielle basé sur un schéma. Cette approche est décrite plus en détail dans le 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, voici ce qui se passe :

  • 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 uniquement un script de déploiement.

Note

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 en totalité.

Par exemple, pour générer un script de déploiement pour la base de données ContactManager sans réellement déployer 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. 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 active, 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’il 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.
  • Si l’ordre des opérations comporte un risque de perte de données, par exemple, si vous divisez ou fusionnez 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 fonctionnalités « What If » dans des fichiers projet personnalisés

Dans des scénarios de déploiement plus complexes, vous devez utiliser un fichier projet Microsoft Build Engine (MSBuild) personnalisé 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 choisir 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 une valeur par défaut de 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 bientôt.

L’étape suivante consiste à paramétrer toutes 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 le mode de mise à jour). Si WhatIf est défini sur true, il est remplacé par un commutateur /T (mode d’essai ou mode « 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, en d’autres termes, un scénario « what if ». Si la propriété WhatIf n’est pas définie sur 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 vos composants de projet en une seule étape.

Conclusion

Cette rubrique a 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.

Lectures complémentaires

Pour plus d’informations sur la syntaxe de ligne de commande Web Deploy, consultez Paramètres des opérations de déploiement web. 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 Command-Line Référence pour VSDBCMD.EXE (Déploiement et importation de schéma).