2012-03-07 1 views
11

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

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

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

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

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

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

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

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

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

+1

Какая версия TFS вы используете? –

+0

Мы используем TFS 2010, обновленный выше – jessehouwing

+1

. Это выглядит как отличный запрос функции для создания сборщиков расширений Community TFS. Проект CodePlex: http://tfsbuildextensions.codeplex.com/ –

ответ

4

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

+0

Похож на неплохую отправную точку :). Благодаря! – jessehouwing

+0

Я вернусь с обновленной версией, как только найду время для нее :) – jessehouwing