كعكة و TeamCity التكامل

الكعكة هي أداة رائعة لإنشاء خط أنابيب توصيل للتطبيقات الخاصة بك. أنا أحبه لأنه يسمح لي بكتابة خط الأنابيب هذا في C # ، وهو ما أعرفه جيدًا. تتمثل إحدى الميزات الرائعة لـ Cake و PSake وغيرها من الأطر المشابهة في أنها تقوم بإنشاء نص يمكن تشغيله على الجهاز المحلي للمطور وعلى خوادم CI. سوف أشرح هنا كيفية تنظيم تفاعل نص الكيك مع TeamCity .


المتطلبات


سأفترض أن لديك بالفعل المعرفة الأساسية لكيك وتيم سيتي. خلاف ذلك ، يمكنك البدء بقراءة الموارد التالية:


للكيك:



ل TeamCity:



الآن دعنا نتحدث عن تفاعل Cake و TeamCity.


تسجيل


يتكون خط أنابيب الكعكة عادة من عدة مهام. سيكون من الرائع أن يكون لديك قسم منفصل لكل مهمة من هذا القبيل في سجل TeamCity. أرغب في الحصول على قسم قابل للطي لكل مهمة كعكة في السجل:


مجلة


يحتوي API الكعكة على أساليب TeamCity.WriteStartBuildBlock و TeamCity.WriteEndBuildBlock . على الرغم من أنه من الممكن استخدامها في كل مهمة ، إلا أنه يمكن تشغيلها تلقائيًا. يحتوي Cake على أساليب TaskSetup و TaskTeardown التي يتم استدعاؤها قبل وبعد كل مهمة. يمكنهم فتح وإغلاق كتل سجل TeamCity:


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

هنا يتم استخدام خاصية TeamCity.IsRunningOnTeamCity لتحديد ما إذا كان رمز TeamCity قد تم إيقافه أم لا.


الآن في مجلتنا هناك كتل قابلة للطي لكل مهمة. ولكن يمكن إضافة تحسين واحد آخر.


عادةً ما يكون للمهام في Cake أسماء قصيرة: Build ، Test ، Clean . لذلك فهي أسهل في التشغيل من سطر الأوامر. ولكن في TeamCity ، أفضل وصفًا تفصيليًا لمهمة الكيك. وهذا ممكن القيام به. لإعطاء المهمة وصفًا ، استخدم طريقة الوصف :


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

الآن يمكن استخدام هذه الأوصاف لتشكيل كتل في السجل:


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

هذا يحسن قراءتها.


التقدم المحرز


إذا استغرق البرنامج النصي لـ Cake وقتًا طويلاً ، فمن المفيد معرفة المهمة التي تعمل حاليًا.


مؤشر التقدم


يمكن تحقيق ذلك باستخدام أساليب TeamCity.WriteStartProgress و TeamCity.WriteEndProgress . يمكن إدراج مكالماتهم في نفس TaskSetup و 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); } }); 

نتائج الاختبار


إذا أجريت اختبارات في مهمة Cake ، فإن TeamCity قادر على عرض نتائجهم.



يمكن القيام بذلك باستخدام أسلوب TeamCity.ImportData . يستغرق معلمتين: وصف سلسلة لنوع البيانات والمسار إلى الملف الذي يحتوي على هذه البيانات. على سبيل المثال ، إذا كنت تستخدم MSTest ، فإليك كيفية إخبار TeamCity بنتائج الاختبارات:


 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 يدعم عدة أنواع من الاختبارات. بالإضافة إلى mstest ، يمكنك استخدام nunit ، vstest وبعض الآخرين .


اختبار تحليل رمز التغطية


TeamCity قادر على إظهار نتيجة تحليل تغطية الشفرة عن طريق الاختبارات.



TeamCity يدعم حاليا التكامل مع DotCover . اسمح لي أن أوضح لك كيفية استخدام DotCover في برنامج نصي للكيك. أولاً ، يجب تثبيت DotCover:


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

بعد ذلك ، يمكن استخدامه في المهام:


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

كما ترون ، يتم تشغيل الاختبارات هنا أيضًا. لذلك ، يمكننا على الفور إبلاغ TeamCity بنتائج الاختبار ونتائج تحليل تغطية الشفرة الخاصة بهم. أسلوب TeamCity.ImportDotCoverCoverage يفعل ذلك تمامًا.


قطعة أثرية النشر


في TeamCity ، يمكنك نشر بعض الأعمال الفنية التي تم إنشاؤها أثناء تشغيل البرنامج النصي Cake. المرشح الجيد لهذا الدور هو حزم NuGet:



للقيام بذلك ، ضع جميع الأعمال الفنية التي تريد نشرها في مجلد واحد. بعد ذلك يمكنك النشر باستخدام أسلوب TeamCity.PublishArtifacts :


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

الخاتمة


نأمل أن توفر لك أمثلة التعليمات البرمجية البسيطة هذه الوقت والجهد إذا كنت تريد تشغيل البرنامج النصي لـ CakeCity على TeamCity. يمكن العثور على النسخة الكاملة من البرنامج النصي والتطبيق الذي يعالجه على GitHub . حظا سعيدا

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


All Articles