Durchführen einer simulierten Bereitstellung

von Jason Lee

In diesem Thema wird beschrieben, wie Sie "Was-wäre-wenn"-Bereitstellungen (oder simulierte) mit dem Internetinformationsdienste-Webbereitstellungstool (Web Deploy) und VSDBCMD durchführen. Auf diese Weise können Sie die Auswirkungen Ihrer Bereitstellungslogik auf eine bestimmte Zielumgebung bestimmen, bevor Sie Ihre Anwendung tatsächlich bereitstellen.

Dieses Thema ist Teil einer Reihe von Tutorials, die sich auf die Unternehmensbereitstellungsanforderungen eines fiktiven Unternehmens namens Fabrikam, Inc. beziehen. In dieser Tutorialreihe wird eine Beispiellösung – die Contact Manager-Lösung – verwendet, um eine Webanwendung mit einem realistischen Komplexitätsgrad darzustellen, einschließlich einer ASP.NET MVC 3-Anwendung, eines WCF-Diensts (Windows Communication Foundation) und eines Datenbankprojekts.

Die Bereitstellungsmethode im Mittelpunkt dieser Tutorials basiert auf dem unter Grundlegendes zur Projektdatei beschriebenen Ansatz für geteilte Projektdateien, bei dem der Build- und Bereitstellungsprozess von zwei Projektdateien gesteuert wird– eine mit Buildanweisungen, die für jede Zielumgebung gelten, und eine mit umgebungsspezifischen Build- und Bereitstellungseinstellungen. Zur Buildzeit wird die umgebungsspezifische Projektdatei in die umgebungsunabhängige Projektdatei zusammengeführt, um einen vollständigen Satz von Buildanweisungen zu bilden.

Durchführen einer Was-wäre-wenn-Bereitstellung für Webpakete

Web Deploy enthält Funktionen, mit denen Sie Bereitstellungen im Was-wäre-wenn-Modus (oder Testmodus) durchführen können. Wenn Sie Artefakte im Was-wenn-Modus bereitstellen, generiert Web Deploy eine Protokolldatei, als ob Sie die Bereitstellung durchgeführt hätten, aber es ändert nichts auf dem Zielserver. Die Überprüfung der Protokolldatei kann Ihnen helfen, zu verstehen, welche Auswirkungen Ihre Bereitstellung auf den Zielserver haben wird, insbesondere:

  • Was hinzugefügt wird.
  • Was aktualisiert wird.
  • Was gelöscht wird.

Da eine Was-wäre-wenn-Bereitstellung nichts auf dem Zielserver ändert, ist es nicht immer möglich, vorherzusagen, ob eine Bereitstellung erfolgreich ist.

Wie unter Bereitstellen von Webpaketen beschrieben, können Sie Webpakete mithilfe von Web Deploy auf zwei Arten bereitstellen: indem Sie das Befehlszeilenprogramm MSDeploy.exe direkt verwenden oder die vom Buildprozess generierte Datei .deploy.cmd ausführen.

Wenn Sie MSDeploy.exe direkt verwenden, können Sie eine Was-wäre-wenn-Bereitstellung ausführen, indem Sie ihrem Befehl das Flag –whatif hinzufügen. Um beispielsweise auszuwerten, was passieren würde, wenn Sie das ContactManager.Mvc.zip-Paket in einer Stagingumgebung bereitgestellt hätten, sollte der MSDeploy-Befehl wie folgt aussehen. Beachten Sie, dass im folgenden Beispiel $CREDENTIAL_PLACEHOLDER$ als Platzhalter für das Kennwortschlüssel-Wert-Paar verwendet wird:

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

Wenn Sie mit den Ergebnissen Ihrer Was-wäre-wenn-Bereitstellung zufrieden sind, können Sie das Flag –whatif entfernen, um eine Livebereitstellung auszuführen.

Hinweis

Weitere Informationen zu Befehlszeilenoptionen für MSDeploy.exe finden Sie unter Web Deploy-Vorgangseinstellungen.

Wenn Sie die Datei ".deploy.cmd " verwenden, können Sie eine Was-wäre-wenn-Bereitstellung ausführen, indem Sie das Flag /t (Testmodus) anstelle des Flags /y ("ja" oder Updatemodus) in Ihren Befehl einfügen. Um z. B. auszuwerten, was passieren würde, wenn Sie das ContactManager.Mvc.zip-Paket bereitstellen, indem Sie die Datei .deploy.cmd ausführen, sollte Ihr Befehl wie folgt aussehen:

ContactManager.Mvc.deploy.cmd /t /m:TESTWEB1 /a:NTLM

Wenn Sie mit den Ergebnissen Ihrer Bereitstellung im Testmodus zufrieden sind, können Sie das Flag /t durch ein /y-Flag ersetzen, um eine Livebereitstellung auszuführen:

ContactManager.Mvc.deploy.cmd /y /m:TESTWEB1 /a:NTLM

Hinweis

Weitere Informationen zu Befehlszeilenoptionen für .deploy.cmd-Dateien finden Sie unter Vorgehensweise: Installieren eines Bereitstellungspakets mithilfe der Datei deploy.cmd. Wenn Sie die Datei .deploy.cmd ausführen, ohne Flags anzugeben, zeigt die Eingabeaufforderung eine Liste der verfügbaren Flags an.

Ausführen einer Was-wäre-wenn-Bereitstellung für Datenbanken

In diesem Abschnitt wird davon ausgegangen, dass Sie das Hilfsprogramm VSDBCMD verwenden, um eine inkrementelle, schemabasierte Datenbankbereitstellung durchzuführen. Dieser Ansatz wird unter Bereitstellen von Datenbankprojekten ausführlicher beschrieben. Es wird empfohlen, sich mit diesem Thema vertraut zu machen, bevor Sie die hier beschriebenen Konzepte anwenden.

Wenn Sie VSDBCMD im Bereitstellungsmodus verwenden, können Sie das Flag /dd (oder /DeployToDatabase) verwenden, um zu steuern, ob VSDBCMD die Datenbank tatsächlich bereitstellt oder nur ein Bereitstellungsskript generiert. Wenn Sie eine DBSCHEMA-Datei bereitstellen, ist dies das folgende Verhalten:

  • Wenn Sie /dd+ oder /dd angeben, generiert VSDBCMD ein Bereitstellungsskript und stellt die Datenbank bereit.
  • Wenn Sie /dd- angeben oder den Schalter weglassen, generiert VSDBCMD nur ein Bereitstellungsskript.

Hinweis

Wenn Sie eine DEPLOYMANIFEST-Datei anstelle einer DBSCHEMA-Datei bereitstellen, ist das Verhalten des / dd-Schalters viel komplizierter. Im Wesentlichen ignoriert VSDBCMD den Wert des / dd-Schalters , wenn die DEPLOYMANIFEST-Datei ein DeployToDatabase-Element mit dem Wert True enthält. Das Bereitstellen von Datenbankprojekten beschreibt dieses Verhalten vollständig.

Wenn Sie beispielsweise ein Bereitstellungsskript für die ContactManager-Datenbank generieren möchten, ohne die Datenbank tatsächlich bereitzustellen, sollte Ihr VSDBCMD-Befehl wie folgt aussehen:

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 ist ein differenzielles Datenbankbereitstellungstool, und daher wird das Bereitstellungsskript dynamisch generiert, um alle SQL-Befehle zu enthalten, die erforderlich sind, um die aktuelle Datenbank (sofern vorhanden) auf das angegebene Schema zu aktualisieren. Das Überprüfen des Bereitstellungsskripts ist eine nützliche Möglichkeit, um zu bestimmen, welche Auswirkungen Ihre Bereitstellung auf die aktuelle Datenbank und die darin enthaltenen Daten hat. Sie können beispielsweise Folgendes ermitteln:

  • Gibt an, ob vorhandene Tabellen entfernt werden und ob dies zu Datenverlusten führt.
  • Gibt an, ob die Reihenfolge der Vorgänge das Risiko eines Datenverlusts birgt, z. B. wenn Sie Tabellen aufteilen oder zusammenführen.

Wenn Sie mit dem Bereitstellungsskript zufrieden sind, können Sie die VSDBCMD mit dem Flag /dd+ wiederholen, um die Änderungen vorzunehmen. Alternativ können Sie das Bereitstellungsskript entsprechend Ihren Anforderungen bearbeiten und es dann manuell auf dem Datenbankserver ausführen.

Integrieren der Was-wäre-wenn-Funktionalität in benutzerdefinierte Projektdateien

In komplexeren Bereitstellungsszenarien sollten Sie eine benutzerdefinierte Microsoft-Build-Engine-Projektdatei (MSBuild) verwenden, um Ihre Build- und Bereitstellungslogik zu kapseln, wie unter Grundlegendes zur Projektdatei beschrieben. Beispiel: In der Contact Manager-Beispiellösung die Datei Publish.proj :

  • Erstellt die Projektmappe.
  • Verwendet Web Deploy, um die ContactManager.Mvc-Anwendung zu packen und bereitzustellen.
  • Verwendet Web Deploy, um die ContactManager.Service-Anwendung zu packen und bereitzustellen.
  • Stellt die ContactManager-Datenbank bereit.

Wenn Sie die Bereitstellung mehrerer Webpakete und/oder Datenbanken auf diese Weise in einen einstufigen Prozess integrieren, können Sie auch die Möglichkeit haben, die gesamte Bereitstellung im Was-wäre-wenn-Modus durchzuführen.

Die Datei Publish.proj veranschaulicht, wie Sie dies tun können. Zunächst müssen Sie eine Eigenschaft erstellen, um den Was-wäre-wenn-Wert zu speichern:

<PropertyGroup>
  <WhatIf Condition=" '$(WhatIf)'=='' ">false</WhatIf>
</PropertyGroup>

In diesem Fall haben Sie eine Eigenschaft mit dem Namen WhatIf mit dem Standardwert false erstellt. Benutzer können diesen Wert überschreiben, indem sie die Eigenschaft in einem Befehlszeilenparameter auf true festlegen, wie Sie in Kürze sehen werden.

Die nächste Phase besteht darin, alle Web Deploy- und VSDBCMD-Befehle so zu parametrisieren, dass die Flags den WhatIf-Eigenschaftswert widerspiegeln. Beispielsweise führt das nächste Ziel (aus der Datei Publish.proj und vereinfacht) die Datei .deploy.cmd aus, um ein Webpaket bereitzustellen. Standardmäßig enthält der Befehl den Schalter /Y ("ja", oder Updatemodus). Wenn WhatIf auf true festgelegt ist, wird dies durch einen /T-Schalter (Testmodus oder "Was-wäre-wenn"-Modus) ersetzt.

<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>

Ebenso verwendet das nächste Ziel das Hilfsprogramm VSDBCMD, um eine Datenbank bereitzustellen. Standardmäßig ist ein /dd-Schalter nicht enthalten. Dies bedeutet, dass VSDBCMD ein Bereitstellungsskript generiert, aber nicht die Datenbank bereitstellt, d. h. ein Was-wäre-wenn-Szenario. Wenn die WhatIf-Eigenschaft nicht auf true festgelegt ist, wird ein /dd-Schalter hinzugefügt, und VSDBCMD stellt die Datenbank bereit.

<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>

Sie können denselben Ansatz verwenden, um alle relevanten Befehle in Ihrer Projektdatei zu parametrisieren. Wenn Sie eine Was-wenn-Bereitstellung ausführen möchten, können Sie einfach einen WhatIf-Eigenschaftswert über die Befehlszeile angeben:

MSBuild.exe Publish.proj /p:WhatIf=true;TargetEnvPropsFile=EnvConfig\Env-Dev.proj

Auf diese Weise können Sie eine Was-wäre-wenn-Bereitstellung für alle Ihre Projektkomponenten in einem einzigen Schritt ausführen.

Zusammenfassung

In diesem Thema wurde beschrieben, wie Sie "Was-wäre-wenn"-Bereitstellungen mit Web Deploy, VSDBCMD und MSBuild ausführen. Mit einer Was-wäre-wenn-Bereitstellung können Sie die Auswirkungen einer vorgeschlagenen Bereitstellung bewerten, bevor Sie tatsächlich Änderungen an der Zielumgebung vornehmen.

Weitere Informationen

Weitere Informationen zur Web Deploy-Befehlszeilensyntax finden Sie unter Web Deploy-Vorgangseinstellungen. Anleitungen zu Befehlszeilenoptionen bei verwendung der Datei .deploy.cmd finden Sie unter Vorgehensweise: Installieren eines Bereitstellungspakets mithilfe der Datei deploy.cmd. Eine Anleitung zur VSDBCMD-Befehlszeilensyntax finden Sie unter Befehlszeilenreferenz für VSDBCMD.EXE (Bereitstellung und Schemaimport).