2012-03-07 16 views
11

Stiamo tentando di eliminare un grosso numero di codice campo marrone, mentre allo stesso tempo una squadra sta aggiungendo nuove funzionalità. Ci piacerebbe essere sicuri che il codice modificato e quello nuovo vengano puliti da qualsiasi analisi del compilatore/codice o altri avvertimenti, ma ce ne sono troppi per iniziare ripulendo la soluzione corrente.Ricerca di un'attività di build che interrompe una build quando vengono introdotti nuovi avvisi

Stiamo utilizzando TFS 2010.

Così è stato proposto il seguente:

  • Write/selezionare un'attività di costruzione che confronta l'elenco di avvisi nella compilazione verso le righe di codice che ha cambiato con quel check-in.
  • Se l'avviso fornisce un numero di riga e il numero di riga è stato modificato, fallire la compilazione.

Capisco che questo non troverà tutti i nuovi avvisi e le cose introdotte in altre parti del codice non verranno contrassegnate, ma è almeno qualcosa.

Un'altra opzione che è stato proposto:

  • confrontare l'elenco degli avvertimenti del precedente nota buon costruire con l'elenco di questa build. Se ci sono nuovi avvisi (traccia sul livello del nome del file), fallire la compilazione.

Eventuali Azioni note che potrebbero fornire tale funzionalità?

Azioni simili che possono agire sui report di copertura del codice?

+1

Quale versione di TFS stai usando? –

+0

Stiamo usando TFS 2010, aggiornato sopra – jessehouwing

+1

Questa sembra una grande richiesta di funzionalità per il progetto di codifica TFS Build Extensions di Code: http://tfsbuildextensions.codeplex.com/ –

risposta

4

Questa attività seguente è solo un approccio di base, che restituisce false se la build corrente ha un numero di avvertimenti inferiore o uguale all'ultima build e true se sono aumentati.
Un'altra attività che possono individuare nuove avvertenze e/o presenti con la loro posizione nel codice sarebbe chiaramente superiore, ma ho pensato che questo potrebbe essere un punto di inizio interessante:

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

Nota che questa attività non prevede con la gestione delle eccezioni e dovrebbe essere ulteriormente ridefinito, nel caso in cui le definizioni di build costruiscano più di una soluzione.

Sono necessari tre argomenti di input (buildDetail, platformConfiguration.Configuration e platformConfiguration.Platform) e devono essere inseriti direttamente dopo l'attività Run MSBuild.

+0

Sembra un buon punto di partenza :). Grazie! – jessehouwing

+0

Tornerò con una versione aggiornata, una volta trovato il tempo :) – jessehouwing