使用msdeploy部署MVC站点,包括CI服务器中没有虚拟目录设置的IIS设置

时间:2012-02-20 07:04:43

标签: asp.net-mvc iis msdeploy

我试图弄清楚如何在我的MVC站点上使用msdeploy来自动化部署,包括在远程服务器上设置IIS。

我使用以下命令创建包:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe Clients\PokerLeagueWebSite\PokerLeagueWebSite.csproj /T:Package /p:Configuration=Deployment

我的设置如下:

local dev box using VS2010 + GIT
GITHUB for repo
Teamcity for CI server (different machine to dev box)
remote (same network) UAT server

如果我按照IIS&#34中的配置勾选"包含IIS设置;和"包括此Web项目使用的应用程序池设置"并在我的开发盒上构建包然后从那里发布它很好。这是我使用的命令:

C:\myproject\Packages\Deployment\PokerLeagueWebSite>PokerLeagueWebSite.deploy.cmd /Y /M:192.168.10.98:8172 /U:administrator /P:password

这会在我的UAT服务器中创建虚拟目录,一切都很顺利。问题是当我提交github并且CI服务器下载并构建它时。当然,CI服务器上没有设置虚拟目录,因此构建/包失败。

我想要做的是使用msdeploy提供的包装,并能够远程部署站点和IIS。我想有几个选择:

1)将MVC项目文件更改为硬代码iis设置,以便在运行构建包时,它会创建具有正确设置的XML文件,以便可以从任何计算机进行部署。我认为这可以通过项目根目录中的package.xml文件来完成,但我不知道如何设置所有应用程序池和虚拟目录设置。感觉我已经到了中途,但无法在最后一线进行推动。

2)使用powershell更改创建的包XML文件,以便添加提取IIS设置。

第一个选项更可取,因为它将所有信息保存在一个地方,并且您不需要记住在部署之前运行额外的脚本。

我相信我可以通过使用VS来创建包并获得我需要的设置然后编写脚本来计算第二个选项,但我没有线索并且花了一些时间阅读它而没有任何成功关于如何做第一选择。

N.B。

在发布之前阅读一些建议的问题我可以看到某种可能性:

MSdeploy deploys an MVC 2 application with wrong virtual directory name

这个问题谈到在msdeploy命令上传递额外的值,看起来没问题,但不是内部的构建过程可以这么说。不确定要使用的所有命令,但我可以确定谷歌。

此链接似乎继续上述:http://msdn.microsoft.com/en-us/library/ee814764.aspx

此页面介绍了选项2的可能性。http://learn.iis.net/page.aspx/1082/web-deploy-parameterization/

认为这是方法:在站点的根目录中使用parameters.xml来获取项目内容: http://vishaljoshi.blogspot.com/2010/07/web-deploy-parameterization-in-action.html

修改

我继续阅读和测试这个。使用项目根目录中的parameters.xml文件,我可以在那里得到参数。我的问题似乎是archive.xml文件。这是非常不同的,如果我没有使用IIS设置复选框勾选,导致程序包无法正确安装的原因。我已经开始阅读有关[project] .wpp.targets文件的内容,该文件可能会有所帮助,但很可能会丢失该atm。

编辑2

所以我认为我需要做的是获取[project] .sourcemanifest.xml文件来改变它的一些设置。我相信这就是驱动archive.xml的原因,这就是现在的不同之处。我认为我的parameters.xml工作正常。

当不使用IIS时,sourcemanifest.xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
  <IisApp path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" managedRuntimeVersion="v4.0" />
  <setAcl path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclResourceType="Directory" />
  <setAcl path="C:\hoh_code\GIT\ai-poker-    project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp"     setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>

但是当我勾选使用IIS设置时,它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
  <appHostConfig path="Default Web Site/PokerLeague" />
  <contentPath path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" />
  <setAcl path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclResourceType="Directory" />
  <setAcl path="C:\hoh_code\GIT\ai-poker-project\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>

不确定如何更改它,处理[project] .wpp.targets文件,但在黑暗的atm中摸索。

编辑3

好的,所以我想我已经有一分钟了。在我的[project] .wpp.targets文件中我有:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>

    <AddContentPathToSourceManifestDependsOn>
      SetCustomACLs;
    </AddContentPathToSourceManifestDependsOn >
  </PropertyGroup>

  <Target Name="SetCustomACLs">
    <ItemGroup>
      <MsDeploySourceManifest Include="appHostConfig">
        <Path>Default Web Site/PokerLeague</Path>
      </MsDeploySourceManifest>
    </ItemGroup>
    <ItemGroup>
        <MsDeploySourceManifest Include="contentPath">
            <Path>$(_MSDeployDirPath_FullPath)</Path>
        </MsDeploySourceManifest>
    </ItemGroup>
  </Target>
</Project>

构建,创建一个部署包,然后我可以从我的开发盒部署到UAT服务器并且它可以工作。但是当我在我的CI服务器上运行它时,它不会构建部署包,它会在清单阶段退出,并显示错误:

One or more entries in the manifest 'sitemanifest' are not valid. 

清单文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
  <appHostConfig path="Default Web Site/PokerLeague" />
  <contentPath path="C:\TeamCity\buildAgent\work\71e78d4c543e0594\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" />
  <IisApp path="C:\TeamCity\buildAgent\work\71e78d4c543e0594\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" managedRuntimeVersion="v4.0" />
  <setAcl path="C:\TeamCity\buildAgent\work\71e78d4c543e0594\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclResourceType="Directory" />
  <setAcl path="C:\TeamCity\buildAgent\work\71e78d4c543e0594\Clients\PokerLeagueWebSite\obj\Deployment\Package\PackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>

我猜这是因为它仍然有IisApp以及我添加的appHostConfig。我只是猜测这一点,并且不知道如何删除它。

编辑4

好的,所以我找到了从清单和参数中删除IISAPP的设置:

<DeployAsIisApp>False</DeployAsIisApp>

这会进入wpp.targets文件。

现在已经创建了一个不再部署的新问题。我相信这与处理网站的apphostconfig和处理虚拟目录的iisapp有关。

编辑5

所以我一直在解决与IIS和我的自定义滴答之间的差异。

sourcemanifest.xml文件是相同的 systeminfo.xml是相同的

setparameters.xml:

IIS Web应用程序名称部分不同。 IIS版本有&#34;默认网站/ pokerleague&#34;价值,但我的已经&#34; C:\ website \ pokerleague&#34;。

我认为这是驱动参数中的错误的原因:

IIS Web应用程序具有相同的值,而tags属性具有物理而非iisapp。

2 个答案:

答案 0 :(得分:3)

我有类似的工具,并进行自动构建和部署:

  • git repo
  • vs 2010,asp.net mvc 3
  • teamcity 7.1
  • 的msbuild
  • msdeploy

我将构建,打包和部署步骤分开。我不使用msdeploy xml文件,但在命令行上执行相同的操作。

这些是我的步骤:

步骤1:编辑Visual Studio项目属性

右键单击&#34; MyAppName&#34;项目 - &gt;属性...,选项卡&#34;打包/发布Web&#34; ...

  • 配置:活动(调试) - 这意味着&#39; Debug&#39; config在VS中处于活动状态,您正在编辑它。 &#39;调试&#39;和&#39;发布&#39;配置都可以选择和独立编辑。
  • Web部署程序包设置 - 选中&#34;将部署程序包创建为zip文件&#34;。我们想要ZIP文件,以便以后可以单独部署。
  • IIS网站/应用程序名称 - 必须与目标服务器上的IIS网站条目匹配。我使用&#34; MyAppName /&#34;路径后没有应用程序名称,因为我手动在IIS中创建它。这就是它在Web服务器配置上的外观。

我第一次手动创建IIS网站(也许你可以自动化,我不会)。使用MSDeploy时,它会将您的应用程序推送到匹配的网站名称 - 您不必对任何目标文件夹路径或任何内容进行硬编码。

使用您的项目保存它,并确保您的更改已签入Git(推送到origin / master)。当CI服务器运行构建步骤时,将从版本控制中提取这些设置。

步骤2:在TeamCity配置中添加构建步骤

我编辑构建步骤,并添加第二个构建步骤,使用msbuild直接构建MyAppName.sln。您可以随意修改,因为您可能已经以某种方式执行此操作。

步骤3:通过安装Microsoft Visual Studio 2010 Shell(集成)可再发行组件包修复构建错误

基本上,我们需要在构建服务器上安装VS,手动复制文件或安装Microsoft Visual Studio 2010 Shell (Integrated) Redistributable Package

Microsoft.WebApplication.targets was not found, on the build server. What's your solution?

这将使它构建。仍然没有部署到服务器。

步骤5:安装MS Web部署工具

我得到Web Deployment Tool here并安装。重新启动后,TeamCity登录有404错误。结果是Web Deploy有一个侦听端口80的服务,但TeamCity Tomcat服务器也是如此。从短期来看,我在控制面板中停止Web Deploy Web服务,并启动TeamCity Web服务。 Web部署代理服务的目的是接受来自其他服务器的对该服务器的请求。我们不需要这样,因为TeamCity服务器将充当客户端,并部署到其他Web服务器。

Web部署工具也必须安装在目标Web服务器上。我不打算在这里详细介绍,但您必须将服务配置为侦听,因此当您运行部署命令时,它会接受它并安装在服务器上。对于服务器,我设置了一个名为&#39; webdeploy&#39;有权安装。

步骤6:创建MSBuild命令以打包Web项目

我为打包和部署分别做了一些步骤。这将允许构建Release包的情况,但如果需要,可以手动部署它。

这是msbuild包命令:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" 
           MyAppName/MyAppName/MyAppName.csproj 
           /T:Package 
           /P:Configuration=Debug;PackageLocation="C:\Build\MyAppName.Debug.zip"

让我解释一下命令部分:

MyAppName.csproj:要构建的VS项目文件的路径。其中有一些重要选项可以从项目属性选项卡中设置。

/ T:包:创建一个ZIP包

/ P:Configuration = Debug; PackageLocation = ***:运行Debug配置。这与使用&#39; Debug&#39;在Visual Studio中构建相同。设置已选中。 &#39;套餐位置&#39;是它创造的。稍后我们将在部署命令中引用包文件。

步骤7:创建Web Deploy命令以部署项目##

"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy.exe" -verb:sync 
     -source:package="C:\Build\MyAppName.Debug.zip" 
     -dest:auto,wmsvc=webservername,username=webdeploy,password=******* 
     -allowUntrusted=true

这个命令也值得详细解释:

-verb:sync:使网站从源同步到目的地

- 源:包=&#34; C:\构建\ MyAppName.Debug.zip&#34; :source是一个MSBuild zip文件包

-dest:auto,wmsvc = webservername:使用包文件中的设置部署到服务器。用户帐户是具有权限的操作系统级帐户。指定了主机名,但未指定IIS网站名称(之前在项目属性的MSBuild项目文件中指定)。

部署之后,我检查了IIS Web服务器文件,以确保它们具有最新的DLL和web.config文件。

步骤8:从TeamCity构建步骤

调用MSDEPLOY

由于现在有2个好的命令(要封装的MSBUILD.exe,要部署的MSDEPLOY.exe),请将它们添加到构建步骤。我使用命令行运行程序,只需输入与前两步相同的命令。

全部运行

当您使用这些步骤运行构建时,如果它们成功,您可以直接从git自动部署。

现在每次新代码合并并推送到git origin / master分支时,它都会自动构建和部署开发服务器。

如您所见,这可以避免您的原始问题:

  

问题是当我提交github并且CI服务器下载时   建立它。当然,CI上没有设置虚拟目录   服务器,因此构建/包失败。

CI服务器仅构建和打包。然后它部署到目标Web服务器。

答案 1 :(得分:1)

看看Appveyor。我们刚刚发布了v2.0和恕我直言,它是WebDeploy的一个非常强大的替代品。整个部署过程可以通过CI服务器上的PowerShell编写脚本,并且有PS挂钩可以自定义该过程。

免责声明:我是Appveyor开发人员。我不打算在这里做广告,但看看它是否适合你会很棒。