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

Vishal Joshi 有一个很棒的 PDC 演讲 可在此下载,它描述了 Visual Studio 2010中新的 MSDEPLOY 特性——以及如何在 TFS 中部署应用程序。(这里也有一个来自 斯科特 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文件,它会完美地部署。如果我通过 VisualStudio 运行 WebDeploy,它也能很好地工作。

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

附言。是的,我的 Web Deployment Agent Service正在运行。我还在 IIS 下运行管理服务。我都试过了。


Args I'm using :

/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.韦伯。Target (2660) : VsMsdepartment 失败。(无法联系远程代理(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”。响应’是”,但‘ v1’是预期的。远程服务器返回一个错误: (401)未授权。

38498 次浏览

不幸的是,目前这方面的信息不多。不过,在这条信息的最后,我会给你一些提示。


About your problem, I've seen this before when I was trying to deploy using MSDeploy and the account that I was running on didn't have the permissions to execute the deployment on the target machine. So you need to take a look at the account that your builds are running under, and see if this account has the rights to deploy to the target machine. If not then you have a few options; grant the build user the rights, or pass the username/password in.

如果您想要传递这些值,那么您必须定义一个名为 MsDeployDestinationProviderSetting的项,并且它的元数据必须包含必要的值。

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

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

关于在哪里可以找到文档,就像我之前说的,还没有太多的文档。但是,由于整个 Web 发布管道都是在 MSBuild 目标和任务中捕获的,因此如果您熟悉 MSBuild,则可以自己学习很多东西。如果你看一下。Csproj (或。Vbproj)用 Visual Studio 2010创建的 web 项目的文件你会注意到如下语句:

<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

因此,为了学习这个主题的细节,现在你必须检查这些文件和自己学习。


我将致力于研究这些技术的细节,但这些技术还需要很长一段时间才能发布,我还有很多东西需要自己去弄明白。

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

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

/p: MSDeployPublishMethod = 远程代理

下面是我使用的所有参数。

/p: DeployOnBuild = True/p: DeployTarget = MSDeployPublishMethod = 远程代理/p: MsDeployServiceUrl = http://my-server-name/p: username = myusername/p: password = mypassword

NOTE: I'm not using DeployIisAppPath because I'm building a solution and trying to build three web applications at once. Also I think your MsDeployServiceUrl should be just http://staging.example.com

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

这些步骤对我来说终于奏效了。 我想让远程代理工作,但无论我怎么努力都不能让它工作。

你没必要这么做,但我就是这么做到的

  • Configure WMSVC
  • 确保服务已启动
  • Configure an IIS user (click on the TOP MOST SERVERNAME in IIS) and go to 'IIS Manager Users'. I suggest making it different to your windows name.
  • 确保 WMSVC (LOCALSERVICE)的用户帐户对您正在使用的 IIS 目录具有写权限
  • 在我的例子中,我使用 SSL 证书(即使它命中 localhost)。

Remember these are all arguments to MSBUILD added within the TFS Build definition

/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

Note: staging.example.com is actually the local box with a 主机文件 entry pointing to 127.0.0.1. Localhost would probably work here too.

有用文章:

MSDeploy 问题疑难解答

更多的故障排除

Note that you can also set DeployTarget=Package -- this will prepare the package but not deploy it right away. For more info see 这篇博文.

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

You only need to specify the server name, and not the full path (no http needed).

注意,为了解决 NTLM 身份验证的 bug,UserName 保留为空(这样它使用部署的 TFS 构建代理的凭据)。见 这里接受的答案

Here's how I got it to work. This was with Webdeploy 2.0. I am deploying on the same domain from our build machine to a dev webserver machine windows server 2008 r2. The account I am using to deploy is a service account on the domain that has administrator permissions on both machines. My solution includes a couple of unit test projects, an mvc3 project, and a couple of libraries under the solution. If you don't install MVC3 on the server you are deploying to look at http://www.iwantmymvc.com/2011-03-23-bin-deploy-aspnet-mvc-3-visual-studio for guidance.

/p: DeployonBuild = True/p: DeployTarget = MSDeployPublish/p: DeployIisAppPath = “ Default Web Site/YourplicationNameHere”/p: msDeployServiceUrl = https://devserver02:8172/msdeploy.axd /p: AllowUntrust d證书 = 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.韦伯。Publishing.target (3588) : Web 部署任务失败。(无法联系远程代理(URL https://devserver02:8172/msdeploy.axd?site=Default网站)。确保在目标计算机上安装并启动了远程代理服务。)确保网站名称、用户名和密码正确。如果问题没有解决,请与本地或服务器管理员联系。错误详细信息: 无法联系远程代理(URL https://devserver02:8172/msdeploy.axd?site=Default网站)。确保在目标计算机上安装并启动了远程代理服务。收到了未经支持的响应。响应头“ MSDeploy”。响应’是”,但‘ v1’是预期的。远程服务器返回一个错误: (401)未授权。

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

我希望这是确定的答复,我想其他一些可怜的灵魂与发现这些错误,这可以帮助..。

IIS7 + 相关答案..。

好吧,这就是我最后做的。或多或少,跟随 西蒙 · 韦弗的帖子在这个帖子/问题。

But when it comes to the MSBuild settings .. most people here are using following setting: /p:MSDeployPublishMethod=RemoteAgent which is 不对 for IIS7. Using this setting means TFS tries to connect to the url: https://your-server-name/MSDEPLOYAGENTSERVICE But to access that url, the user to authenticate needs to be an Admin. Which is fraked. (And you need to have the Admin-override rule thingy ticked). This url is for IIS6 I think.

下面是尝试使用 RemoteAgent 进行连接时的标准错误消息:-

标准401操你妈的远程代理,错误

C: 程序文件 (x86) MSBuild MicrosoftVisualStudio v10.0 WebMicrosoft.Web.Publishing.target (3588) : Web 部署任务 失败。(远程代理(URL Http://your-web-server/msdeployagentservice 无法联络。请确保 远程代理服务已安装,并且 在目标计算机上开始) 确认网站名称、用户名称和 密码正确。如果问题是 未解决,请联系您的 本地或服务器管理员。错误 详细信息: 远程代理(URL http://your-web-server/MSDEPLOYAGENTSERVICE) 无法联络。请确保 远程代理服务已安装,并且 在目标计算机上启动 收到未经证实的回应 响应头‘ MSDeploy.Response’ 是’V1’,但’V1’是预期的 远程服务器返回一个错误: (401) 未经授权。

所以. . 你需要把你的 MSDeployPublishMethod改成这样:

/p:MSDeployPublishMethod=WMSVC

The WMSVC stands for Windows Manager Service. It's basically a newer wrapper over the Remote Agent but now allows us to correct provide a user name and password .. where the user does NOT have to be an admin! (joy!) So now you can correct set which users u want to have access to .. per WebSite ..

enter image description here

它现在还尝试点击 url: 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

注意到用户名中有域名吗?你需要那个。另外,在我的照片中,我已经允许我们的域名用户访问网站的管理。因此,我添加的新用户帐户(TFSBuildService)具有 Domain Users组的成员资格... ... 所以这就是它的工作原理。

现在——如果你已经读完了所有这些,那就来一个笑猫吧(因为它们是 SOOOOOO2007) ... ..。

enter image description here

如果可以使用 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 工作流步骤,将源配置为 BuildDetails。DropLocation + “ _ PublishedWebites”,对于目标,我创建了一个参数,我称之为“ DeployPath”,它可以在构建配置中填充。

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