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


78

Vishal Joshi在此处提供了出色的PDC演讲,该演讲描述了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)未经授权。


@纯我也很失望。希望您最终能成功。对于没有专职(高薪)构建团队的团队来说,确实应该更容易。尽管与我最近进行的Facebook集成相比确实轻而易举!
Simon_Weaver

嘿:)我今天终于做了。她工作,她工作!
Pure.Krome

4
@shaun-不,当您知道如何使用它时,它就很好;-)
Simon_Weaver


4
@Simon_Weaver也许那个建筑工人毕竟还不算多付钱;-)
Damien Ryan

Answers:


48

IIS7 +相关答案....

好的-这就是我最终要做的。在此主题/问题中,Simon Weaver发表了或多或少的文章。

但是当涉及到MSBuild设置时,大多数人都在使用以下设置:对于IIS7 /p:MSDeployPublishMethod=RemoteAgent,这是不正确的。使用此设置意味着TFS尝试连接到该URL:https://your-server-name/MSDEPLOYAGENTSERVICE 但是要访问该URL,要进行身份验证的用户必须是Admin。哪个吓坏了。(并且您需要勾选Admin-override规则)。我认为该网址适用于IIS6。

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

Standard 401 Frak Off u suck RemoteAgent,错误

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

所以..您需要更改MSDeployPublishMethod为:

/p:MSDeployPublishMethod=WMSVC

WMSVCWindows管理器服务的代表。基本上,它是Remote Agent上较新的包装器,但现在允许我们更正用户名和密码。.在此,用户不必是管理员!(高兴!)因此,您现在可以正确设置您希望每个网站访问..的用户。

在此处输入图片说明

现在,它也尝试访问该URL:https://your-web-server:8172/MsDeploy.axd<-这正是Visual Studio 2010Publish窗口所要做的!(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

注意到用户名中包含域名吗?你需要那里。另外,在我的图片中,我已允许DOMAIN USERS访问该网站进行管理。因此,我添加的新用户帐户(TFSBuildService)具有该Domain Users组的成员资格...这样便可以正常工作。

现在-如果您已阅读所有内容,请笑一笑(因为它们是SOOOOOOOO 2007)...。

在此处输入图片说明


很棒的答案。我要为需要它的任何人添加,如果您想分离出构建和部署步骤,那么您正在寻找的目标是WebMSDeployPublish。(因此,您只需拥有/ t:WebMSDeployPublish即可代替/ t:Build / p:DeployOnBuild = True。)
moswald 2011年

跟进我的上一篇文章:WebMSDeployPublish仅可用于VS 11 Developer Preview。哎呀。
moswald,2011年

3
您的回答在很多方面改善了我的生活。不确定为什么Microsoft无法像这样精简下来。
Michael McGuire 2012年

3
你我的朋友是摇滚明星。我不惜一切尝试,最终使用WMSVC为我工作。
uadrive 2012年

msbuild仍在默默地绕过我的部署。这个答案使我走向了胜利stackoverflow.com/a/15543183/141508 ; 我还需要将目录C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web从开发箱复制到构建服务器。
Paul Smith

19

这是最终对我有用的步骤。我想与RemoteAgent一起工作,但是无论我如何尝试都无法使它工作。

您不必完全像这样,但这就是我的工作方式

  • 配置WMSVC
  • 确保服务已启动
  • 配置IIS用户(在IIS中单击“最上层的服务器名称”),然后转到“ IIS管理器用户”。我建议将其与您的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实际上是带有指向127.0.0.1的hosts文件条目的本地框。Localhost也可能在这里工作。

有用的文章:

解决MSDeploy问题

更多故障排除


6
仅供参考-/ p:SkipExtraFilesOnServer = true保留现有站点。
NotMe 2010年

@Chris我一直在寻找该物业
Joseph

@Joseph:我不记得我在哪里找到它了,但是很高兴这对您有所帮助!
NotMe 2010年

一个问题给你。/ p:DeployTarget = MSDeployPusblish可用于我的TFS托管版本,以在完成时自行部署。唯一的问题是web.config转换错误。有没有一种方法可以强制web.config转换对特定配置起作用?
Michael McCarthy 2012年

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

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


我将要进行一些工作,以详细介绍这些技术,但不会持续很长时间,而且我仍然有很多事情需要自己解决。

您可以尝试使用用户名/密码交易,让我知道它是否对您有用吗?


我设法最终使其正常运行,但只能通过WMSVC而不是RemoteAgent。无论我尝试使用哪个URL,都无法将其连接到远程代理
Simon_Weaver 2010年

1
好,现在您提到它,我认为https需要WMSVC。我没有注意到这一点。
易卜拉欣(Ibrahim Hashimi)说

1
我很确定我尝试过有没有。我并不在乎我使用的是什么-我只是看不到为什么RemoteAgent无法正常工作
Simon_Weaver

是否可以使用Windows身份验证而不是编码用户名和密码?
马斯洛

有人说对WMSVC的评论对我来说至关重要,如果您尝试将https地址添加到msdeploy服务中,那么它也会附加一个http地址。如果从“ RemoteAgent”切换到WMSVC,则将带有https的地址作为文字,然后对我有用。
参议员2014年

6

我有一个类似的问题,解决方案是使用以下参数:

/ p:MSDeployPublishMethod = RemoteAgent

这是我使用的所有参数。

/ p:DeployOnBuild =真实/ 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应用程序。我确实注意到,Package文件不再包含在MyWebApplication_Package文件夹中,但这对我来说并不重要。


我已经尝试过各种MsDeployServiceUrl的变体。我总是收到这样的消息:VsMsdeploy失败。(无法联系远程代理(URL localhost / MSDEPLOYAGENTSERVICE?site = staging.example.com。请确保已在目标计算机上安装并启动了远程代理服务。)错误详细信息:无法联系远程代理(URL localhost / MSDEPLOYAGENTSERVICE?site = staging.rollingrazor.com
Simon_Weaver 2010年

看来这应该可行-但这几乎就是维沙尔在讲话中所说的。该代理服务肯定是可访问的:如果我在浏览器中单击localhost / MSDEPLOYAGENTSERVICE,则在C:\ Windows \ ServiceProfiles \ NetworkService \ AppData \ Local \ Temp \ MSDepSvc.log中添加日志条目
Simon_Weaver,2010年

1
您如何指定三个应用程序在一个解决方案中的部署位置?
GWLlosa 2011年

4

请注意,您还可以设置DeployTarget = Package -这将准备软件包,但不会立即进行部署。有关更多信息,请参见此博客文章


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构建代理的凭据进行部署)。在这里查看已接受的答案


3

这是我如何使其工作的方法。这是与Webdeploy 2.0一起使用的。我正在从构建机器到开发Web服务器机器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 =“默认网站/ YourpplicationNameHere” /p:MsDeployServiceUrl=https://devserver02:8172/msdeploy.axd / p:AllowUntrustedCertificate = True / p:UserName = yourDomain \ buildaccount / p:Password = password

  1. 我最初遇到的问题是“ Default Web Site / YourpplicationNameHere”周围的引号,它给出了部分错误:

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

    当默认网站/ 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 =默认网站)。确保在目标计算机上安装并启动了远程代理服务。)确保站点名称,用户名和密码正确。如果问题仍未解决,请与本地或服务器管理员联系。错误详细信息:远程代理(URL https:// devserver02:8172 / msdeploy.axd?site = Default网站)无法联系。确保在目标计算机上安装并启动了远程代理服务。收到不支持的回复。响应标头“ MSDeploy.Response”为“”,但应为“ v1”。远程服务器返回错误:(401)未经授权。

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

我希望这是可以答复的,我想出了一些其他可怜的人,发现了这些错误,这可能会有所帮助...


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 +“ _PublishedWebsites”,并为目标创建了一个名为“ DeployPath”的自变量,该自变量可以填充到构建配置中。

  • 现在,在调用CopyDirectory活动之前,我仍然必须执行测试以检查构建是否成功。我提到的文章展示了如何做到这一点。他们还讲授了如何调用Powershell脚本而不是CopyDirectory。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.