使用 MSDeploy 和 NAnt 脚本自动发布网站到 IIS






4.50/5 (3投票s)
介绍使用 MSDeploy、.NET 4、Nant 和 Cruise Control 将网站发布到 IIS 的过程
引言
我一直在寻找一种自动化构建过程的方法,以便在点击强制构建后,Web 应用程序能够自动部署到我的暂存服务器,以便 QA 进行测试。.NET 4 使使用 MSDeploy 在 IIS 中部署 Web 应用程序变得容易。
背景
在安装 VS 2010 时,请在您的程序文件下的“IIS\Microsoft Web Deploy”文件夹中安装 MSDeploy.exe。当您在 VS 2010 中打开 Web 应用程序时,您会在生成菜单中看到“发布 <Web 应用程序名称>”选项。单击后,它将打开如下窗口:

如果您点击“发布”,它将把 Web 应用程序部署到 IIS。在后台,它使用 MSDeploy 将站点部署到 IIS。在这里,我将讨论如何使用 Nant 和 MSDeploy 自动化此发布过程。
实现
本文包含自动化步骤和脚本,这些内容在我之前的文章 **构建自动化工作流程** (buildautomation.aspx) 中已详细介绍。因此,请参阅我之前的文章以理解这些步骤和代码片段。
您可以在 此 MSDN 链接 中找到 Web 部署的主要功能。.NET Framework v4.0 在 MSBuild 中引入了一个新命令 /target:package。这会创建一个包含所有 IIS 设置、Web 内容和其他各种工件(如安全证书、GAC 组件、注册表等)的 Web 应用程序的 .zip 文件。创建 Web 应用程序项目 webApp.csproj 包的命令是:
C:\..\MSBuild.exe X:\WebApp.csproj /target:Package
此命令会根据配置创建一个 .zip 文件。如果配置是 debug,它将在 debug 文件夹下创建一个包文件夹,但您可以指定您的构建配置和创建此包的位置。
C:\..\MSBuild.exe X:\WebApp.csproj /t:Package
/p:Configuration=Release /p:PackageLocation=x:\WepApp\WebApp.zip
这会在 WebApplication
下创建一个 WebApp.zip 文件。它还包含其他文件,如下所示:

您可以在此处看到它包含一个 deploy.cmd 文件、readme.txt、SetParameter.xml、Manifest.xml 以及我 msbuild 命令中提到的 zip 文件。
Readme.txt 文件将告诉您如何运行 deploy.cmd 文件。deploy.cmd 文件实际上使用正确的命令运行 MSDeploy。SetParameters.xml 允许您更改 IIS 部署参数,如应用程序名称、连接字符串。
<parameters>
<setParameter name="IIS Web Application Name" value="Default Web Site/WebApp_deploy" />
<setParameter name="ApplicationServices-Web.config Connection String"
value="data source=.\SQLEXPRESS;Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" />
</parameters>
安装 MSdeploy 后,在 IIS7 中,您将有一个手动导入 .zip 文件并更改这些设置的选项。
在本文中,我将向您展示一个自动化部署 Web 应用程序的过程,包括所有这些功能,并维护 Web 应用程序的版本,以便我们能够理解此已发布的 Web 应用程序与哪个 SVN 修订版和哪个 CCNet 构建相关。
现在,让我们看看使用 NAnt 和 Cruise Control 自动化构建的过程。这些与我之前的文章(**构建自动化工作流程**)相同,但唯一的区别是我在这里不创建安装文件。我直接将 Web 应用程序发布到 IIS。因此,过程是:
- 将整个源从
SNVFolder
复制到BuildFolder
。 - 获取 SVN 修订号和 CCNet 级别以创建版本号。版本号格式为 <CCNetLevel>.<SVN Revision>
- 使用版本号和其他设置更改 GlobalAssembly.cs,并使用 release 配置更改 web.config。
- 运行 MSBuild 并进行所有配置以重新构建解决方案。
- 如果您的项目包含单元测试,请运行单元测试。
- 运行 NCoverage(可选)
- 您还可以运行 FxCop 和其他工具来分析您的构建。此步骤也是可选的。
- 通过 MSbuild 在部署文件夹的版本文件夹下创建 Web 应用程序的包。
- 通过更改 Setparameters.xml 文件中的值来更改 IIS 参数。
- 使用 MSDeploy 将 Web 应用程序从该版本文件夹发布到本地或远程服务器。
我之前关于构建自动化工作流程的文章描述了步骤 1 到 4。在这里,我只讨论最后的 8 和 9 个过程。
如果您查看我之前文章的 Nant 脚本,当“Forcebuild
”条件为 true
时,它会调用“BuildSetup”。
在这里,我们不是创建安装文件,而是将此站点部署到 IIS。所以这里“Run”目标将像这样调用“BuildDeploy
”:
<target name="Run">
<property value="" name="CCNetBuildCondition" overwrite="false"/>
<call target="BuildPublish" unless="${CCNetBuildCondition=='ForceBuild'}">
<call target="BuildDeploy" if="${CCNetBuildCondition=='ForceBuild'}"/>
</target>
现在,让我们看看“BuildDeploy
”目标包含什么(步骤 10)。
<property name="publish.dir" value="${ResultDir}\${CCNetLabel}.${RevisionNumber}" />
<target name="BuildDeploy" depends="BuildPublish">
<call target="CreatePackage"/>
<call target="SetParameters"/>
<exec program="${$publish.dir}\${ProjectName}.deploy.cmd">
<arg value="/Y" />
</exec>
</target>
这里它依赖于“BuildPublish
”目标,该目标在我之前的文章中已详细介绍。然后它调用“CreatePackage
”目标,即步骤 8。然后它调用另一个目标“SetParameters
”,即步骤 9。在此之后,它使用 /Y
命令调用 deploy.cmd。deploy.cmd 支持的命令在 readme.txt 文件中有提及。这里它在本地机器上创建 IIS 站点。要创建远程机器上的站点,命令是:
C:\..\webapp.deploy.cmd /Y /M:192.168.1.12 /U:milton /P:xx
但是,要在远程计算机上部署,您需要在远程计算机上运行 Web 部署代理服务。为此,您需要从 此处 安装 Web 部署工具的 Web 部署代理服务功能。安装 Web 部署代理服务后,您需要运行此服务。您可以通过在本地计算机上浏览 https://:80/msdeployagentservice 来检查 Web 部署代理服务是否在该计算机上运行。
现在,让我们看看“CreatePackage
”目标包含什么。
<target name="CreatePackage">
<exec program="${MSBuildPath}">
<arg value="${BuildDir}\${WebProject}" />
<arg value="/property:Configuration=release" />
<arg value="/property:PackageLocation=${publish.dir}\${ProjectName}.zip" />
<arg value="/t:Package" />
</exec>
</target>
这里它使用 /target:package
创建一个包,如前所述。假设我们的 CCNetLavel
值为“1.2.4
”,SVN 修订版为 1234,那么它会创建一个名为 x:Deployment\1.2.4.1234\WebApp.zip 的文件夹。因此,通过查看文件夹名称,我们可以了解哪个 SVN 修订版和哪个 CCNet 构建与此包相关联。
现在,让我们看看“SetParameters
”目标(步骤 9)。
<target name ="SetParameters">
<xmlpoke
file="${$publish.dir}\${ProjectName}.SetParameters.xml"
xpath="/parameters/setParameter[@name = 'IIS Web Application Name']/@value"
value="Default Web Site/WebApp${RevisionNumber}" />
</target>
在这里,它通过更改 SetParameters
来更改 IIS 中的 Web 应用程序名称。如果 SVN 修订号为 1234
,则 Web 应用程序名称将是“WebApp1234
”。您也可以在部署 Web 应用程序之前使用此 <xmlpoke>
更改部署数据库连接字符串。当您运行 deploy.cmd 时,它实际上会调用 SetParameters.xml 文件来获取这些值。您可以查看运行 Nant.build 文件后的命令输出。

Deploy.cmd 内部调用 msdeploy.exe 并使用所有设置,同时从 SetParameters.xml 文件设置此参数。
结论
在这里,我没有包含完整的 NAnt 和 CCnet.config,因为它们与我之前的文章相同。完整的脚本包含在我之前的文章中,您只需要更改上面提到的代码段。