البحث عن نشاط بناء يكسر البناء عند تقديم تحذيرات جديدة
-
09-12-2019 - |
سؤال
نحن نحاول تنظيف مجموعة كبيرة من رمز الحقل البني ، بينما يقوم الفريق في نفس الوقت بإضافة وظائف جديدة.نود التأكد من تغيير التعليمات البرمجية الجديدة وتنظيفها من أي تحليل مترجم/رمز أو تحذيرات أخرى ، ولكن هناك الكثير منها للبدء بتنظيف الحل الحالي.
نحن نستخدم تفس 2010.
لذلك تم اقتراح ما يلي:
- اكتب / حدد نشاط بناء يقارن قائمة التحذيرات في الإصدار بأسطر التعليمات البرمجية التي تغيرت مع تسجيل الوصول هذا.
- إذا كان التحذير يوفر رقم سطر ، وتم تغيير رقم السطر هذا ، فافشل في الإنشاء.
أفهم أن هذا لن يجد جميع التحذيرات الجديدة ولن يتم وضع علامة على الأشياء التي تم تقديمها في أجزاء أخرى من الكود ، ولكنها على الأقل شيء ما.
خيار آخر تم اقتراحه:
- قارن قائمة التحذيرات من البناء الجيد المعروف السابق ضد قائمة هذا البناء.إذا كانت هناك تحذيرات جديدة (تتبع على مستوى اسم الملف) ، فافشل في الإنشاء.
أي إجراءات معروفة هناك قد توفر الوظيفة المذكورة?
أي إجراءات مماثلة يمكن أن تعمل على تقارير تغطية الكود?
المحلول
هذا النشاط التالي هو مجرد نهج أساسي ، يعود false
إذا كان الإصدار الحالي الخاص بك يحتوي على تحذيرات أقل أو متساوية من الإصدار الأخير و true
إذا قاموا.
نشاط آخر يمكن تحديد موقعه جديد من الواضح أن التحذيرات و/أو التواجد مع موقعها في الكود سيكون أفضل ، لكنني اعتقدت أن هذا قد يكون نقطة بداية مثيرة للاهتمام:
using System;
using System.Activities;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Build.Workflow.Activities;
namespace CheckWarnings
{
[BuildActivity(HostEnvironmentOption.Agent)]
public sealed class CheckWarnings : CodeActivity<bool>
{
[RequiredArgument]
public InArgument<IBuildDetail> CurrentBuild { get; set; } //buildDetail
public InArgument<string> Configuration { get; set; } //platformConfiguration.Configuration
public InArgument<string> Platform { get; set; } //platformConfiguration.Platform
protected override bool Execute(CodeActivityContext context)
{
IBuildDetail currentBuildDetail = context.GetValue(CurrentBuild);
string currentConfiguration = context.GetValue(Configuration);
string currentPlatform = context.GetValue(Platform);
Uri lastKnownGoodBuildUri = currentBuildDetail.BuildDefinition.LastGoodBuildUri;
IBuildDetail lastKnownGoodBuild = currentBuildDetail.BuildServer.GetBuild(lastKnownGoodBuildUri);
int numOfCurrentWarnings = GetNumberOfWarnings(currentBuildDetail, currentConfiguration, currentPlatform);
context.TrackBuildMessage("Current compile presents " + numOfCurrentWarnings + " warnings.", BuildMessageImportance.Normal);
int numOfLastGoodBuildWarnings = GetNumberOfWarnings(lastKnownGoodBuild, currentConfiguration,
currentPlatform);
context.TrackBuildMessage("Equivalent last good build compile presents " + numOfLastGoodBuildWarnings + " warnings.", BuildMessageImportance.Normal);
if (numOfLastGoodBuildWarnings < numOfCurrentWarnings)
{
return true;
}
return false;
}
private static int GetNumberOfWarnings(IBuildDetail buildDetail, string configuration, string platform)
{
var buildInformationNodes =
buildDetail.Information.GetNodesByType("ConfigurationSummary");
foreach (var buildInformationNode in buildInformationNodes)
{
string localPlatform, numOfWarnings;
string localConfiguration = localPlatform = numOfWarnings = "";
foreach (var field in buildInformationNode.Fields)
{
if (field.Key == "Flavor")
{
localConfiguration = field.Value;
}
if (field.Key == "Platform")
{
localPlatform = field.Value;
}
if (field.Key == "TotalCompilationWarnings")
{
numOfWarnings = field.Value;
}
}
if(localConfiguration == configuration && localPlatform == platform)
{
return Convert.ToInt32((numOfWarnings));
}
}
return 0;
}
}
}
لاحظ أن هذا النشاط لا يوفر معالجة استثناء ويجب تحسينه بشكل أكبر ، في حالة إنشاء تعريفات الإنشاء الخاصة بك لأكثر من حل واحد.
يستغرق ثلاثة مدخلات المدخلات (buildDetail
, platformConfiguration.Configuration
و platformConfiguration.Platform
) وينبغي أن توضع مباشرة بعد Run MSBuild
نشاط.