Поиск операции сборки, которая нарушает сборку при появлении новых предупреждений - PullRequest
11 голосов
/ 07 марта 2012

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

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

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

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

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

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

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

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

Есть ли похожие действия, которые могут повлиять на отчеты о покрытии кода?

1 Ответ

4 голосов
/ 13 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...