Ищете действие сборки, которое прерывает сборку при появлении новых предупреждений

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

Вопрос

Мы пытаемся очистить большую кучу кода с коричневыми полями, в то же время команда добавляет новую функциональность.Мы хотели бы убедиться, что измененный и новый код очищен от любых предупреждений компилятора / анализа кода или других предупреждений, но их слишком много, чтобы начать с очистки текущего решения.

Мы используем TFS 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