البحث عن نشاط بناء يكسر البناء عند تقديم تحذيرات جديدة

StackOverflow https://stackoverflow.com//questions/9607356

سؤال

نحن نحاول تنظيف مجموعة كبيرة من رمز الحقل البني ، بينما يقوم الفريق في نفس الوقت بإضافة وظائف جديدة.نود التأكد من تغيير التعليمات البرمجية الجديدة وتنظيفها من أي تحليل مترجم/رمز أو تحذيرات أخرى ، ولكن هناك الكثير منها للبدء بتنظيف الحل الحالي.

نحن نستخدم تفس 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 نشاط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top