TFS 2010 API,确定构建正在哪个构建服务器上运行。
抱歉,这几乎肯定是这个问题的重复,但正因为如此还没有人回答我要再试一次。
我正在尝试构建一个工具,它允许我查看所有在 TFS 上排队或运行的构建。
要求之一是能够查看构建正在哪个构建服务器上运行。 IQueuedBuildsView 中的所有“BuildAgent”属性和方法均已弃用,并引发未实现的异常。查询代理的方法有很多,但您需要代理 uri 或名称才能执行此操作,我觉得我处于先有鸡还是先有蛋的情况。
有谁知道如何查找正在运行的构建的构建服务器名称?我下面的代码片段可能会有所帮助。
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Text;
using Microsoft.TeamFoundation.Server;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Framework.Client;
using Microsoft.TeamFoundation.Framework.Common;
using Microsoft.TeamFoundation.Client;
namespace TeamFoundationServerTools
{
public static class TeamBuildData
{
public static void Main()
{
Uri teamFoundationServerUri = new Uri("http://tfs:8080/tfs");
Uri teamFoudationServerProjectCollectionUri = new Uri("http://tfs:8080/tfs/collection");
string teamFoundationServerName = "tfs";
string teamFoundationServerProjectCollectionName = string.Empty;
string teamFoundationServerProjectName = string.Empty;
try
{
Dictionary<string, Uri> collections = new Dictionary<string, Uri>();
if (string.IsNullOrEmpty(teamFoundationServerProjectCollectionName))
{
DetermineCollections(teamFoundationServerUri, collections);
}
else
{
collections.Add(teamFoundationServerName, teamFoudationServerProjectCollectionUri);
}
QueryCollections(teamFoundationServerName, teamFoundationServerProjectName, collections);
}
catch (Exception ex)
{
Console.Write(ex.ToString());
}
}
/// <summary>
/// Queries the Team project collection for team builds
/// </summary>
/// <param name="teamFoundationServerName">the name of the TFS server</param>
/// <param name="teamFoundationServerProjectName">the name of the Team Project</param>
/// <param name="collections">the Team Project Collections to be queried</param>
private static void QueryCollections(string teamFoundationServerName, string teamFoundationServerProjectName, Dictionary<string, Uri> collections)
{
foreach (KeyValuePair<string, Uri> collection in collections)
{
// connect to the collection
using (TfsTeamProjectCollection teamProjectCollection = new TfsTeamProjectCollection(collection.Value, CredentialCache.DefaultCredentials))
{
Console.WriteLine(teamProjectCollection.Name);
IBuildServer buildServer = (IBuildServer)teamProjectCollection.GetService(typeof(IBuildServer));
// get ICommonStructureService (later to be used to list all team projects)
ICommonStructureService commonStructureService = (ICommonStructureService)teamProjectCollection.GetService(typeof(ICommonStructureService));
// I need to list all the TFS Team Projects that exist on a server
ProjectInfo[] allTeamProjects;
if (!String.IsNullOrEmpty(teamFoundationServerProjectName))
{
allTeamProjects = new ProjectInfo[1];
allTeamProjects[0] = new ProjectInfo();
allTeamProjects[0] = commonStructureService.GetProjectFromName(teamFoundationServerProjectName);
}
else
{
allTeamProjects = commonStructureService.ListProjects();
}
// iterate thru the team project list
foreach (ProjectInfo teamProjectInfo in allTeamProjects)
{
Console.WriteLine(teamProjectInfo.Name);
// skip this team project if it is not WellFormed.
if (teamProjectInfo.Status != ProjectState.WellFormed)
{
continue;
}
IQueuedBuildsView queuedBuildsView = buildServer.CreateQueuedBuildsView(teamProjectInfo.Name);
queuedBuildsView.StatusFilter = QueueStatus.Queued | QueueStatus.InProgress | QueueStatus.Postponed;
queuedBuildsView.QueryOptions = QueryOptions.All;
queuedBuildsView.Refresh(false);
foreach (IQueuedBuild queuedBuild in queuedBuildsView.QueuedBuilds)
{
Console.WriteLine(queuedBuild.BuildDefinition.Name);
Console.WriteLine(queuedBuild.BuildController.Name);
Console.WriteLine(queuedBuild);
Console.WriteLine(queuedBuild.Status);
Console.WriteLine(queuedBuild.RequestedBy);
Console.WriteLine(queuedBuild.QueuePosition);
Console.WriteLine(queuedBuild.QueueTime);
Console.WriteLine(queuedBuild.Priority);
Console.WriteLine();
if (queuedBuild.Status == QueueStatus.InProgress)
{
}
Console.WriteLine("***********************");
}
}
}
}
Console.ReadLine();
}
/// <summary>
/// Determins the team project collections for a given TFS instance
/// </summary>
/// <param name="teamFoundationServerUri">the uri of the Team Foundation Server</param>
/// <param name="collections">a dictionary of collections to be added to</param>
private static void DetermineCollections(Uri teamFoundationServerUri, Dictionary<string, Uri> collections)
{
// get a list of Team Project Collections and their URI's
using (TfsConfigurationServer tfsConfigurationServer = new TfsConfigurationServer(teamFoundationServerUri))
{
CatalogNode configurationServerNode = tfsConfigurationServer.CatalogNode;
// Query the children of the configuration server node for all of the team project collection nodes
ReadOnlyCollection<CatalogNode> tpcNodes = configurationServerNode.QueryChildren(
new Guid[] { CatalogResourceTypes.ProjectCollection },
false,
CatalogQueryOptions.None);
foreach (CatalogNode tpcNode in tpcNodes)
{
ServiceDefinition tpcServiceDefinition = tpcNode.Resource.ServiceReferences["Location"];
ILocationService configLocationService = tfsConfigurationServer.GetService<ILocationService>();
Uri tpcUri = new Uri(configLocationService.LocationForCurrentConnection(tpcServiceDefinition));
collections.Add(tpcNode.Resource.DisplayName, tpcUri);
}
}
}
}
}
Apologies, this is almost certainly a duplicate of this question but as that one hasn't been answered I'm going to try again.
I'm trying to build a tool which will allow me to see all of the builds either Queued or Running on TFS.
One of the requirements is to be able to see which build server a build is running on. All of the "BuildAgent" properties and methods in the IQueuedBuildsView are deprecated and throw not implemented exceptions. There are lots of ways of querying an agent but you need the agent uri or name before you can do that and I feel like I'm in a chicken and egg situation.
Does anyone know how to find the build server name for a running build? My code snippet below might help.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Text;
using Microsoft.TeamFoundation.Server;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Framework.Client;
using Microsoft.TeamFoundation.Framework.Common;
using Microsoft.TeamFoundation.Client;
namespace TeamFoundationServerTools
{
public static class TeamBuildData
{
public static void Main()
{
Uri teamFoundationServerUri = new Uri("http://tfs:8080/tfs");
Uri teamFoudationServerProjectCollectionUri = new Uri("http://tfs:8080/tfs/collection");
string teamFoundationServerName = "tfs";
string teamFoundationServerProjectCollectionName = string.Empty;
string teamFoundationServerProjectName = string.Empty;
try
{
Dictionary<string, Uri> collections = new Dictionary<string, Uri>();
if (string.IsNullOrEmpty(teamFoundationServerProjectCollectionName))
{
DetermineCollections(teamFoundationServerUri, collections);
}
else
{
collections.Add(teamFoundationServerName, teamFoudationServerProjectCollectionUri);
}
QueryCollections(teamFoundationServerName, teamFoundationServerProjectName, collections);
}
catch (Exception ex)
{
Console.Write(ex.ToString());
}
}
/// <summary>
/// Queries the Team project collection for team builds
/// </summary>
/// <param name="teamFoundationServerName">the name of the TFS server</param>
/// <param name="teamFoundationServerProjectName">the name of the Team Project</param>
/// <param name="collections">the Team Project Collections to be queried</param>
private static void QueryCollections(string teamFoundationServerName, string teamFoundationServerProjectName, Dictionary<string, Uri> collections)
{
foreach (KeyValuePair<string, Uri> collection in collections)
{
// connect to the collection
using (TfsTeamProjectCollection teamProjectCollection = new TfsTeamProjectCollection(collection.Value, CredentialCache.DefaultCredentials))
{
Console.WriteLine(teamProjectCollection.Name);
IBuildServer buildServer = (IBuildServer)teamProjectCollection.GetService(typeof(IBuildServer));
// get ICommonStructureService (later to be used to list all team projects)
ICommonStructureService commonStructureService = (ICommonStructureService)teamProjectCollection.GetService(typeof(ICommonStructureService));
// I need to list all the TFS Team Projects that exist on a server
ProjectInfo[] allTeamProjects;
if (!String.IsNullOrEmpty(teamFoundationServerProjectName))
{
allTeamProjects = new ProjectInfo[1];
allTeamProjects[0] = new ProjectInfo();
allTeamProjects[0] = commonStructureService.GetProjectFromName(teamFoundationServerProjectName);
}
else
{
allTeamProjects = commonStructureService.ListProjects();
}
// iterate thru the team project list
foreach (ProjectInfo teamProjectInfo in allTeamProjects)
{
Console.WriteLine(teamProjectInfo.Name);
// skip this team project if it is not WellFormed.
if (teamProjectInfo.Status != ProjectState.WellFormed)
{
continue;
}
IQueuedBuildsView queuedBuildsView = buildServer.CreateQueuedBuildsView(teamProjectInfo.Name);
queuedBuildsView.StatusFilter = QueueStatus.Queued | QueueStatus.InProgress | QueueStatus.Postponed;
queuedBuildsView.QueryOptions = QueryOptions.All;
queuedBuildsView.Refresh(false);
foreach (IQueuedBuild queuedBuild in queuedBuildsView.QueuedBuilds)
{
Console.WriteLine(queuedBuild.BuildDefinition.Name);
Console.WriteLine(queuedBuild.BuildController.Name);
Console.WriteLine(queuedBuild);
Console.WriteLine(queuedBuild.Status);
Console.WriteLine(queuedBuild.RequestedBy);
Console.WriteLine(queuedBuild.QueuePosition);
Console.WriteLine(queuedBuild.QueueTime);
Console.WriteLine(queuedBuild.Priority);
Console.WriteLine();
if (queuedBuild.Status == QueueStatus.InProgress)
{
}
Console.WriteLine("***********************");
}
}
}
}
Console.ReadLine();
}
/// <summary>
/// Determins the team project collections for a given TFS instance
/// </summary>
/// <param name="teamFoundationServerUri">the uri of the Team Foundation Server</param>
/// <param name="collections">a dictionary of collections to be added to</param>
private static void DetermineCollections(Uri teamFoundationServerUri, Dictionary<string, Uri> collections)
{
// get a list of Team Project Collections and their URI's
using (TfsConfigurationServer tfsConfigurationServer = new TfsConfigurationServer(teamFoundationServerUri))
{
CatalogNode configurationServerNode = tfsConfigurationServer.CatalogNode;
// Query the children of the configuration server node for all of the team project collection nodes
ReadOnlyCollection<CatalogNode> tpcNodes = configurationServerNode.QueryChildren(
new Guid[] { CatalogResourceTypes.ProjectCollection },
false,
CatalogQueryOptions.None);
foreach (CatalogNode tpcNode in tpcNodes)
{
ServiceDefinition tpcServiceDefinition = tpcNode.Resource.ServiceReferences["Location"];
ILocationService configLocationService = tfsConfigurationServer.GetService<ILocationService>();
Uri tpcUri = new Uri(configLocationService.LocationForCurrentConnection(tpcServiceDefinition));
collections.Add(tpcNode.Resource.DisplayName, tpcUri);
}
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我创建了一个 LinqPad 脚本来执行此操作。通过查询控制器上的所有代理,您可以看到针对每个代理运行的构建。脚本中有一些我根据自己的喜好添加的额外内容。
TFS在我的 SkyDrive 上构建代理
I created a LinqPad script to do this. By querying all the Agents on a Controller you can see the builds running against each one. There's some extra stuff in the script that I have added for my own preference.
TFS Build Agents on my SkyDrive
据我所知,你已经掌握了 90% 的代码;这是应该完成这项工作的最后 10%:
From what I see, you have 90% of the code; here is the last 10% that should finish the job:
这是一个执行相同操作的 powershell 脚本。请注意,您需要替换 tfs 服务器并构建控制器名称字符串。
Here's a powershell script to do the same. Note that you'll need to replace the tfs server and build controller name strings.