19 August 2013 Build Server, TFS Robert Muehsig

Der Team Foundation Server bietet On-Premise und  als “Cloud-TFS” (Team Foundation Services) einge ganze Reihen von “Diensten” (Build, WorkItems, Source Control, …) an – diese Dienste lassen sich auch recht einfach über .NET APIs abfragen.

In dem Blogpost möchte ich einfach die letzten Build Ergebnisse eines Team-Projekts abfragen.

Benötigte Assemblies

Für das Abfragen der Builds werden nicht alle der 5 Assemblies benötigt, allerdings kommt man früher oder später an dem Punkt wo man sie evtl. brauchen könnte. Die Assemblies liegen alle im Visual Studio Installationsverzeichnis (C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0 – für VS 2012) und können von dort kopiert werden und in die eigene Solution integriert werden.

Hier die Liste der Assemblies:

- Microsoft.TeamFoundation.Client.dll
- Microsoft.TeamFoundation.Common.dll
- Microsoft.TeamFoundation.VersionControl.Client.dll
- Microsoft.TeamFoundation.Build.Common.dll
- Microsoft.TeamFoundation.Build.Client.dll

Achtung: Im IIS AppPool (falls man dies via einer WebApp nutzen möchte) muss "Enable 32bit Applications" aktiv sein! Die Assemblies scheinen mindestens zum Teil 32bit Assemblies zu sein bzw. ging es ohne diese Einstellung einfach nicht.

Demo Code:

Über die API greife ich in dem Fall auf den Team Foundation Service zurück.

class Program
    {
        static void Main(string[] args)
        {
            // Auth with UserName & Password (Microsoft Acc):
            //BasicAuthCredential basicCred = new BasicAuthCredential(new NetworkCredential("[email protected]", "pw"));
            //TfsClientCredentials tfsCred = new TfsClientCredentials(basicCred);
            //tfsCred.AllowInteractive = false;
            //
            //TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("https://code-inside.visualstudio.com/DefaultCollection"), tfsCred);

            TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("https://code-inside.visualstudio.com/DefaultCollection"));

            IBuildServer buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));

            var builds = buildServer.QueryBuilds("DrinkHub");

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

            // Detailed via http://www.incyclesoftware.com/2012/09/fastest-way-to-get-list-of-builds-using-ibuildserver-querybuilds-2/

            var buildSpec = buildServer.CreateBuildDetailSpec("DrinkHub", "Main.Continuous");
            buildSpec.InformationTypes = null;
            var buildDetails = buildServer.QueryBuilds(buildSpec).Builds;

            Console.WriteLine(buildDetails.First().Status);

            Console.ReadLine();
        }
    }

image

Wie funktioniert das mit der Authentifizierung?

Im Grunde läuft die API immer unter den Credentials des Users – wenn man auf den Team Foundation Service zugreift wird automatisch der Microsoft Account genommen. OnPremise wird der Windows Account genommen.

Falls der angemeldete User nicht passt wird ein Authentifizierungsfenster angezeigt. Im Falle der Code läuft auf einem Server ist dies allerdings nicht gerade praktisch, daher kann man auch (wie im auskommentierten Teil des Codes sehen) direkt einen User angeben – das gilt sowohl für einen Microsoft Account als auch einen Windows Account.

Fazit

Ich war positiv überrascht wie schnell man an die Daten des TFS kommt – mal sehen was man mit der API noch machen kann.

Das komplette Projekt findet sich auch auf GitHub.


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!