Integrasi Cake dan TeamCity

Kue adalah alat yang hebat untuk membuat saluran pengiriman untuk aplikasi Anda. Saya suka dia karena dia memungkinkan saya untuk menulis pipa ini dalam C #, yang saya tahu dengan baik. Fitur hebat Cake, PSake, dan kerangka kerja serupa lainnya adalah mereka membuat skrip yang dapat dijalankan di mesin pengembang lokal dan di server CI. Di sini saya akan menjelaskan bagaimana mengatur interaksi skrip Cake dengan TeamCity .


Persyaratan


Saya akan berasumsi bahwa Anda sudah memiliki pengetahuan dasar tentang Cake dan TeamCity. Jika tidak, Anda dapat mulai dengan membaca sumber daya berikut:


Untuk kue:



Untuk TeamCity:



Sekarang mari kita bicara tentang interaksi Cake dan TeamCity.


Penebangan


Pipa Cake biasanya terdiri dari beberapa tugas. Akan lebih baik memiliki bagian terpisah untuk setiap tugas seperti itu di log TeamCity. Saya ingin mendapatkan bagian yang dapat dilipat untuk setiap tugas Kue di log:


Majalah


Cake API memiliki metode TeamCity.WriteStartBuildBlock dan TeamCity.WriteEndBuildBlock . Meskipun dimungkinkan untuk menggunakannya dalam setiap tugas, itu bisa otomatis. Cake memiliki metode TaskSetup dan TaskTeardown yang dipanggil sebelum dan sesudah setiap tugas. Mereka dapat membuka dan menutup blok log TeamCity:


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

Di sini, properti TeamCity.IsRunningOnTeamCity digunakan untuk menentukan apakah kode untuk TeamCity muncul atau tidak.


Sekarang di majalah kami ada blok yang dapat dilipat untuk setiap tugas. Tetapi satu peningkatan lagi dapat ditambahkan.


Biasanya, tugas di Cake memiliki nama pendek: Build , Test , Clean . Jadi mereka lebih mudah dijalankan dari baris perintah. Tetapi di TeamCity, saya lebih suka memiliki deskripsi tugas Cake yang lebih rinci. Dan ini mungkin dilakukan. Untuk memberikan deskripsi tugas, gunakan metode Deskripsi :


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

Sekarang deskripsi ini dapat digunakan untuk membentuk blok di 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); } }); 

Ini meningkatkan keterbacaannya.


Kemajuan dibuat


Jika skrip Kue membutuhkan waktu lama, ada baiknya mengetahui tugas mana yang sedang berjalan.


Indikasi kemajuan


Ini dapat dicapai dengan menggunakan metode TeamCity.WriteStartProgress dan TeamCity.WriteEndProgress . Panggilan mereka dapat dimasukkan ke dalam TaskSetup dan TaskTeardown yang sama:


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

Hasil tes


Jika Anda menjalankan tes dalam tugas Kue, maka TeamCity dapat menunjukkan hasilnya kepada Anda.



Ini dapat dilakukan dengan menggunakan metode TeamCity.ImportData . Dibutuhkan dua parameter: deskripsi string dari tipe data dan path ke file yang berisi data ini. Misalnya, jika Anda menggunakan MSTest, berikut ini cara memberi tahu TeamCity tentang hasil tes:


 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 mendukung beberapa jenis tes. Selain mstest, Anda dapat menggunakan nunit , vstest dan beberapa lainnya .


Uji kode analisis cakupan


TeamCity mampu menunjukkan hasil analisis cakupan kode dengan tes.



TeamCity saat ini mendukung integrasi dengan DotCover . Mari saya tunjukkan cara menggunakan DotCover dalam skrip Cake. Pertama, DotCover perlu diinstal:


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

Setelah itu, dapat digunakan dalam tugas:


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

Seperti yang Anda lihat, tes juga dijalankan di sini. Oleh karena itu, kami dapat segera memberi tahu TeamCity tentang hasil pengujian dan hasil analisis cakupan kode mereka. Metode TeamCity.ImportDotCoverCoverage melakukan hal itu.


Penerbitan Artefak


Di TeamCity, Anda dapat menerbitkan beberapa artefak yang dibuat selama pengoperasian skrip Kue. Kandidat yang baik untuk peran ini adalah paket NuGet:



Untuk melakukan ini, letakkan semua artefak yang ingin Anda terbitkan dalam satu folder. Kemudian Anda dapat mempublikasikan menggunakan metode TeamCity.PublishArtifacts :


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

Kesimpulan


Semoga contoh-contoh kode sederhana ini menghemat waktu dan tenaga Anda jika Anda ingin skrip Kue Anda dijalankan di TeamCity. Versi lengkap dari skrip dan aplikasi yang diprosesnya dapat ditemukan di GitHub . Semoga beruntung

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


All Articles