Intégration de Cake et TeamCity

Cake est un excellent outil pour crĂ©er un pipeline de livraison pour vos applications. Je l'aime parce qu'il me permet d'Ă©crire ce pipeline en C #, que je connais bien. Une grande fonctionnalitĂ© de Cake, PSake et d'autres frameworks similaires est qu'ils crĂ©ent un script qui peut ĂȘtre exĂ©cutĂ© Ă  la fois sur la machine du dĂ©veloppeur local et sur les serveurs CI. Ici, je vais expliquer comment organiser l'interaction du script Cake avec TeamCity .


Prérequis


Je suppose que vous avez déjà des connaissances de base sur Cake et TeamCity. Sinon, vous pouvez commencer par lire les ressources suivantes:


Pour le gĂąteau:



Pour TeamCity:



Parlons maintenant de l'interaction de Cake et TeamCity.


Journalisation


Le pipeline Cake comprend généralement plusieurs tùches. Ce serait formidable d'avoir une section distincte pour chacune de ces tùches dans le journal TeamCity. Je voudrais obtenir une section pliable pour chaque tùche Cake dans le journal:


Magazine


L'API Cake a les mĂ©thodes TeamCity.WriteStartBuildBlock et TeamCity.WriteEndBuildBlock . Bien qu'il soit possible de les utiliser dans chaque tĂąche, il peut ĂȘtre automatisĂ©. Cake a des mĂ©thodes TaskSetup et TaskTeardown qui sont appelĂ©es avant et aprĂšs chaque tĂąche. Ils peuvent ouvrir et fermer des blocs de journaux TeamCity:


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

Ici, la propriété TeamCity.IsRunningOnTeamCity est utilisée pour déterminer si le code de TeamCity est sauté ou non.


Maintenant, dans notre magazine, il y a des blocs pliables pour chaque tĂąche. Mais une amĂ©lioration supplĂ©mentaire peut ĂȘtre ajoutĂ©e.


En rÚgle générale, les tùches dans Cake ont des noms courts: Build , Test , Clean . Ils sont donc plus faciles à exécuter à partir de la ligne de commande. Mais dans TeamCity, je préfÚre avoir des descriptions de tùches Cake plus détaillées. Et c'est possible de le faire. Pour donner une description à la tùche, utilisez la méthode Description :


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

Maintenant, ces descriptions peuvent ĂȘtre utilisĂ©es pour former des blocs dans le journal:


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

Cela améliore sa lisibilité.


ProgrÚs réalisés


Si le script Cake prend du temps, il est utile de savoir quelle tùche est en cours d'exécution.


Indication de progression


Cela peut ĂȘtre rĂ©alisĂ© Ă  l'aide des mĂ©thodes TeamCity.WriteStartProgress et TeamCity.WriteEndProgress . Leurs appels peuvent ĂȘtre insĂ©rĂ©s dans les mĂȘmes TaskSetup et TaskTeardown :


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

RĂ©sultats des tests


Si vous exécutez des tests dans la tùche Cake, TeamCity est en mesure de vous montrer leurs résultats.



Cela peut ĂȘtre fait Ă  l'aide de la mĂ©thode TeamCity.ImportData . Il prend deux paramĂštres: une description de chaĂźne du type de donnĂ©es et le chemin d'accĂšs au fichier contenant ces donnĂ©es. Par exemple, si vous utilisez MSTest, voici comment informer TeamCity des rĂ©sultats des tests:


 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 prend en charge plusieurs types de tests. En plus de mstest, vous pouvez utiliser nunit , vstest et quelques autres .


Test du code d'analyse de couverture


TeamCity est capable de montrer le résultat de l'analyse de la couverture du code par des tests.



TeamCity prend actuellement en charge l'intĂ©gration avec DotCover . Permettez-moi de vous montrer comment utiliser DotCover dans un script Cake. Tout d'abord, DotCover doit ĂȘtre installĂ©:


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

AprĂšs cela, il peut ĂȘtre utilisĂ© dans des tĂąches:


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

Comme vous pouvez le voir, des tests sont également exécutés ici. Par conséquent, nous pouvons immédiatement informer TeamCity des résultats des tests et des résultats de l'analyse de leur couverture de code. La méthode TeamCity.ImportDotCoverCoverage fait exactement cela.


Édition d'artefacts


Dans TeamCity, vous pouvez publier certains artefacts créés pendant le fonctionnement du script Cake. Les packages NuGet sont un bon candidat pour ce rÎle:



Pour ce faire, placez tous les artefacts que vous souhaitez publier dans un dossier. Vous pouvez ensuite publier à l'aide de la méthode TeamCity.PublishArtifacts :


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

Conclusion


Espérons que ces exemples de code simples vous feront économiser du temps et des efforts si vous souhaitez que votre script Cake s'exécute sur TeamCity. La version complÚte du script et l'application qu'il traite se trouvent sur GitHub . Bonne chance

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


All Articles