部署特定生成
作者 :Jason Lee
本主题介绍如何将 Web 包和数据库脚本从特定的先前版本部署到新目标,例如过渡环境或生产环境。
本主题是一系列教程的一部分,这些教程基于名为 Fabrikam, Inc 的虚构公司的企业部署要求。本教程系列使用示例解决方案( Contact Manager 解决方案)来表示具有实际复杂程度的 Web 应用程序,包括 ASP.NET MVC 3 应用程序、Windows Communication Foundation (WCF) 服务和数据库项目。
这些教程的核心部署方法基于了解项目文件中所述的拆分 项目文件方法,其中生成和部署过程由两个项目文件控制,一个项目文件包含适用于每个目标环境的生成说明,另一个包含特定于环境的生成和部署设置。 在生成时,特定于环境的项目文件将合并到与环境无关的项目文件中,以形成一组完整的生成说明。
任务概述
到目前为止,本教程集中的主题一直侧重于如何在单步或自动化过程中生成、打包和部署 Web 应用程序和数据库。 但是,在某些常见方案中,需要从放置文件夹中的生成列表选择部署的资源。 换句话说,最新版本可能不是要部署的生成。
请考虑上 一主题创建支持部署的生成定义中所述的持续集成 (CI) 方案。 已在 Team Foundation Server (TFS) 2010 中创建生成定义。 每次开发人员将代码签入 TFS 时,Team Build 都会生成代码,在生成过程中创建 Web 包和数据库脚本,运行任何单元测试,并将资源部署到测试环境。 根据创建生成定义时配置的保留策略,TFS 将保留一定数量的以前的生成。
=======
现在,假设你已在测试环境中针对其中一个版本执行验证和验证测试,并且已准备好将应用程序部署到过渡环境。 在此期间,开发人员可能已签入新代码。 你不希望重新生成解决方案并部署到过渡环境,也不想将最新版本部署到过渡环境。 相反,你想要部署已在测试服务器上验证和验证的特定内部版本。
为此,需要告知Microsoft 生成引擎 (MSBuild) 在何处查找特定生成生成的 Web 包和数据库脚本。
重写 OutputRoot 属性
在 示例解决方案中, Publish.proj 文件声明一个名为 OutputRoot 的属性。 顾名思义,这是包含生成过程生成的所有内容的根文件夹。 在 Publish.proj 文件中,可以看到 OutputRoot 属性引用所有部署资源的根位置。
注意
OutputRoot 是常用的属性名称。 Visual C# 和 Visual Basic 项目文件还声明此属性以存储所有生成输出的根位置。
<PropertyGroup>
<!--This is where the .deploymanifest file will be written to during a build-->
<_DbDeployManifestPath>
$(OutputRoot)ContactManager.Database.deploymanifest
</_DbDeployManifestPath>
<!-- The folder where the .zip and .cmd file will be located for
ContactManager.Mvc Web project -->
<_ContactManagerDest>
$(OutputRoot)_PublishedWebsites\ContactManager.Mvc_Package\
</_ContactManagerDest>
<!-- The folder where the .zip and .cmd file will be located for
ContactManager.Service Web project -->
<_ContactManagerSvcDest>
$(OutputRoot)_PublishedWebsites\ContactManager.Service_Package\
</_ContactManagerSvcDest>
<!-- ... -->
</PropertyGroup>
如果希望项目文件从其他位置部署 Web 包和数据库脚本(如以前 TFS 生成的输出),只需重写 OutputRoot 属性即可。 应将 属性值设置为 Team Build 服务器上的相关生成文件夹。 如果从命令行运行 MSBuild,则可以将 OutputRoot 的值指定为命令行参数:
msbuild.exe Publish.proj /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj
/p:OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
但是,实际上,你还需要跳过生成目标-如果你不打算使用 生成 输出,构建解决方案就没有意义。 为此,可以指定要从命令行执行的目标:
msbuild.exe Publish.proj /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj
/p:OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
/target:GatherPackagesForPublishing;PublishDBPackages;PublishWebPackages
但是,在大多数情况下,需要将部署逻辑构建到 TFS 生成定义中。 这使具有 队列生成权限的用户 可以通过连接到 TFS 服务器的任何 Visual Studio 安装触发部署。
创建生成定义以部署特定生成
下一个过程介绍如何创建一个生成定义,使用户能够使用单个命令触发到过渡环境的部署。
在这种情况下,你不希望生成定义实际生成任何内容,你只希望它执行自定义项目文件中的部署逻辑。 如果文件在 Team Build 中运行, 则 Publish.proj 文件包含跳过 生成 目标的条件逻辑。 它通过评估内置的 BuildingInTeamBuild 属性来执行此操作,如果在 Team Build 中运行项目文件,该属性会自动设置为 true 。 因此,可以跳过生成过程,只需运行项目文件即可部署现有生成。
创建生成定义以手动触发部署
在 Visual Studio 2010 的 “团队资源管理器” 窗口中,展开团队项目节点,右键单击“ 生成”,然后单击“ 新建生成定义”。
在“ 常规 ”选项卡上,为生成定义指定一个名称 (例如 DeployToStaging) 和可选说明。
在“ 触发器 ”选项卡上,选择“ 手动 - 签入不会触发新的生成”。
在“ 生成默认值 ”选项卡上的“ 将生成输出复制到以下放置文件夹 ”框中,键入放置文件夹的通用命名约定 (UNC) 路径 (例如 \TFSBUILD\Drops) 。
在“ 进程 ”选项卡上的“ 生成进程文件 ”下拉列表中,保持 “DefaultTemplate.xaml ”处于选中状态。 这是添加到所有新团队项目的默认生成过程模板之一。
在 “生成过程参数 ”表中,单击“ 要生成的项” 行,然后单击 省略号 按钮。
在“ 要生成的项 ”对话框中,单击“ 添加”。
在 “类型的项 ”下拉列表中,选择“ MSBuild 项目文件”。
浏览到用于控制部署过程的自定义项目文件的位置,选择该文件,然后单击“ 确定”。
在“ 要生成的项 ”对话框中,单击“ 确定”。
在 “生成过程参数 ”表中,展开“ 高级 ”部分。
在 “MSBuild 参数” 行中,指定特定于环境的项目文件的位置,并为生成文件夹的位置添加占位符:
/p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj; OutputRoot=PLACEHOLDER
注意
每次将生成排队时,都需要重写 OutputRoot 值。 下一过程将对此进行介绍。
单击“保存” 。
触发生成时,需要更新 OutputRoot 属性以指向要部署的生成。
从生成定义部署特定生成
在 “团队资源管理器” 窗口中,右键单击生成定义,然后单击“ 排队新建生成”。
在“ 队列生成 ”对话框中的“ 参数 ”选项卡上,展开“ 高级 ”部分。
在 MSBuild 参数 行中,将 OutputRoot 属性的值替换为生成文件夹的位置。 例如:
/p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj; OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
注意
请确保在生成文件夹的路径末尾包含尾部斜杠。
单击“ 队列”。
将生成排队时,项目文件将从 OutputRoot 属性中指定的生成放置文件夹中部署数据库脚本和 Web 包。
结论
本主题介绍了如何使用拆分项目文件部署模型从特定的上一版本发布部署资源,如 Web 包和数据库脚本。 它介绍了如何重写 OutputRoot 属性,以及如何将部署逻辑合并到 TFS 生成定义中。