NDepend ist ein Tool, welches Abhängigkeiten zwischen .NET Komponenten misst. Das ganze gibt es als Fatclient, welches sich hervorragend in Visual Studio integriert und es gibt eine Konsolenanwendung, welche man in seinem Buildprozess integrieren kann - zum Erzeugen von Reports. Wie das ganze geht zeig ich euch...
Was benötigt man?
Für das erste Erstellen der NDepend Datei und eine bessere Auswertung ist natürlich der Fatclient ein Must-Have. Allerdings denke ich nicht, dass jeder das Tool installiert haben muss. Ich fokusiere mich hier vor allem auf den Einsatz von NDepend im Buildprozess, daher:
Am wichtigsten ist die Installation auf dem Buildserver :)
Kurz zur allgemeinen Erklärung von NDepend: Das Tool muss man für jeden Entwickler bzw. jede Buildmaschine lizensieren. Die genauen Lizenzdetails findet man auf der NDepend Seite.
NDepend Quickstart
Wie man mit NDepend startet ist in diesem Video recht gut erklärt: Getting started. Einen guten Überblick und eigene Eindrücke gibt es auch hier nachzulesen:
Was wir für das weitere Vorgehen brauchen ist die .ndproj Datei. Diese sollte am Ende rauskommen. Bei dem BizzBingo.de Projekt (Codeplex) haben wir die Datei mit in der SLN:
Die ndproj beschreibt alle Einstellungen von NDepend für das Projekt. Das ganze ist eine XML Datei.
.ndproj
Um ein Gefühl für die Datei zu bekommen hier ein stark verkürzter Einblick:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <NDepend AppName="BusinessBingo" Platform="DotNet"> <OutputDir KeepHistoric="True" KeepXmlFiles="True">C:\TFS\bb\Main\Source\NDependOut</OutputDir> <Assemblies> <Name>BusinessBingo.Data</Name> <Name>BusinessBingo.Model</Name> <Name>ASSEMBLIES...</Name> ... </Assemblies> <FrameworkAssemblies /> <Dirs> <Dir>INPUT DIRs</Dir> <Dir>C:\Windows\Microsoft.NET\Framework\v4.0.30319</Dir> </Dirs> ... <CQLQueries...> </NDepend>
- Assemblies: Alle .NET Assemblies, welche NDepend für die Abhängigkeiten mit beachtet
- Dirs: Hier werden die Ordner beschrieben in denen die Assemblies liegen - diese Property kann man über die Konsole auch mit reingeben. Dazu später mehr
- Dann folgen noch weitere Einstellungen, welche hier erst mal keine weitere Bedeutung haben.
- Die CQLQueries definieren die Codemetriken und ob dies als "Warning” oder "Error” gewertet werden soll. Spielt aber erst einmal auch keine Rolle :)
TeamCity
NDepend wird bei BizzBingo im Night Build mit ausgeführt. Der Nightly Build hat momentan vier Schritte:
- SLN Bauen
- NUnit (ist hier auch egal)
- NDepend
- Duplicate Finder (ist hier egal)
Für NDepend ist a) das bauen wichtig und b) das Ausführen des Konsolenprogramms für NDepend. Für das analysieren benötige ich die Assemblies und ich baue einfach die SLN. Das ist nicht der beste Weg, aber passt schon:
Nun kommt NDepend. Wenn man die Version für die Buildmaschine installiert, gibt es das Konsolenprogramm mit. Dem Konsolenprogramm kann man bestimmte Eigenschaften, wie z.B. das "Quellverzeichnis” für die Assemblies und das "Zielverzeichnis” für den generierten Report als Parameter mitgeben. Im TeamCity sieht das so aus:
Command: (je nachdem wo man es installiert)
"C:\NDepend\NDepend.Console.exe"
Parameters:
"%system.teamcity.build.checkoutDir%\Main\Docs\CodeQuality\BusinessBingo.ndproj" /OutDir "%system.teamcity.build.checkoutDir%\NDependOut" /InDirs "%system.teamcity.build.checkoutDir%\Main\Source\BusinessBingo\Source\BusinessBingo.Web\bin\"
- Erster Parameter gibt den Ort der .ndproj Datei an. %system.teamcity.build.checkoutDir% ist ein Platzhalter, welcher von TeamCity während des Buildvorgangs entsprechend ersetzt wird
- Als OutDir gebe ich "NDependOut” im checkoutDir an.
- Als InDir gebe ich das bin Verzeichnis der Webapplikation an -hier könnte man auch auf andere Ordner etc. verweisen.
TeamCity Artefakte und den NDepend Report integrieren
Nachdem nun das eingerichtet ist, kommen wir zum Konzept der Artefakte in TeamCity. Ein Artefakt kann alles sein: Eine Assembly, ein Bild, ein HTML Template etc. -
Bei BizzBingo.de haben wir im TeamCity für den Nightlybuild momentan folgende Artefakte eingestellt:
%system.teamcity.build.checkoutDir%\Main\Source\BusinessBingo\Source\BusinessBingo.Web\bin\BusinessBingo.*.dll => Assemblies %system.teamcity.build.checkoutDir%\Main\Source\BusinessBingo\Source\BusinessBingo.Web\bin\BusinessBingo.*.pdb => Assemblies %system.teamcity.build.checkoutDir%\NDependOut\**\* => Reports\NDepend %system.teamcity.build.checkoutDir%\Main\Docs\HtmlTemplate\**\* => HtmlTemplate.zip
Die ersten beiden sind die Dlls/Pdbs - der "=>” gibt an, in welchen Artefaktordner es kopiert werden soll. Dabei können Wildcards eingesetzt werden oder wie in Zeile 4 kann man auch Datein automatisch zippen lassen.
Ergebnis:
Wichtig ist hier Zeile 3. Dort nehmen wir die generierten Report Daten aus dem Buildschritt vom "NDependOut” Dir und verschieben diese zum Artefaktpfad Reports\NDepend.
NDepend Reports Tab integrieren
Um nun noch den HTML Report im TeamCity anzuzeigen muss man in der Serverkonfiguration folgendes noch einstellen:
Für jeden Build wird der Report gesucht. Wenn die Datei bei den Artefakten im Build gefunden wird, wird auch der Report Tab angezeigt:
Fertig.
TL;DR
Wichtigste Schritte:
- .ndproj Datei anlegen
- NDepend auf Buildserver installieren
- Die Assemblies, welche in der .ndproj Datei drin stehen müssen irgendwie gebaut werden oder als Artefakt vorliegen
- Den erzeugten Report als Artefakt im TeamCity ablegen
- TeamCity den "NDepend Report” in der Serververwaltung bekannt machen
- Anschauen :)
Troy Hunts Blogpost hat mir dabei auch sehr geholfen. Die NDepend Analyse basierte bei ihm allerdings auf den Artefakten eines anderen Builds - das würde die TeamCity Funktionen noch etwas mehr ausreizen - es funktioniert aber auch so prima :)