Integração Cake e TeamCity

O Cake é uma ótima ferramenta para criar um pipeline de entrega para seus aplicativos. Eu o amo porque ele me permite escrever esse pipeline em C #, que eu conheço bem. Um ótimo recurso do Cake, PSake e outras estruturas semelhantes é que eles criam um script que pode ser executado na máquina do desenvolvedor local e nos servidores de CI. Aqui, explicarei como organizar a interação do script do Cake com o TeamCity .


Exigências


Assumirei que você já possui conhecimentos básicos de Cake e TeamCity. Caso contrário, você pode começar lendo os seguintes recursos:


Para Bolo:



Para TeamCity:



Agora vamos falar sobre a interação do Cake e do TeamCity.


Registo


O pipeline de bolo geralmente consiste em várias tarefas. Seria ótimo ter uma seção separada para cada tarefa desse tipo no log do TeamCity. Gostaria de obter uma seção recolhível para cada tarefa do bolo no log:


Magazine


A API do Cake possui os métodos TeamCity.WriteStartBuildBlock e TeamCity.WriteEndBuildBlock . Embora seja possível usá-los em todas as tarefas, ele pode ser automatizado. O Cake possui os métodos TaskSetup e TaskTeardown chamados antes e depois de cada tarefa. Eles podem abrir e fechar os blocos de log do TeamCity:


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

Aqui, a propriedade TeamCity.IsRunningOnTeamCity é usada para determinar se o código para TeamCity foi populado ou não.


Agora, em nossa revista, existem blocos dobráveis ​​para cada tarefa. Mas mais uma melhoria pode ser adicionada.


Normalmente, as tarefas no Cake têm nomes abreviados: Compilar , Testar , Limpar . Portanto, eles são mais fáceis de executar a partir da linha de comando. Mas no TeamCity, eu preferiria ter descrições mais detalhadas das tarefas do Cake. E isso é possível de fazer. Para fornecer uma descrição da tarefa, use o método Descrição :


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

Agora, essas descrições podem ser usadas para formar blocos no log:


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

Isso melhora sua legibilidade.


Progressos realizados


Se o script do Cake demorar muito, é útil saber qual tarefa está em execução no momento.


Indicação de progresso


Isso pode ser alcançado usando os métodos TeamCity.WriteStartProgress e TeamCity.WriteEndProgress . Suas chamadas podem ser inseridas no mesmo TaskSetup e 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 do teste


Se você executar testes na tarefa Bolo, o TeamCity poderá mostrar seus resultados.



Isso pode ser feito usando o método TeamCity.ImportData . São necessários dois parâmetros: uma descrição da string do tipo de dados e o caminho para o arquivo que contém esses dados. Por exemplo, se você usa o MSTest, veja como informar o TeamCity sobre os resultados dos testes:


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

O TeamCity suporta vários tipos de testes. Além do mstest, você pode usar o nunit , o vstest e alguns outros .


Código de análise de cobertura de teste


O TeamCity é capaz de mostrar o resultado da análise da cobertura do código por testes.



O TeamCity atualmente suporta a integração com o DotCover . Deixe-me mostrar como usar o DotCover em um script Cake. Primeiro, o DotCover precisa ser instalado:


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

Depois disso, ele pode ser usado em tarefas:


 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 você pode ver, os testes também são executados aqui. Portanto, podemos informar imediatamente o TeamCity sobre os resultados do teste e os resultados da análise de sua cobertura de código. O método TeamCity.ImportDotCoverCoverage faz exatamente isso.


Publicação de Artefato


No TeamCity, você pode publicar alguns artefatos criados durante a operação do script Cake. Um bom candidato para essa função são os pacotes NuGet:



Para fazer isso, coloque todos os artefatos que você deseja publicar em uma pasta. Em seguida, você pode publicar usando o 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); }); 

Conclusão


Esperamos que esses exemplos simples de código economizem tempo e esforço se você quiser que seu script Cake seja executado no TeamCity. A versão completa do script e o aplicativo que ele processa podem ser encontrados no GitHub . Boa sorte

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


All Articles