Kuchen- und TeamCity-Integration

Cake ist ein großartiges Tool zum Erstellen einer Bereitstellungspipeline für Ihre Anwendungen. Ich liebe ihn, weil er mir erlaubt, diese Pipeline in C # zu schreiben, was ich gut kenne. Eine großartige Funktion von Cake, PSake und anderen ähnlichen Frameworks besteht darin, dass sie ein Skript erstellen, das sowohl auf dem lokalen Computer des Entwicklers als auch auf CI-Servern ausgeführt werden kann. Hier werde ich erklären, wie die Cake-Skript-Interaktion mit TeamCity organisiert wird .


Anforderungen


Ich gehe davon aus, dass Sie bereits Grundkenntnisse in Cake und TeamCity haben. Andernfalls können Sie zunächst die folgenden Ressourcen lesen:


Für Kuchen:



Für TeamCity:



Lassen Sie uns nun über das Zusammenspiel von Cake und TeamCity sprechen.


Protokollierung


Die Cake-Pipeline besteht normalerweise aus mehreren Aufgaben. Es wäre großartig, für jede dieser Aufgaben einen eigenen Abschnitt im TeamCity-Protokoll zu haben. Ich möchte für jede Kuchenaufgabe im Protokoll einen zusammenklappbaren Abschnitt erhalten:


Magazin


Die Cake-API verfügt über die Methoden TeamCity.WriteStartBuildBlock und TeamCity.WriteEndBuildBlock . Obwohl es möglich ist, sie in jeder Aufgabe zu verwenden, kann sie automatisiert werden. Cake verfügt über TaskSetup- und TaskTeardown-Methoden , die vor und nach jeder Aufgabe aufgerufen werden. Sie können TeamCity-Protokollblöcke öffnen und schließen:


TaskSetup(setupContext => { if(TeamCity.IsRunningOnTeamCity) { TeamCity.WriteStartBuildBlock(setupContext.Task.Name); } }); TaskTeardown(teardownContext => { if(TeamCity.IsRunningOnTeamCity) { TeamCity.WriteEndBuildBlock(teardownContext.Task.Name); } }); 

Hier wird die TeamCity.IsRunningOnTeamCity- Eigenschaft verwendet, um zu bestimmen, ob der Code für TeamCity gelöscht wird oder nicht.


Jetzt gibt es in unserer Zeitschrift zusammenklappbare Blöcke für jede Aufgabe. Es kann jedoch noch eine weitere Verbesserung hinzugefügt werden.


In der Regel haben Aufgaben in Cake Kurznamen: Erstellen , Testen , Reinigen . So können sie einfacher über die Befehlszeile ausgeführt werden. Aber in TeamCity hätte ich lieber detailliertere Beschreibungen der Kuchenaufgaben. Und das ist möglich. Verwenden Sie die Beschreibungsmethode, um der Aufgabe eine Beschreibung zu geben:


 Task("Clean") .Description("Create and clean folders with results") .Does(() => { ... }); 

Diese Beschreibungen können nun verwendet werden, um Blöcke im Protokoll zu bilden:


 TaskSetup(setupContext => { if(TeamCity.IsRunningOnTeamCity) { TeamCity.WriteStartBuildBlock(setupContext.Task.Description ?? setupContext.Task.Name); } }); TaskTeardown(teardownContext => { if(TeamCity.IsRunningOnTeamCity) { TeamCity.WriteEndProgress(teardownContext.Task.Description ?? teardownContext.Task.Name); } }); 

Dies verbessert die Lesbarkeit.


Fortschritte gemacht


Wenn das Cake-Skript lange dauert, ist es hilfreich zu wissen, welche Aufgabe gerade ausgeführt wird.


Fortschrittsanzeige


Dies kann mit den Methoden TeamCity.WriteStartProgress und TeamCity.WriteEndProgress erreicht werden. Ihre Aufrufe können in dasselbe TaskSetup und TaskTeardown eingefügt werden:


 TaskSetup(setupContext => { if(TeamCity.IsRunningOnTeamCity) { TeamCity.WriteStartBuildBlock(setupContext.Task.Description ?? setupContext.Task.Name); TeamCity.WriteStartProgress(setupContext.Task.Description ?? setupContext.Task.Name); } }); TaskTeardown(teardownContext => { if(TeamCity.IsRunningOnTeamCity) { TeamCity.WriteEndProgress(teardownContext.Task.Description ?? teardownContext.Task.Name); TeamCity.WriteEndBuildBlock(teardownContext.Task.Description ?? teardownContext.Task.Name); } }); 

Testergebnisse


Wenn Sie Tests in der Kuchenaufgabe ausführen, kann TeamCity Ihnen deren Ergebnisse anzeigen.



Dies kann mit der TeamCity.ImportData- Methode erfolgen. Es werden zwei Parameter benötigt: eine Zeichenfolgenbeschreibung des Datentyps und der Pfad zu der Datei, die diese Daten enthält. Wenn Sie beispielsweise MSTest verwenden, können Sie TeamCity wie folgt über die Ergebnisse der Tests informieren:


 Task("Run-Tests") .Description("Run tests") .IsDependentOn("Clean") .IsDependentOn("Build") .Does(() => { var testDllsPattern = string.Format("./**/bin/{0}/*.*Tests.dll", configuration); var testDlls = GetFiles(testDllsPattern); var testResultsFile = System.IO.Path.Combine(temporaryFolder, "testResults.trx"); MSTest(testDlls, new MSTestSettings() { ResultsFile = testResultsFile }); if(TeamCity.IsRunningOnTeamCity) { TeamCity.ImportData("mstest", testResultsFile); } }); 

TeamCity unterstützt verschiedene Arten von Tests. Zusätzlich zu mstest können Sie nunit , vstest und einige andere verwenden .


Code zur Analyse der Testabdeckung


TeamCity kann das Ergebnis der Analyse der Codeabdeckung durch Tests anzeigen.



TeamCity unterstützt derzeit die Integration mit DotCover . Lassen Sie mich Ihnen zeigen, wie Sie DotCover in einem Cake-Skript verwenden. Zunächst muss DotCover installiert werden:


 #tool "nuget:?package=JetBrains.dotCover.CommandLineTools" 

Danach kann es in folgenden Aufgaben verwendet werden:


 Task("Analyse-Test-Coverage") .Description("Analyse code coverage by tests") .IsDependentOn("Clean") .IsDependentOn("Build") .Does(() => { var coverageResultFile = System.IO.Path.Combine(temporaryFolder, "coverageResult.dcvr"); var testDllsPattern = string.Format("./**/bin/{0}/*.*Tests.dll", configuration); var testDlls = GetFiles(testDllsPattern); var testResultsFile = System.IO.Path.Combine(temporaryFolder, "testResults.trx"); DotCoverCover(tool => { tool.MSTest(testDlls, new MSTestSettings() { ResultsFile = testResultsFile }); }, new FilePath(coverageResultFile), new DotCoverCoverSettings() .WithFilter("+:Application") .WithFilter("-:Application.*Tests") ); if(TeamCity.IsRunningOnTeamCity) { TeamCity.ImportData("mstest", testResultsFile); TeamCity.ImportDotCoverCoverage(coverageResultFile); } }); 

Wie Sie sehen, werden hier auch Tests durchgeführt. Daher können wir TeamCity sofort über die Testergebnisse und die Ergebnisse der Analyse ihrer Codeabdeckung informieren. Die TeamCity.ImportDotCoverCoverage- Methode macht genau das.


Artefaktveröffentlichung


In TeamCity können Sie einige Artefakte veröffentlichen, die während der Ausführung des Cake-Skripts erstellt wurden. Ein guter Kandidat für diese Rolle sind NuGet-Pakete:



Legen Sie dazu alle Artefakte, die Sie veröffentlichen möchten, in einem Ordner ab. Anschließend können Sie mit der TeamCity.PublishArtifacts- Methode veröffentlichen:


 Task("Publish-Artifacts-On-TeamCity") .Description("Publish artifacts on TeamCity") .IsDependentOn("Create-NuGet-Package") .WithCriteria(TeamCity.IsRunningOnTeamCity) .Does(() => { TeamCity.PublishArtifacts(artifactsFolder); }); 

Fazit


Hoffentlich sparen Sie mit diesen einfachen Codebeispielen Zeit und Mühe, wenn Ihr Cake-Skript auf TeamCity ausgeführt werden soll. Die Vollversion des Skripts und die von ihm verarbeitete Anwendung finden Sie auf GitHub . Viel Glück

Source: https://habr.com/ru/post/de432814/


All Articles