2011-03-10 13 views
17

Parece que no hay sobrecargas de IBuildServer.QueryBuilds(...) que me permita hacer eso.API de TFS: cómo consultar compilaciones independientemente de la definición de compilación a la que pertenecen

Aquí está mi código:

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

no quiero especificar la definición de construcción, debido a la acumulación Quiero puede ser de cualquier tipo.

Esta pregunta parece fácil, pero Google no me dio ninguna respuesta.

Respuesta

45

Este código obtendrá todas las compilaciones. . . Alguna vez

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); 
    }    
} 

Sin embargo, es probable que más interesa en este código, que enumera cada proyecto de equipo y consigue el estado más reciente de construcción para cada una de las definiciones:

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(); 
} 
+0

¡Muchas gracias! –

+1

tfs.GetService () funciona con TFS 2015 API – Robin

6

Se puede utilizar el siguiente enfoque (inspirado en el artículo http://www.incyclesoftware.com/2012/09/fastest-way-to-get-list-of-builds-using-ibuildserver-querybuilds-2/): - (! de mis propias pruebas - alrededor de 50 veces más rápido)

Beneficio respuesta mucho más rápida

//Connect to TFS build server 
string serverName = "http://myserver:8080/tfs/my_collection"; 
Uri tfsUri = new Uri(serverName); 
TeamFoundationServer tfsServer = TeamFoundationServerFactory.GetServer(serverName); 
IBuildServer buildServer = (IBuildServer)tfsServer.GetService(typeof(IBuildServer)); 
ILinking iLinkingService = tfsServer.GetService<ILinking>(); //can be used later to get build URL link 


//Specify query 
IBuildDetailSpec spec = buildServer.CreateBuildDetailSpec("*"); 
spec.InformationTypes = null; // for speed improvement 
spec.MinFinishTime = DateTime.Now.AddDays(-21); //to get only builds of last 3 weeks 
spec.MaxBuildsPerDefinition = 1; //get only one build per build definintion 
spec.QueryOrder = BuildQueryOrder.FinishTimeDescending; //get the latest build only 
spec.QueryOptions = QueryOptions.All; 

var builds = buildServer.QueryBuilds(spec).Builds; 
Cuestiones relacionadas