查询和操纵TFS构建服务器代理状态

时间:2016-09-28 17:24:38

标签: tfs msbuild tfsbuild

我试图使用TFS构建扩展来操纵构建代理的状态。 QueryBuildAgentStatus和SetBuildAgentStatus看起来完全相同,查询活动没有结果参数。
如何查询构建代理状态并进行更改?

-Thanks

1 个答案:

答案 0 :(得分:0)

假设您正在使用XAML Build,我尝试在TFS数据库中的[Tfs_DefaultCollection].[dbo].[tbl_BuildAgent]中监视构建代理状态。

如果构建代理就绪,您可以在tbl_BuildAgent中看到状态已启用为“ 1 “和” 1 “。如果禁用构建代理,您可以在tbl_BuildAgent中看到状态已启用为“ 1 ”和“的 0 ”。如果停止在启用了构建代理的情况下构建服务,那么构建代理也会停止,您可以在tbl_BuildAgent中看到状态已启用是“ 2 “和” 1 “。

一般来说,XAML构建代理具有就绪停止状态(不确定您要更改什么)。如果要停止构建代理,只需停止构建服务。

以下是LinqPad query to get Build agents status and build queue,您可以查看一下:

var tfs = TfsTeamProjectCollectionFactory
 .GetTeamProjectCollection(new Uri("http://localhost:8088/tfs"));

tfs.EnsureAuthenticated();

var buildServer = tfs.GetService<IBuildServer>();

var queryAgents = buildServer.QueryBuildAgents(buildServer.CreateBuildAgentSpec());
queryAgents.Agents
 .Select(x => new
 {
  x.MachineName,
  Controller = x.Controller.Name,
  x.Enabled,
  x.Status,
  x.QueueCount
 })
 .Dump("TFS build agents");

queryAgents.Agents
 .SelectMany(x => ServiceController.GetServices(x.ServiceHost.Name)
  .Where(s => s.ServiceName.StartsWith("TFSBuildServiceHost")))
 .Select(x => new
 {
  x.MachineName,
  x.ServiceName,
  x.Status
 })
 .Dump("Windows Services of build agents");

buildServer
 .QueryQueuedBuilds(buildServer.CreateBuildQueueSpec("*"))
 .QueuedBuilds
 .Select(x => new
 {
  x.TeamProject,
  BuildDefinition = x.BuildDefinition.Name,
  x.QueuePosition,
  x.QueueTime,
  x.Priority,
  x.CustomGetVersion,
  x.RequestedFor,
  x.Reason,
  x.Status
 })
 .OrderBy(x => x.QueuePosition)
 .Dump("Queued builds");