我怎样才能让TFS2010通过MSBUILD为我运行MSDEPLOY?

Vishal Joshi 提供了一个很好的PDC讲述,介绍了Visual Studio 2010中的新MSDEPLOYfunction,以及如何在TFS中部署应用程序。 ( Scott Hanselman也有一个很好的演讲,但他没有进入TFS)。

您可以在TFS2010中使用MSBUILD调用MSDEPLOY将您的软件包部署到IIS。 这是通过参数MSBUILD完成的。

谈话解释了一些命令行参数,例如:

/p:DeployOnBuild /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=True /p:MSDeployPublishMethod=InProc /p:MSDeployServiceURL=localhost /p:DeployIISAppPath="Default Web Site" 

但是这里的文档在哪里 – 我找不到?

我花了整整一天的时间试图让这个工作,不能完全正确的,并不断结束各种错误。 如果我运行包的cmd文件,它完全部署。 如果我通过Visual Studio运行WebDeploy,它也可以很好地工作。

但我想通过使用这些参数通过msbuild运行整个部署,而不是单独调用msdeploy或运行包.cmd文件。 我该怎么做?

PS。 是的,我确实运行了Web Deployment Agent Service 。 我也有在IIS下运行的pipe理服务。 我试过使用两个。


我正在使用的参数:

 /p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:Configuration=Release /p:CreatePackageOnPublish=True /p:DeployIisAppPath=staging.example.com /p:MsDeployServiceUrl=https://staging.example.com:8172/msdeploy.axd /p:AllowUntrustedCertificate=True 

给我 :

C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets(2660):VsMsdeploy失败(远程代理(URL https://staging.example.com: 8172 / msdeploy.axd?site = staging.example.com ),请确保已经在目标计算机上安装并启动了远程代理服务。)错误详细信息:远程代理(URL https://staging.example。 com:8172 / msdeploy.axd?site = staging.example.com )无法联系。 确保远程代理服务已安装并在目标计算机上启动。 收到不受支持的响应。 响应标题'MSDeploy.Response'是'',但'v1'是预期的。 远程服务器返回错误:(401)未经授权。

IIS7 +相关的答案….

好的 – 这是我最终做的。 或多或less,在这个线索/问题之后, Simon Weaver的post。

但是,当涉及到MSBuild设置..这里的大多数人使用以下设置: /p:MSDeployPublishMethod=RemoteAgent这是/p:MSDeployPublishMethod=RemoteAgent用于IIS7。 使用此设置意味着TFS尝试连接到以下URL: https://your-server-name/MSDEPLOYAGENTSERVICE但要访问该URL,需要进行身份validation的用户必须是Admin。 这是fraked。 (而且你需要pipe理覆盖规则thingy打勾)。 这个url是IIS6我认为。

当您尝试使用RemoteAgent进行连接时,以下是标准错误消息:

标准401 Frak Off你吸RemoteAgent,错误

C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets(3588):Web部署任务失败(远程代理(URL http:// your-web- server / MSDEPLOYAGENTSERVICE ),请确保远程代理服务已安装并在目标计算机上启动。)确保站点名称,用户名和密码正确无误。 如果问题未解决,请联系您的本地或服务器pipe理员。 错误详细信息:无法联系远程代理(URL http:// your-web-server / MSDEPLOYAGENTSERVICE )。 确保远程代理服务已安装并在目标计算机上启动。 收到不受支持的响应。 响应标题'MSDeploy.Response'是'V1',但'v1'是预期的。 远程服务器返回错误:(401)未经授权。

所以..你需要改变你的MSDeployPublishMethod到这个:

 /p:MSDeployPublishMethod=WMSVC 

WMSVC代表Windowspipe理器服务。 它基本上是远程代理上的一个新的包装,但现在允许我们更正提供用户名和密码..用户不必是pipe理员! (快乐!)所以,现在你可以更正设置哪些用户你想访问..每个网站..

在这里输入图像描述

它现在也试图打到url: https://your-web-server:8172/MsDeploy.axd < – 这正是Visual Studio 2010 Publish窗口所做的! (OMG – > PENNY DROPS !! BOOM!)

在这里输入图像描述

这是我最后的MSBuild设置:

 /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MSDeployPublishMethod=WMSVC /p:MsDeployServiceUrl=your-server-name /p:DeployIISAppPath=name-of-the-website-in-iis7 /p:username=AppianMedia\some-domain-user /p:password=JonSkeet<3<3<3 /p:AllowUntrustedCertificate=True 

注意用户名里面有域名? 雅需要那里。 另外,在我的照片中,我允许我们的域用户访问网站进行pipe理。 因此,我添加的新用户帐户(TFSBuildService)对Domain Users组具有成员身份…所以这就是一切工作原理。

现在 – 如果你读了所有这一切,有一个lolcat(因为他们SOOOOOOOO 2007)….

在这里输入图像描述

这是最后为我工作的步骤。 我想与RemoteAgent合作,但不pipe我尝试了什么,都无法工作。

你不必这样做,但这是我如何工作

  • configurationWMSVC
  • 确保服务已启动
  • configuration一个IIS用户(点击IIS中的TOP MOST SERVERNAME)并转到“IISpipe理员用户”。 我build议使它不同于你的Windows名称。
  • 确保WMSVC(本地服务)的用户帐户对您正在使用的IIS目录具有写入权限
  • 在我的情况下,我正在使用SSL证书(即使它正在打本地主机)。

记住这些都是在TFS Build定义中添加的MSBUILD的所有参数

 /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MSDeployPublishMethod=WMSVC /p:MsDeployServiceUrl=https://staging.example.com:8172/msdeploy.axd /p:username=sweaveriis /p:password=abcd1234 /p:DeployIisAppPath=staging.example.com/virtual_directory_name /p:AllowUntrustedCertificate=True 

注意:staging.example.com实际上是指向127.0.0.1的hosts文件条目的本地框。 本地主机也可能在这里工作。

有用的文章:

解决MSDeploy问题

更多故障排除

不幸的是,目前没有很多关于此的信息。 不过,我会在这封邮件的最后给你一些提示。


关于您的问题,我之前在尝试使用MSDeploy进行部署时看到了这一点,而且我运行的帐户没有权限在目标计算机上执行部署。 因此,您需要查看运行您的构build的帐户,并查看此帐户是否有权部署到目标计算机。 如果没有,那么你有几个select; 授予构build用户的权利,或传递用户名/密码。

如果你想传递值,那么你将不得不定义一个名为MsDeployDestinationProviderSetting的项目,它的元数据将包含必要的值。

所以在你的项目文件(或通过传入的属性)定义如下所示。

 <PropertyGroup> <UserName>USERNAME-HERE</UserName> <Password>PASSWORD-HERE </PropertyGroup> 

关于哪里可以find文件,就像我之前说过的,那里还没有多less文件。 但是由于整个Web发布pipe道被捕获在MSBuild目标和任务中,如果你熟悉MSBuild,你可以自己学习很多东西。 如果您查看使用Visual Studio 2010创build的Web项目的.csproj(或.vbproj)文件,则会看到类似以下的语句:

 <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> 

这会导入位于%ProgramFiles(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets文件,并依次导入%ProgramFiles(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets

所以为了现在详细地学习这个话题,你必须检查这些文件并且自己学习。


我将会详细研究这些技术,但是这个技术不会出现一段时间,而且我还有很多东西需要弄清楚。

你可以试用用户名/密码协议,让我知道它是否适合你?

我有一个类似的问题,解决scheme是有以下参数:

/ p:MSDeployPublishMethod = RemoteAgent

这里是我使用的所有参数。

/ p:DeployOnBuild = True / p:DeployTarget = MSDeployPublish / p:MSDeployPublishMethod = RemoteAgent / p:MsDeployServiceUrl = http:// my-server-name / p:username = myusername / p:password = mypassword

注:我没有使用DeployIisAppPath,因为我正在构build一个解决scheme并试图一次构build三个Web应用程序。 另外我想你的MsDeployServiceUrl应该只是http://staging.example.com

看来,使用MSDeployPublishMethod MSBuild的InProc(可能是默认值)时,会忽略MsDeployServiceUrl并始终尝试部署到本地服务器。 我将其更改为RemoteAgent,并成功部署了所有三个Web应用程序。 我注意到Package文件不再包含在MyWebApplication_Package文件夹中,但对我来说这不是什么大问题。

请注意,您也可以设置DeployTarget = Package – 这将准备包但不能马上部署。 欲了解更多信息,请参阅这篇博文 。

对我来说,问题在于Web Deployment Agent Service未启动。

一个简单的net start msdepsvc修复它。 您也可以在此服务上将启动模式设置为自动。

我使用的参数是:

 /p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:MSDeployPublishMethod=RemoteAgent /p:MSDeployServiceUrl=stagingserver /p:DeployIisAppPath=test.local /p:UserName= 

你只需要指定服务器名称,而不是完整的path(不需要http)。

请注意UserName留空以解决NTLM身份validation错误(这种方式使用TFS构build代理的凭据进行部署)。 看到接受的答案在这里

以下是我如何工作。 这是与Webdeploy 2.0。 我正在部署在我们的生成机器相同的域到一个开发的Web服务器机器Windows Server 2008 R2。 我用来部署的帐户是在两台计算机上具有pipe理员权限的域上的服务帐户。 我的解决scheme包括几个unit testing项目,一个mvc3项目,以及解决scheme下的一对库。 如果您未在要部署的服务器上安装MVC3,请参阅http://www.iwantmymvc.com/2011-03-23-bin-deploy-aspnet-mvc-3-visual-studio以获取指导。;

/ p:DeployOnBuild = True / p:DeployTarget = MSDeployPublish / p:DeployIisAppPath =“Default Web Site / YourpplicationNameHere”/p:MsDeployServiceUrl=https://devserver02:8172/msdeploy.axd / p:AllowUntrustedCertificate = True / p:UserName = yourDomain \ buildaccount / p:密码=密码

  1. 我最初挣扎的项目是“默认网站/ YourApplicationNameHere”引用的部分错误:

    MSBUILD:错误MSB1008:只能指定一个项目。

    在Default Web Site / YourApplicationNameHere周围没有引号时会发生这种情况

  2. 我得到的下一个错误是因为我部署凭据中的用户名和密码错误。 它给了这个错误:

    C:Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets(3588):Web部署任务失败(远程代理(URL https:// devserver02:8172 / msdeploy.axd?site = Default Web Site)无法联系,请确保目标计算机上安装并启动了远程代理服务。)确保站点名称,用户名和密码正确无误。 如果问题未解决,请联系您的本地或服务器pipe理员。 错误详细信息:无法联系远程代理(URL https:// devserver02:8172 / msdeploy.axd?site =默认网站)。 确保远程代理服务已安装并在目标计算机上启动。 收到不受支持的响应。 响应标题'MSDeploy.Response'是'',但'v1'是预期的。 远程服务器返回错误:(401)未经授权。

    这是因为我在/ p:UserName = / p:Password =中的用户名和密码没有包含用户的域名。 即使它在该用户下运行,也不会部署。 所以我在浏览器中直接点击https:// devserver02:8172 / msdeploy.axd来确保它正在运行,并确保用户名和密码正常工作。 这是我注意到我必须在域/用户才能使其工作。

我希望这是可以回复我find了一些其他可怜的灵魂,发现这些错误,这可能有助于…

如果您可以使用fileCopy部署应用程序,则可以轻松定制TFS工作stream程来执行此操作。

我已经使用了CopyDirectory活动,在这些文章的帮助下:

http://www.ewaldhofman.nl/post/2010/11/09/Part-14-Execute-a-PowerShell-script.aspx

http://geekswithblogs.net/jakob/archive/2010/09/01/tfs-team-build-2010-how-to-place-the-build-output.aspx

非常简单直接。

  • 我使用具有所需共享的写入权限的用户帐户configuration构build服务。

  • 接下来,我创build了CopyDirectory工作stream步骤,将源代码configuration为BuildDetail.DropLocation +“_PublishedWebsites”,并为目标创build了一个我称之为“DeployPath”的参数,该参数可以填充到构buildconfiguration中。

  • 现在我仍然需要实现一个testing,在调用CopyDirectory活动之前检查构build是否成功。 我提到的文章显示如何做到这一点。 他们还教导如何调用PowerShell脚本而不是CopyDirectory。