2011-03-10 15 views
17

Sembra che nessun sovraccarico di IBuildServer.QueryBuilds(...) mi consenta di farlo.API TFS: come eseguire query su build indipendenti dalla definizione di build di appartenenza

Ecco il mio codice:

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

Non voglio specificare la definizione di compilazione, perché l'accumulo voglio può essere di qualsiasi tipo.

Questa domanda sembra facile, ma su Google non ho dato risposte.

risposta

45

Questo codice otterrà tutte le build. . . mai

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

Tuttavia, probabilmente siete più interessati a questo codice, che elenca ogni progetto di squadra e ottiene lo stato più recente generazione per ciascuna delle definizioni:

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

Grazie mille! –

+1

tfs.GetService () funziona con l'API TFS 2015 – Robin

6

È possibile utilizzare il seguente approccio (ispirato l'articolo http://www.incyclesoftware.com/2012/09/fastest-way-to-get-list-of-builds-using-ibuildserver-querybuilds-2/): - (! dai miei propri test - circa 50 volte più veloce)

beneficio di risposta molto più veloce

//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; 
Problemi correlati