执行“What If”部署

作者 :Jason Lee

本主题介绍如何使用 Internet Information Services (IIS) Web 部署工具 (Web 部署) 和 VSDBCMD (或模拟) 部署执行“what if”。 这使你可以在实际部署应用程序之前确定部署逻辑对特定目标环境的影响。

本主题是一系列教程的一部分,这些教程基于名为 Fabrikam, Inc 的虚构公司的企业部署要求。本教程系列使用示例解决方案( Contact Manager 解决方案)来表示具有实际复杂程度的 Web 应用程序,包括 ASP.NET MVC 3 应用程序、Windows Communication Foundation (WCF) 服务和数据库项目。

这些教程的核心部署方法基于了解项目文件中所述的拆分 项目文件方法,其中生成和部署过程由两个项目文件控制,一个项目文件包含适用于每个目标环境的生成说明,另一个包含特定于环境的生成和部署设置。 在生成时,特定于环境的项目文件将合并到与环境无关的项目文件中,以形成一组完整的生成说明。

对 Web 包执行“What If”部署

Web 部署包括允许在“假设” (或试用) 模式下执行部署的功能。 在“what if”模式下部署项目时,Web 部署会生成一个日志文件,就像执行部署一样,但它实际上不会更改目标服务器上的任何内容。 查看日志文件有助于了解部署对目标服务器的影响,特别是:

  • 将添加的内容。
  • 将更新的内容。
  • 将删除的内容。

由于“假设”部署实际上不会更改目标服务器上的任何内容,因此它不能始终预测部署是否成功。

部署 Web 包中所述,可以通过两种方式使用 Web 部署来部署 Web 包:直接使用 MSDeploy.exe 命令行实用工具或运行生成过程生成的 .deploy.cmd 文件。

如果直接使用 MSDeploy.exe,可以通过向命令添加 –whatif 标志来运行“what if”部署。 例如,若要评估将 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

如果对“what if”部署的结果感到满意,可以删除 –whatif 标志以运行实时部署。

注意

有关MSDeploy.exe的命令行选项的详细信息,请参阅 Web 部署操作设置

如果使用 .deploy.cmd 文件,可以通过在命令中包含 /t 标志 (试用模式) 标志而不是 /y 标志 (“是”,或更新模式) 来运行“what if”部署。 例如,若要评估通过运行 .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 文件,命令提示符将显示可用标志的列表。

对数据库执行“What If”部署

本部分假定使用 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 以进行更改。 或者,可以编辑部署脚本以满足要求,然后在数据库服务器上手动执行。

将“What If”功能集成到自定义项目文件中

在更复杂的部署方案中,需要使用自定义Microsoft 生成引擎 (MSBuild) 项目文件来封装生成和部署逻辑,如了解项目文件中所述。 例如,在 Contact Manager 示例解决方案中, Publish.proj 文件:

  • 生成解决方案。
  • 使用 Web 部署打包和部署 ContactManager.Mvc 应用程序。
  • 使用 Web 部署打包和部署 ContactManager.Service 应用程序。
  • 部署 ContactManager 数据库。

以这种方式将多个 Web 包和/或数据库的部署集成到单步过程中时,可能还需要在“what if”模式下执行整个部署的选项。

Publish.proj 文件演示了如何执行此操作。 首先,需要创建一个属性来存储“what if”值:

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

在本例中,已创建一个名为 WhatIf 的属性,其默认值为 false。 用户可以通过在命令行参数中将 属性设置为 true 来替代此值,稍后你将看到。

下一阶段是参数化任何 Web 部署和 VSDBCMD 命令,以便标志反映 WhatIf 属性值。 例如,下一个目标 (取自 Publish.proj 文件,简化) 运行 .deploy.cmd 文件以部署 Web 包。 默认情况下,命令包含 / Y 开关 (“yes”或更新模式) 。 如果 WhatIf 设置为 true,则替换为 试用 (/T 开关,或) “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>

同样,下一个目标使用 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>

可以使用同一方法参数化项目文件中的所有相关命令。 当想要运行“what if”部署时,只需从命令行提供 WhatIf 属性值即可:

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

通过这种方式,只需一个步骤即可为所有项目组件运行“what if”部署。

结论

本主题介绍了如何使用 Web 部署、VSDBCMD 和 MSBuild 运行“what if”部署。 通过“what if”部署,可以在实际对目标环境进行任何更改之前评估建议部署的影响。

深入阅读

有关 Web 部署命令行语法的详细信息,请参阅 Web 部署操作设置。 有关使用 .deploy.cmd 文件时的命令行选项的指南,请参阅 如何:使用 deploy.cmd 文件安装部署包。 有关 VSDBCMD 命令行语法的指导,请参阅 命令行参考VSDBCMD.EXE (部署和架构导入)