2012-03-07 26 views
11

Próbujemy oczyścić dużą ilość brązowego kodu pola, a jednocześnie zespół dodaje nowe funkcje. Chcielibyśmy się upewnić, że zmieniony i nowy kod zostanie wyczyszczony z dowolnej analizy kompilatora/kodu lub innych ostrzeżeń, ale jest ich zbyt wiele, aby rozpocząć czyszczenie obecnego rozwiązania.Poszukujesz aktywności kompilacji, która przerywa kompilację po wprowadzeniu nowych ostrzeżeń.

Używamy TFS 2010.

Więc co następuje: proponowane

  • Zapis/wybrać aktywność build który porównuje listę ostrzeżeń w budowie przeciw linii kodu, które zmieniły się ten check-in.
  • Jeśli ostrzeżenie zawiera numer wiersza, a numer wiersza został zmieniony, zakończ kompilację.

Rozumiem, że nie znajdziemy wszystkich nowych ostrzeżeń, a rzeczy wprowadzone w innych częściach kodu nie zostaną oznaczone, ale jest to przynajmniej coś.

Innym rozwiązaniem, które zostało zaproponowane:

  • Porównaj listę ostrzeżeń poprzedniego znanej dobrej budowie przeciwko liście tej kompilacji. Jeśli pojawią się nowe ostrzeżenia (ślad na poziomie nazwy pliku), nie powiodła się kompilacja.

Jakieś znane akcje, które mogą zapewnić tę funkcję?

Jakieś podobne działania, które mogą wpływać na raporty o zasięgu kodu?

+1

Którą wersję TFS używasz? –

+0

Używamy TFS 2010, zaktualizowanego powyżej – jessehouwing

+1

Wygląda to na wspaniałe żądanie funkcji dla projektu społecznościowego rozszerzenia TFS CodePlex: http://tfsbuildextensions.codeplex.com/ –

Odpowiedz

4

To dodaje aktywność jest tylko podstawowe podejście, które zwraca false jeśli obecny build ma mniejszy lub równy niż ostrzeżenia ostatniej kompilacji i true gdyby wzrosły.
Kolejnym działaniem, które może zlokalizować nowych ostrzeżenia i/lub występuje z ich położenia w kodzie będzie zdecydowanie lepszy, ale pomyślałem, że może to być interesujące startowy:

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; 
     } 
    } 
} 

Należy pamiętać, że działalność ta nie przewiduje z obsługą wyjątków i powinien być dalej dopracowywany, na wypadek gdyby twoje definicje kompilacji budowały więcej niż jedno rozwiązanie.

Trwa trzy argumenty wejściowe (buildDetail, platformConfiguration.Configuration i platformConfiguration.Platform) i należy je umieścić bezpośrednio po aktywności Run MSBuild.

+0

Wygląda na całkiem dobry punkt wyjścia :). Dzięki! – jessehouwing

+0

Wrócę z uaktualnioną wersją, gdy znajdę na to czas :) – jessehouwing

Powiązane problemy