Search code examples
c#apitfstfsbuildbuild-definition

TFS API - How to query builds independent of which build definition they belong to


It seems no overloads of IBuildServer.QueryBuilds(...) allows me to do that.

Here's my code:

TfsTeamProjectCollection tfs = context.GetValue(TeamProject);
IBuildServer buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));
buildServer.QueryBuilds( // **what should i put here?**

I don't want to specify the build definition, because the build I want may be of any type.

This question seems easy, but googling it gave me no answers.


Solution

  • This code will get all builds . . . ever

    TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("http://tfs:8080"));
    
    var vcs = tfs.GetService<VersionControlServer>();
    
    var teamProjects = vcs.GetAllTeamProjects(true);
    
    IBuildServer buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));
    
    foreach (TeamProject proj in teamProjects)
    {
        var builds = buildServer.QueryBuilds(proj.Name);
    
        foreach (IBuildDetail build in builds)
        {
            var result = string.Format("Build {0}/{3} {4} - current status {1} - as of {2}",
            build.BuildDefinition.Name,
            build.Status.ToString(),
            build.FinishTime,
            build.LabelName,
            Environment.NewLine);
    
            System.Console.WriteLine(result);
        }            
    }
    

    However, you're probably more interested in this code, which enumerates each team project and gets the latest build status for each of the definitions:

    TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("http://tfs:8080"));
    
    var vcs = tfs.GetService<VersionControlServer>();
    
    var teamProjects = vcs.GetAllTeamProjects(true);
    
    IBuildServer buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));
    
    foreach (TeamProject proj in teamProjects)
    {
        var defs = buildServer.QueryBuildDefinitions(proj.Name);
    
        System.Console.WriteLine(string.Format("Team Project: {0}", proj.Name));
    
        foreach(IBuildDefinition def in defs)
        {
            IBuildDetailSpec spec = buildServer.CreateBuildDetailSpec(proj.Name, def.Name);
            spec.MaxBuildsPerDefinition = 1;
            spec.QueryOrder = BuildQueryOrder.FinishTimeDescending;
    
            var builds = buildServer.QueryBuilds(spec);
    
            if (builds.Builds.Length > 0)
            {
                var buildDetail = builds.Builds[0];
    
                System.Console.WriteLine(string.Format("   {0} - {1} - {2}", def.Name, buildDetail.Status.ToString(), buildDetail.FinishTime));
            }                
        }
    
        System.Console.WriteLine();
    }