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

Jon*_*Jon 8 iis asp.net-mvc msdeploy

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

我使用以下命令来创建包:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe Clients\PokerLeagueWebSite\PokerLeagueWebSite.csproj /T:Package /p:Configuration=Deployment
Run Code Online (Sandbox Code Playgroud)

我的设置如下:

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

如果我勾选"包含在IIS中配置的IIS设置"和"包含此Web项目使用的应用程序池设置"并在我的开发框中构建软件包,那么从那里发布它可以很好地工作.这是我使用的命令:

C:\myproject\Packages\Deployment\PokerLeagueWebSite>PokerLeagueWebSite.deploy.cmd /Y /M:192.168.10.98:8172 /U:administrator /P:password
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

第一个选项是可取的,因为它将所有信息保存在一个位置,您不需要记住在部署之前运行额外的脚本.

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

NB

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

MSdeploy使用错误的虚拟目录名部署MVC 2应用程序

这个问题讨论了在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>
Run Code Online (Sandbox Code Playgroud)

但是,当我勾选使用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>
Run Code Online (Sandbox Code Playgroud)

不知道如何更改它,在[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>
Run Code Online (Sandbox Code Playgroud)

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

One or more entries in the manifest 'sitemanifest' are not valid. 
Run Code Online (Sandbox Code Playgroud)

清单文件如下所示:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

编辑4

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

<DeployAsIisApp>False</DeployAsIisApp>
Run Code Online (Sandbox Code Playgroud)

这将进入wpp.targets文件.

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

编辑5

所以我一直在经历与IIS和我的自定义滴答之间的差异.

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

setparameters.xml:

IIS Web应用程序名称部分不同.IIS版本具有"默认网站/ pokerleague"值,但我的"C:\ sites\pokerleague".

我认为这是驱动parameters.xml中的错误的原因:

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

Rau*_*ess 3

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

  • git 仓库
  • 与 2010 相比,asp.net mvc 3
  • 团队城市7.1
  • 微软构建
  • 部署

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

这是我的步骤:

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

右键单击“MyAppName”项目 -> 属性...,选项卡“打包/发布 Web”...

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

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

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

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

我编辑构建步骤,并添加第二个构建步骤,以使用 msbuild 直接构建 MyAppName.sln。您可以根据需要进行修改,因为您可能已经以某种方式这样做了。

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

基本上,我们需要在构建服务器上安装 VS,手动复制文件,或者安装Microsoft Visual Studio 2010 Shell(集成)可再发行组件包

在生成服务器上找不到 Microsoft.WebApplication.targets。你的解决方案是什么?

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

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

我在这里获取Web 部署工具并安装。重新启动后,TeamCity 登录出现 404 错误。事实证明,Web Deploy 有一个侦听端口 80 的服务,但 TeamCity Tomcat 服务器也是如此。短期内,我在控制面板中停止 Web Deploy Web 服务,并启动 TeamCity Web 服务。Web 部署代理服务的目的是接受其他服务器对该服务器的请求。我们不需要它,因为 TeamCity 服务器将充当客户端,并部署到其他 Web 服务器。

Web 部署工具还必须安装在目标 Web 服务器上。我不会在这里详细介绍,但您还必须配置服务来侦听,因此当您运行部署命令时,它会接受它并安装在服务器上。对于服务器,我设置了一个名为“webdeploy”的新帐户,并具有安装权限。

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

我对打包和部署执行单独的步骤。如果需要,这将允许构建发布包但手动部署它的情况。

这是 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"
Run Code Online (Sandbox Code Playgroud)

让我解释一下命令部分:

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

/T:Package : 创建 ZIP 包

/P:Configuration=Debug;PackageLocation=*** :运行调试配置。这与在 Visual Studio 中选择“调试”设置进行构建相同。“包位置”就是它所创建的。我们稍后将在部署命令中引用包文件。

步骤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
Run Code Online (Sandbox Code Playgroud)

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

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

-source:package="C:\Build\MyAppName.Debug.zip" :源是 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 服务器。