Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TFS 2010 API, determine which build server a build is running on.

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);
                }
            }
        }
    }
}
like image 306
James Reed Avatar asked Jan 05 '12 19:01

James Reed


People also ask

How to check build definition in TFS?

In the Team Explorer window, right-click the build definition, and then click Queue New Build. In the Queue Build dialog box, review the build properties, and then click Queue.

What is TFS build server?

Team Foundation Server (TFS) is an ALM product from Microsoft which provides the capabilities for an end-to-end development and testing using Work Item Management, Project Planning (Waterfall or Scrum), Version Control, Build/Release (Deploy) and Testing capabilities.

What is build controller in TFS?

It distributes processor-intensive work: for example, compiling code or running tests, etc., to the build agents. Each build controller is dedicated to a single team project collection. Ensure that the following requirements are met: Installed the supported components on your computer.


1 Answers

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

like image 52
DaveShaw Avatar answered Sep 30 '22 14:09

DaveShaw