如何让TFS2010通过MSBUILD为我运行MSDEPLOY?

时间:2010-04-14 09:11:24

标签: visual-studio-2010 msbuild tfs2010 msdeploy

Vishal Joshi有一个很好的PDC演讲available here,它描述了Visual Studio 2010中新的MSDEPLOY功能 - 以及如何在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下运行管理服务。我尝试过使用它们。


我正在使用的Args:

/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)未经授权。

8 个答案:

答案 0 :(得分:48)

IIS7 +相关答案....

好的 - 这就是我最终做的事情。或多或少,在此主题/问题中按Simon Weaver发布帖子。

但是当谈到MSBuild设置时......这里的大多数人都在使用以下设置:/p:MSDeployPublishMethod=RemoteAgent对于IIS7来说是 NOT RIGHT 。使用此设置意味着TFS尝试连接到URL:https://your-server-name/MSDEPLOYAGENTSERVICE但是要访问该URL,要进行身份验证的用户需要是管理员。哪个是破碎的。 (并且您需要勾选管理员覆盖规则)。这个网址是我认为的IIS6。

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

标准401 Frak Off你吮吸RemoteAgent,错误

  

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

所以..你需要将你的MSDeployPublishMethod更改为:

/p:MSDeployPublishMethod=WMSVC

WMSVC代表Windows Manager Service。它基本上是远程代理的新包装器,但现在允许我们更正提供用户名和密码..用户不必是管理员! (快乐!)现在,您可以根据WebSite更正设置您想要访问的用户..

enter image description here

它现在也尝试点击网址:https://your-web-server:8172/MsDeploy.axd< - 这正是Visual Studio 2010 Publish窗口所做的! (OMG - > PENNY DROPS !! BOOM!)

enter image description here

这是我的最终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

请注意,用户名中包含域名?你需要那个,那里。此外,在我的图片中,我允许我们的DOMAIN用户访问该网站以进行管理。因此,我添加的新用户帐户(TFSBuildService)具有Domain Users组的成员资格......所以这就是它的运作方式。

现在 - 如果你已经阅读了所有这些,请使用lolcat(因为它们是SOOOOOOOO 2007)....

enter image description here

答案 1 :(得分:19)

这是最终对我有用的步骤。 我希望能够使用RemoteAgent,但无论我尝试什么,都无法正常工作。

你不必完全按照这样做,但这就是我的工作方式

  • Configure WMSVC
  • 确保服务已启动
  • 配置IIS用户(单击IIS中的TOP MOST SERVERNAME)并转到“IIS Manager Users”。我建议让它与你的Windows名称不同。
  • 确保WMSVC的用户帐户(对我来说是LOCAL SERVICE)对您正在使用的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实际上是一个本地框,其hosts file条目指向127.0.0.1。 Localhost也可能在这里工作。

有用的文章:

Troubleshooting MSDeploy issues

More troubleshooting

答案 2 :(得分:16)

不幸的是,目前没有太多关于此的信息。我会在这条消息的末尾给你一些提示。


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

如果要传递值,则必须定义名为MsDeployDestinationProviderSetting的项目,其元数据必须包含必要的值。

因此,在您的项目文件中(或通过传入的属性)定义如下内容。

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

关于在哪里可以找到文档,就像我之前说的还不多。但是,由于整个Web发布管道都是在MSBuild目标和任务中捕获的,因此如果您熟悉MSBuild,您可以自己学习。如果您查看使用Visual Studio 2010创建的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

因此,为了现在详细了解这个主题,您必须检查这些文件并自己学习。


我将开始研究将要详细介绍这些技术的内容,但它不会出现很长一段时间,而且我还有很多东西要弄明白这些东西。

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

答案 3 :(得分:6)

我遇到了类似的问题,解决方法是使用以下参数:

/ 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,因为我正在构建解决方案并尝试一次构建三个Web应用程序。另外我认为你的MsDeployServiceUrl应该只是http://staging.example.com

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

答案 4 :(得分:4)

请注意,您还可以设置DeployTarget = Package - 这将准备包但不立即进行部署。有关详细信息,请参阅this blog post

答案 5 :(得分:3)

对我来说问题是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=

您只需要指定服务器名称,而不是完整路径(不需要http)。

请注意,UserName保留为空以解决使用NTLM身份验证的错误(这样它会使用TFS构建代理的凭据进行部署)。见the accepted answer here

答案 6 :(得分:3)

以下是我如何使用它。这与Webdeploy 2.0有关。我正在从我们的构建机器到相同的域部署到dev webserver机器windows server 2008 r2。我用来部署的帐户是域上的服务帐户,该帐户在两台计算机上都具有管理员权限。我的解决方案包括几个单元测试项目,一个mvc3项目,以及解决方案下的几个库。如果您未在要部署的服务器上安装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. 我最初挣扎的项目是“默认网站/ YourpplicationNameHere”周围的引用,这给出了部分错误:

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

    默认网站/ YourApplicationNameHere

  2. 周围没有引号时会发生这种情况
  3. 我收到的下一个错误是因为我的部署凭据中的用户名和密码错误。它给出了这个错误:

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

    这是因为我在/ p:UserName = / p:Password =中的用户名和密码不包括用户的域。即使构建在该用户下运行,它也不会部署。所以我在浏览器中直接点击了网址https://devserver02:8172/msdeploy.axd以确保它是操作并确保用户名和密码有效。这是我注意到我必须放入域/用户才能使其工作的地方。

  4. 我希望这可以回复我认为其他一些可怜的灵魂找到这些错误,这可能会有所帮助......

答案 7 :(得分:1)

如果您可以使用fileCopy部署应用程序,则可以轻松自定义TFS工作流程。

在这些文章的帮助下,我使用了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

非常简单明了。

  • 我使用对所需共享具有写权限的用户帐户配置了构建服务。

  • 接下来,我创建了CopyDirectory工作流程步骤,将源配置为BuildDetail.DropLocation +“_ PostNetWebsites”,并为目标我创建了一个参数,我称之为“DeployPath”,可以在构建配置中填充

  • 现在,在调用CopyDirectory活动之前,我仍然需要实现一个测试来检查构建是否成功。我提到的文章说明了如何做到这一点。他们还教授如何调用powershell脚本而不是CopyDirectory。