65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (3投票s)

2010 年 11 月 1 日

CPOL

5分钟阅读

viewsIcon

60238

介绍使用 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 应用程序名称>”选项。单击后,它将打开如下窗口:

clip_image002_3_.jpg

如果您点击“发布”,它将把 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 文件。它还包含其他文件,如下所示:

Untitled_2_.png

您可以在此处看到它包含一个 deploy.cmd 文件、readme.txtSetParameter.xmlManifest.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。因此,过程是:

  1. 将整个源从 SNVFolder 复制到 BuildFolder
  2. 获取 SVN 修订号和 CCNet 级别以创建版本号。版本号格式为 <CCNetLevel>.<SVN Revision>
  3. 使用版本号和其他设置更改 GlobalAssembly.cs,并使用 release 配置更改 web.config
  4. 运行 MSBuild 并进行所有配置以重新构建解决方案。
  5. 如果您的项目包含单元测试,请运行单元测试。
  6. 运行 NCoverage(可选)
  7. 您还可以运行 FxCop 和其他工具来分析您的构建。此步骤也是可选的。
  8. 通过 MSbuild 在部署文件夹的版本文件夹下创建 Web 应用程序的包。
  9. 通过更改 Setparameters.xml 文件中的值来更改 IIS 参数。
  10. 使用 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.cmddeploy.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 文件后的命令输出。

command.png

Deploy.cmd 内部调用 msdeploy.exe 并使用所有设置,同时从 SetParameters.xml 文件设置此参数。

结论

在这里,我没有包含完整的 NAnt 和 CCnet.config,因为它们与我之前的文章相同。完整的脚本包含在我之前的文章中,您只需要更改上面提到的代码段。

© . All rights reserved.