我使用以下命令来创建包:
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中配置的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创建软件包并获取所需的设置,然后编写脚本来解决第二个选项,但我对如何完成第一个选项毫无头绪,并花费了相当长时间阅读相关内容,但没有任何成功。
注:
在发布这篇文章之前,我阅读了一些建议的问题,并发现了一些可能性:
MSdeploy使用错误的虚拟目录名称部署MVC 2应用程序
这个问题涉及到在msdeploy命令中传递额外的值,看起来不错,但不是内部构建过程的一部分。不确定要使用哪些命令,但我相信可以通过谷歌搜索找到答案。
这个链接似乎延续了上面的话题:http://msdn.microsoft.com/en-us/library/ee814764.aspx
这个页面讨论了第二个选项的可能性。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文件,但目前还很困惑。
编辑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文件,但目前还是摸索中。
编辑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版本中,它具有“默认网站/pokerleague”值,但我的是“C:\websites\pokerleague”。我认为这就是导致parameters.xml中错误的原因:
IIS Web应用程序具有相同的值,而标签属性具有物理而不是iisapp。