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



我正试图找出如何使用msdeploy与我的MVC站点能够自动部署,包括在远程服务器上设置IIS。

我使用以下命令创建包:

C:WindowsMicrosoft.NETFrameworkv4.0.30319MSBuild.exe ClientsPokerLeagueWebSitePokerLeagueWebSite.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中配置的IIS设置"one_answers"包括这个web项目使用的应用程序池设置",并在我的开发机上构建包,然后从那里发布,它工作得很好。下面是我使用的命令:

C:myprojectPackagesDeploymentPokerLeagueWebSite>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来创建包并获得我需要的设置,然后将其脚本化,但我没有线索,并且花了很长时间阅读它,但没有任何成功,我将如何做选项一。

注意:

在我发表这篇文章之前,阅读一些建议的问题,我可以看到一些可能性:

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设置复选框勾选。我已经开始阅读有关[项目].wpp。目标文件可能会有帮助,但在atm机上丢失了。

编辑2

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

当不使用IIS时,sourcemaniest .xml看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
<IisApp path="C:hoh_codeGITai-poker-projectClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" managedRuntimeVersion="v4.0" />
<setAcl path="C:hoh_codeGITai-poker-projectClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" setAclResourceType="Directory" />
<setAcl path="C:hoh_codeGITai-poker-    projectClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp"     setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>

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

<?xml version="1.0" encoding="utf-8"?>
<sitemanifest>
<appHostConfig path="Default Web Site/PokerLeague" />
<contentPath path="C:hoh_codeGITai-poker-projectClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" />
<setAcl path="C:hoh_codeGITai-poker-projectClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" setAclResourceType="Directory" />
<setAcl path="C:hoh_codeGITai-poker-projectClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>

不知道如何改变它,工作在[项目].wpp。目标文件,但在黑暗中摸索。

编辑3

好吧,我以为我有一分钟。在我的[项目]中。目标文件:

<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:TeamCitybuildAgentwork71e78d4c543e0594ClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" />
<IisApp path="C:TeamCitybuildAgentwork71e78d4c543e0594ClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" managedRuntimeVersion="v4.0" />
<setAcl path="C:TeamCitybuildAgentwork71e78d4c543e0594ClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" setAclResourceType="Directory" />
<setAcl path="C:TeamCitybuildAgentwork71e78d4c543e0594ClientsPokerLeagueWebSiteobjDeploymentPackagePackageTmp" setAclUser="anonymousAuthenticationUser" setAclResourceType="Directory" />
</sitemanifest>

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

编辑4

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

<DeployAsIisApp>False</DeployAsIisApp>

进入wpp。目标文件。

这现在已经创建了一个新的问题,它将不再部署。我认为这与apphostconfig处理站点和iisapp处理虚拟目录有关。

编辑5

所以我一直在研究使用IIS和自定义IIS之间的差异。

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

setparameters.xml:

IIS web应用程序名称部分不同。在IIS版本中,它的值是"Default Web Site/pokerleague",但我的值是"C:websitespokerleague"。

我想这就是导致parameters.xml出错的原因:

IIS web应用程序具有相同的值,并且tags属性具有physical而不是iisapp。

我有类似的工具,并且可以自动构建和部署:

  • git回购
  • vs 2010, asp.net mvc 3
  • teamcity 7.1
  • msbuild
  • msdeploy

我将构建、打包和部署步骤分开。我不使用msdeploy xml文件,但在命令行上做同样的事情。

这是我的步骤:

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

右键单击"MyAppName"项目->属性…,"Package/Publish Web"…

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

我第一次手动创建IIS网站(也许你可以自动化,我没有)。当使用MSDeploy时,它会将你的应用推送到匹配的Web站点名称——你不需要硬编码任何目标文件夹路径或任何东西。

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

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

编辑Build Steps,并添加第二个构建步骤,以构建MyAppName。直接使用msbuild进行SLN。您可以根据自己的喜好进行修改,因为您可能已经这样做了。

步骤3:安装Microsoft Visual Studio 2010 Shell (Integrated) Redistributable Package

修复构建错误基本上,我们要么需要在构建服务器上安装VS,手动复制文件,要么安装Microsoft Visual Studio 2010 Shell(集成)可重新分发包。

Microsoft.WebApplication。在构建服务器上找不到目标。你的解决方案是什么?

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

步骤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:WindowsMicrosoft.NETFrameworkv4.0.30319MSBuild.exe" 
MyAppName/MyAppName/MyAppName.csproj 
/T:Package 
/P:Configuration=Debug;PackageLocation="C:BuildMyAppName.Debug.zip"

让我解释一下命令部分:

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

/T:Package:创建一个ZIP包

/p:Configuration=Debug;PackageLocation=***:运行Debug配置。这与选择"Debug"设置的Visual Studio中的Build相同。"包位置"是它创建的。我们将在稍后的部署命令中引用包文件。

步骤7:创建一个Web Deploy命令来部署项目##

"C:Program FilesIISMicrosoft Web Deploy V2msdeploy.exe" -verb:sync 
-source:package="C:BuildMyAppName.Debug.zip" 
-dest:auto,wmsvc=webservername,username=webdeploy,password=******* 
-allowUntrusted=true

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

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

-source:package="C:BuildMyAppName.Debug.zip": source是一个MSBuild zip文件包

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

部署后,我检查了IIS web服务器文件,以确保它们有最新的dll和web。配置文件。

步骤8:从TeamCity构建步骤

调用MSDEPLOY因为现在有2个好的命令(MSBUILD.exe打包,MSDEPLOY.exe部署),将它们添加到构建步骤中。我使用命令行运行器,并且只输入与前2步相同的命令。

run it all

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

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

如您所见,这避免了您最初的问题:

问题是当我提交到github和CI服务器下载和构建它。虚拟目录自然不会在CI上设置

CI服务器只构建和打包。然后将其部署到目标web服务器。

看看Appveyor。我们刚刚发布了2.0版本,恕我直言,它是WebDeploy的强大替代品。整个部署过程可以通过CI服务器上的PowerShell编写脚本,并且有PS hook来定制该过程。

免责声明:我是Appveyor的开发者。我不是想在这里做广告,但如果这对你有用的话,那就太好了。

最新更新