2011-03-10 15 views
17

IBuildServer.QueryBuilds(...)似乎没有超载允许我这样做。TFS API - 如何查询独立于它们所属的构建定义的构建

这里是我的代码:

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

我不想指定构建定义,因为我想构建可以是任何类型的。

这个问题似乎很容易,但使用谷歌搜索它没有给我答案。

回答

45

此代码将获得所有内部版本。 。 。曾经

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

然而,你可能更感兴趣的是这个代码,其中列举了每个团队项目,并得到每个定义的最新版本状态:

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

非常感谢! – 2011-03-11 17:04:08

+1

tfs.GetService ()适用于TFS 2015 API – Robin 2016-11-02 12:05:30

6

您可以用下面的办法(本文http://www.incyclesoftware.com/2012/09/fastest-way-to-get-list-of-builds-using-ibuildserver-querybuilds-2/启发): - (!从我自己的测试 - 快约50倍),更快的响应

效益

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