2012-04-04 6 views
6

Ich habe eine Reihe von Build-Definitionen, die basierend auf einer einzelnen Verzweigung in TFS (z. B. Main) ausgeführt werden.TFS: Abfrage nach Builds, die ein bestimmtes Changeset enthalten

Ich möchte (irgendwie) TFS abfragen, um alle Builds zu finden, die eine bestimmte von mir angegebene Änderungssatznummer enthalten, und eine Liste der Zeichenketten der Namen der Builds zurückgeben, die TFS enthält. Jede Art von App (VS-Erweiterung, CLI-App, Winforms, was auch immer) wird tun.

Hinweis: Dies ist keine 'PLZ geben Sie mir den Code' Anfrage; Ich bin bereit, es zu hoofen und daran ernsthaft zu arbeiten. Beliebige Hinweise auf die Dokumentation zum Abfragen der Datenbank oder des SDK oder ein Beispiel zum Abfragen von Builds; nur ein Ort, um mit dem Suchen anzufangen, wäre sehr hilfreich. Vielen Dank.

Antwort

8

Der folgende Ausschnitt kriechen alle Build-Definitionen aller Team-Projekt einer Sammlung und wird jeweils überprüfen und jeder bauen für eine Vereinigung mit dem Eingang changeset Nummer:

using System; 
using System.Linq; 
using Microsoft.TeamFoundation.Build.Client; 
using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.VersionControl.Client; 

namespace FindChangesetInBuild 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://tfs:8080/tfs/collectionName")); 

      var versionControl = teamProjectCollection.GetService<VersionControlServer>(); 
      var buildService = (IBuildServer)teamProjectCollection.GetService(typeof(IBuildServer)); 

      var teamProjects = versionControl.GetAllTeamProjects(true); 
      foreach (var teamProject in teamProjects) 
      { 
       var buildDefinitions = buildService.QueryBuildDefinitions(teamProject.Name); 
       foreach (var buildDefinition in buildDefinitions) 
       { 
        var builds = buildService.QueryBuilds(buildDefinition); 
        foreach (var buildDetail in builds) 
        { 
         var changesets = InformationNodeConverters.GetAssociatedChangesets(buildDetail); 
         if (changesets.Any(changesetSummary => changesetSummary.ChangesetId == Convert.ToInt32(args[0]))) 
         { 
          Console.WriteLine("Changeset was build in "+buildDetail.BuildNumber); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Unnötig zu sagen, dies ist ein Brute-Force-Angriff.
Sie können den Code weiter verfeinern, wenn Sie die Liste von buildDefinition eingrenzen, Fokus auf bestimmte teamProjects usw. machen. Auf jeden Fall kann ich mir kaum vorstellen, dass das Obige so nützlich wie es ist!

Abgesehen von (offensichtlich) MSDN, eine große Ressource für TFS-SDK ist Shai Raiten blog.
Für Build-Spicicic Beispiele, überprüfen Sie auch here & here für einige möglicherweise interessante SO-Beiträge.

+0

Vielen Dank! Ich wünschte, es gäbe mehr Filteroptionen bei der Abfrage; Wir haben eine Reihe von Builds, für die wir Informationen behalten, und es dauert sehr lange, bis die Abfragen zurückgegeben werden. Ich werde experimentieren und sehen. –

2

Sie können diese kleine DB-Abfrage in TFS 2010 verwenden und einfach 90264 mit Ihrer Änderungssatz-ID ersetzen.

USE Tfs_Warehouse 
go 
SELECT BuildName 
FROM DimBuild 
    INNER JOIN FactBuildChangeset 
    ON DimBuild.BuildSK = FactBuildChangeset.BuildSK 
WHERE FactBuildChangeset.ChangesetSK = 90264