Integración de Cake y TeamCity

Cake es una gran herramienta para crear un canal de entrega para sus aplicaciones. Lo amo porque me permite escribir esta tubería en C #, que conozco bien. Una gran característica de Cake, PSake y otros marcos similares es que crean un script que se puede ejecutar tanto en la máquina del desarrollador local como en los servidores CI. Aquí explicaré cómo organizar la interacción del script Cake con TeamCity .


Requisitos


Asumiré que ya tienes conocimientos básicos de Cake y TeamCity. De lo contrario, puede comenzar leyendo los siguientes recursos:


Para pastel:



Para TeamCity:



Ahora hablemos de la interacción de Cake y TeamCity.


Registro


La canalización de Cake generalmente consta de varias tareas. Sería genial tener una sección separada para cada tarea en el registro de compilación de TeamCity. Me gustaría obtener una sección plegable para cada tarea de Cake en el registro:


Revista


Cake API tiene los métodos TeamCity.WriteStartBuildBlock y TeamCity.WriteEndBuildBlock . Aunque es posible usarlos en todas las tareas, puede automatizarse. Cake tiene métodos TaskSetup y TaskTeardown que se llaman antes y después de cada tarea. Pueden abrir y cerrar bloques de registro de TeamCity:


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

Aquí, la propiedad TeamCity.IsRunningOnTeamCity se usa para determinar si el código para TeamCity aparece o no.


Ahora en nuestra revista hay bloques plegables para cada tarea. Pero se puede agregar una mejora más.


Por lo general, las tareas en Cake tienen nombres cortos: Build , Test , Clean . Por lo tanto, son más fáciles de ejecutar desde la línea de comandos. Pero en TeamCity, preferiría tener descripciones de tareas de Cake más detalladas. Y esto es posible de hacer. Para dar una descripción de la tarea, use el método Descripción :


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

Ahora estas descripciones se pueden usar para formar bloques en el registro:


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

Esto mejora su legibilidad.


Progreso realizado


Si el script de Cake tarda mucho tiempo, es útil saber qué tarea se está ejecutando actualmente.


Indicación de progreso


Esto se puede lograr utilizando los métodos TeamCity.WriteStartProgress y TeamCity.WriteEndProgress . Sus llamadas se pueden insertar en el mismo TaskSetup y 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); } }); 

Resultados de la prueba


Si ejecuta pruebas en la tarea Cake, TeamCity puede mostrarle sus resultados.



Esto se puede hacer usando el método TeamCity.ImportData . Se necesitan dos parámetros: una descripción de cadena del tipo de datos y la ruta al archivo que contiene estos datos. Por ejemplo, si usa MSTest, aquí le mostramos cómo informarle a TeamCity sobre los resultados de las pruebas:


 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 admite varios tipos de pruebas. Además de mstest, puede usar nunit , vstest y algunos otros .


Prueba de código de análisis de cobertura


TeamCity puede mostrar el resultado del análisis de la cobertura del código mediante pruebas.



TeamCity actualmente admite la integración con DotCover . Déjame mostrarte cómo usar DotCover en un script de Cake. Primero, DotCover necesita ser instalado:


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

Después de eso, se puede usar en tareas:


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

Como puede ver, las pruebas también se ejecutan aquí. Por lo tanto, podemos informar inmediatamente a TeamCity sobre los resultados de la prueba y los resultados del análisis de la cobertura de su código. El método TeamCity.ImportDotCoverCoverage hace exactamente eso.


Publicación de artefactos


En TeamCity, puede publicar algunos artefactos creados durante la operación del script Cake. Un buen candidato para este rol son los paquetes NuGet:



Para hacer esto, coloque todos los artefactos que desea publicar en una carpeta. Luego puede publicar utilizando el método TeamCity.PublishArtifacts :


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

Conclusión


Esperemos que estos simples ejemplos de código le ahorren tiempo y esfuerzo si desea que su script Cake se ejecute en TeamCity. La versión completa del script y la aplicación que procesa se puede encontrar en GitHub . Buena suerte

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


All Articles