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

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

Мы используем TFS 2010.

Итак, было предложено следующее:

  • Напишите/выберите операцию сборки, которая сравнивает список предупреждений в сборке с строками кода, которые были изменены с этой регистрацией.
  • Если предупреждение содержит номер строки, и номер этой строки был изменен, выйдите из строя.

Я понимаю, что это не обнаружит, что все новые предупреждения и вещи, введенные в других частях кода, не будут помечены, но это, по крайней мере, что-то.

Другой вариант, который был предложен:

  • Сравните список предупреждений о предыдущей известной хорошей сборке с списком этой сборки. Если появились новые предупреждения (дорожка на уровне имени файла), не удалось выполнить сборку.

Любые известные действия, которые могут предоставить упомянутые функции?

Любые подобные действия, которые могут действовать в отчетах о покрытии кода?

Ответ 1

Эта следующая операция - это всего лишь базовый подход, который возвращает 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.