共用方式為


執行「假設狀況」部署

演講者:Jason Lee

本主題介紹如何使用資訊服務 (IIS) Web 部署工具 (Web Deploy) 和 VSDBCMD 執行「假設狀況」(或模擬) 部署。 這可讓您在實際部署應用程式之前,先確定部署邏輯對特定目標環境的影響。

本主題圍繞著一家名為 Fabrikam, Inc. 的虛構公司展開,針對其企業部署需求而設計了一系列教學課程。本教學課程系列使用範例解決方案 (聯絡人管理員解決方案) 來代表具有現實複雜性的 Web 應用程式,其中包括 ASP.NET MVC 3 應用程式、Windows Communication Foundation (WCF) 服務,和資料庫專案。

這些教學課程的核心部署方法是根據「了解專案檔案」中所述的分割專案檔案方法,其中建置和部署流程由兩個專案檔案控制,一個包含適用於所有目標環境的建置指令,另一個則包含特定環境的建置和部署設定。 在建置時,特定於環境的專案檔案被合併到與環境無關的專案檔案中,以形成完整的建置指令集。

對 Web 套件執行「假設狀況」部署

Web 部署包含可讓您在「假設狀況」(或試用) 模式下執行部署的功能。 當您以「假設狀況」模式部署工件時,Web 部署會產生一個記錄檔,就好像您已執行部署一樣,但它實際上不會更改目標伺服器上的任何內容。 查看記錄檔案可以幫助您了解您的部署將對目標伺服器產生什麼影響,特別是:

  • 將新增什麼。
  • 會更新什麼。
  • 什麼會被刪除。

由於「假設狀況」部署實際上不會更改目標伺服器上的任何內容,因此它不能總是預測部署是否會成功。

部署 Web 套件中所述,您可以透過兩種方式使用 Web Deploy 來部署 Web 套件:直接使用 MSDeploy.exe 命令列公用程式或執行建置流程產生的 .deploy.cmd 檔案。

如果直接使用 MSDeploy.exe,則可以透過在命令中新增 –whatif 標幟來執行「假設狀況」部署。 例如,要評估將 ContactManager.Mvc.zip 套件部署到預備環境時會發生什麼情況,MSDeploy 命令應類似於下列內容。 請注意,以下範例使用 $CREDENTIAL_PLACEHOLDER$ 作為密碼鍵值對的預留位置:

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

當您對「假設狀況」部署的結果感到滿意時,可以刪除 –whatif 標幟來執行即時部署。

注意

有關 MSDeploy.exe 命令列選項的詳細資訊,請參閱「Web 部署操作設定」。

如果您使用 .deploy.cmd 檔案,則可以透過在命令中包含 /t 標幟 (試用模式) 而不是 /y 標幟 (「是」或更新模式) 來執行「假設狀況」部署。 例如,要評估透過執行 .deploy.cmd 檔案部署 ContactManager.Mvc.zip 套件會發生什麼情況,您的命令應類似於以下內容:

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

當您對「試用模式」部署的結果感到滿意時,可以將 /t 標幟替換為 /y 標幟以執行即時部署:

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

注意

有關 .deploy.cmd 檔案的命令列選項的詳細資訊,請參閱「作法:使用deploy.cmd 檔案安裝部署套件」。 如果執行 .deploy.cmd 檔案而不指定任何標幟,命令提示字元將顯示可用標幟的清單。

對資料庫執行「假設狀況」部署

本部分假設您使用 VSDBCMD 公用程式來執行增量、基於架構的資料庫部署。 這種方法在「部署資料庫專案」中有更詳細的描述。 建議您在應用此處描述的概念之前先熟悉本主題。

部署模式下使用 VSDBCMD 時,可以使用 /dd (或 /DeployToDatabase) 標幟來控制 VSDBCMD 是實際部署資料庫還是僅產生部署指令碼。 如果您要部署 .dbschema 檔案,則行為如下:

  • 如果指定 /dd+/dd,VSDBCMD 將產生部署指令碼並部署資料庫。
  • 如果指定 /dd- 或省略該開關,VSDBCMD 將僅產生部署指令碼。

注意

如果您要部署 .deploymanifest 檔案而不是 .dbschema 文件,則 /dd 開關的行為要複雜得多。 本質上,如果 .deploymanifest 檔案包含值為 TrueDeployToDatabase 元素,VSDBCMD 將忽略 /dd 開關的值。 部署資料庫專案完整地描述了這種行為。

例如,要為 ContactManager 資料庫生成部署指令碼而不實際部署資料庫,您的 VSDBCMD 命令應類似於以下內容:

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 是一種差異資料庫部署工具,因此動態產生部署指令碼,以包含將目前資料庫 (如果存在) 更新到指定架構所需的所有 SQL 命令。 審查部署指令碼是一種實用的方法,可以幫助您確定部署對目前資料庫及其資料的影響。 例如,您可能想要確定:

  • 是否會刪除任何現有資料表,以及這是否會導致資料遺失。
  • 操作順序是否有資料遺失的風險,例如,如果您要拆分或合併資料表。

如果您對部署指令碼感到滿意,則可以使用 /dd+ 標幟重複 VSDBCMD 來進行變更。 或者,您可以編輯部署指令碼以滿足您的要求,然後在資料庫伺服器上手動執行。

將「假設狀況」功能整合到自訂專案文件中

在更複雜的部署方案中,您需要使用自訂 Microsoft Build 引擎 (MSBuild) 專案檔案來封裝建置和部署邏輯,如「了解專案檔案」中所述。 例如,在「聯絡人管理員」範例解決方案中,Publish.proj 檔案:

  • 建置解決方案。
  • 使用 Web Deploy 封裝和部署 ContactManager.Mvc 應用程式。
  • 使用 Web Deploy 封裝和部署 ContactManager.Service 應用程式。
  • 部署 ContactManager 資料庫。

當您以這種方式將多個 Web 套件和/或資料庫的部署整合到單一步驟程序中時,您可能還需要選擇以「假設狀況」模式執行整個部署。

Publish.proj 檔案示範如何執行此操作。 首先,您需要建立一個屬性來儲存「假設狀況」值:

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

在本例中,您建立了一個名為 WhatIf 的屬性,其預設值為 False。 使用者可以透過在命令列參數中將該屬性設為 True 來覆寫此值,您稍後將看到此操作。

下一階段是參數化所有 Web Deploy 和 VSDBCMD 指令,以便標幟反映 WhatIf 屬性值。 例如,下一個目標 (取自 Publish.proj 檔案並進行簡化) 執行 .deploy.cmd 檔案來部署 Web 套件。 預設情況下,此指令包含 /Y 開關 (「是」或更新模式)。 如果 WhatIf 設定為 True,則將替換為 /T 開關 (試用或「假設狀況」模式)。

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

同樣,下一個目標使用 VSDBCMD 公用程式來部署資料庫。 預設情況下,不包括 /dd 開關。 這代表 VSDBCMD 將產生部署指令碼,但不會部署資料庫,換句話說,這是一個「假設狀況」場景。 如果 WhatIf 屬性未設為 True,則會新增 /dd 開關,並且 VSDBCMD 將部署資料庫。

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

您可以使用相同的方法來參數化專案文件中的所有相關命令。 當您想要執行「假設狀況」部署時,您可以簡單地從命令列提供 WhatIf 屬性值:

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

透過這種方式,您可以透過一個步驟對所有專案元件執行「假設狀況」部署。

結論

本主題介紹如何使用 Web Deploy、VSDBCMD 和 MSBuild 執行「假設狀況」部署。 透過「假設狀況」部署,您可以在對目標環境實際進行任何變更之前評估建議的部署的影響。

深入閱讀

有關 Web 部署命令列語法的更多資訊,請參閱「Web 部署操作設定」。 有關使用 .deploy.cmd 檔案時的命令列選項的指導,請參閱「作法:使用 deploy.cmd 檔案安裝部署套件」。 有關 VSDBCMD 命令列語法的指南,請參閱「VSDBCMD.EXE 的命令列參考 (部署和結構描述匯入) 」。