2012-04-04 7 views
6

Ho un numero di definizioni di build che vengono eseguite in base a un singolo ramo in TFS (ad es. Main).TFS: query per build contenenti un changeset specifico

Mi piacerebbe (in qualche modo) interrogare TFS per trovare tutti i build contenenti un numero di changeset specifico che fornisco e restituire un elenco di stringhe dei nomi delle build contenute in TFS. Qualsiasi tipo di app (estensione VS, app CLI, winforms, qualsiasi cosa) farà.

Nota: questa non è una richiesta "plz dam me the code"; Sono disposto a fare lo zoccolo e fare un lavoro serio su questo. Qualsiasi suggerimento alla documentazione su come interrogare il database o l'SDK, o un esempio di come interrogare le build; solo un posto dove iniziare a guardare sarebbe estremamente utile. Grazie.

risposta

8

Il seguente frammento striscerà tutto costruire definizioni di tutti i team di progetto di una collezione, e controllerà ogni costruire per l'associazione al numero di ingresso di modifiche:

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

Inutile dire, questo è un attacco di forza bruta.
È possibile perfezionare ulteriormente il codice se si restringe l'elenco di buildDefinition, si concentra lo specifico su teamProjects ecc. In ogni caso non riesco a immaginare quanto sopra sia utile così com'è!

Oltre a (ovviamente) MSDN, una grande risorsa per TFS-SDK è blog di Shai Raiten.
Per esempi di Build-Speficic, controlla anche here & here per alcuni post SO interessanti.

+0

Grazie! Vorrei che ci fossero più opzioni di filtraggio disponibili durante l'interrogazione; abbiamo un certo numero di build per cui conserviamo le informazioni e ci vuole molto tempo prima che le query vengano restituite. Sperimenterò e vedrò. –

2

È possibile utilizzare questa piccola query DB in TFS 2010 e sostituire semplicemente 90264 con l'id del changeset.

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