執行 "What If" 部署

作者:Jason Lee

本主題描述如何使用 Internet Information Services (IIS) Web Deployment Tool (Web Deploy) 和 VSDBCMD,執行「假設」 (或模擬) 部署。 這可讓您在實際部署應用程式之前,先判斷部署邏輯對特定目標環境的影響。

本主題構成一系列教學課程的一部分,以名為 Fabrikam, Inc 的虛構公司企業部署需求為基礎。本教學課程系列使用範例解決方案連絡人 管理員解決方案來代表具有實際複雜層級的 Web 應用程式,包括 ASP.NET MVC 3 應用程式、Windows Communication Foundation (WCF) 服務和資料庫專案。

這些教學課程的核心部署方法是以 瞭解專案檔中所述的分割專案檔方法為基礎,其中建置和部署程式是由兩個專案檔控制,一個包含適用于每個目的地環境的組建指示,另一個包含環境特定的組建和部署設定。 在建置階段,環境特定的專案檔會合並到與環境無關的專案檔中,以形成一組完整的建置指示。

執行 Web 套件的「假設」部署

Web Deploy 包含的功能可讓您在「假設」 (或試用版) 模式中執行部署。 當您以「假設」模式部署成品時,Web Deploy 會產生記錄檔,就像您執行部署一樣,但實際上不會變更目的地伺服器上的任何專案。 檢閱記錄檔可協助您瞭解部署對目的地伺服器的影響,特別是:

  • 將新增的內容。
  • 將會更新的內容。
  • 將會刪除的內容。

因為「假設」部署實際上不會變更目的地伺服器上的任何專案,所以無法一律執行的動作是預測部署是否成功。

部署 Web 套件中所述,您可以透過兩種方式部署 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

當您滿意「試用模式」部署的結果時,您可以使用/y旗標取代/t旗標來執行即時部署:

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 檔案包含DeployToDatabase元素且值為True,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 Engine (MSBuild) 專案檔來封裝組建和部署邏輯,如瞭解專案檔中所述。 例如,在 Contact Manager 範例解決方案中, 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 Deploy 命令列語法的詳細資訊,請參閱 Web Deploy 作業設定。 如需使用 .deploy.cmd 檔案時命令列選項的指引,請參閱 如何:使用 deploy.cmd 檔案安裝部署套件。 如需 VSDBCMD 命令列語法的指引,請參閱 VSDBCMD.EXE (部署和架構匯入) 的命令列參考