2012-03-07 14 views
11

Estamos intentando limpiar un gran grupo de código de campo marrón, mientras que al mismo tiempo un equipo agrega nuevas funcionalidades. Nos gustaría asegurarnos de que el código modificado y nuevo se elimine de cualquier análisis de compilación/código u otras advertencias, pero hay demasiados para comenzar, ya que se trata de limpiar la solución actual.Buscando una actividad de compilación que rompa una compilación cuando se introducen nuevas advertencias

Estamos utilizando TFS 2010.

Así se propuso lo siguiente:

  • escritura/seleccionar una actividad de construcción, que compara la lista de advertencias en contra de la construcción de las líneas de código que cambiaron con ese check-in
  • Si la advertencia proporciona un número de línea, y ese número de línea se cambió, falla la compilación.

Entiendo que esto no encontrará todas las advertencias nuevas y que las cosas introducidas en otras partes del código no serán marcadas, pero al menos es algo.

Otra opción que se propuso:

  • comparar la lista de advertencias de la buena construcción anterior conocida con la lista de esta formación. Si hay nuevas advertencias (seguimiento en el nivel de nombre de archivo), falle la compilación.

¿Alguna acción conocida que pueda proporcionar dicha funcionalidad?

¿Acciones similares que pueden actuar en los informes de Cobertura del código?

+1

¿Qué versión de TFS estás usando? –

+0

Estamos usando TFS 2010, actualizado anteriormente – jessehouwing

+1

Esto parece una gran solicitud de función para el proyecto Community TFS Build Extensions CodePlex: http://tfsbuildextensions.codeplex.com/ –

Respuesta

4

Esta actividad siguiente es solo un enfoque básico, que devuelve false si su compilación actual tiene menos o iguales advertencias que su última compilación y true si han aumentado.
Otra actividad que puede localizar nuevas advertencias y/o presente con su ubicación en el código sería claramente superior, con todo lo que esto podría ser un punto de inicio interesante:

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

Tenga en cuenta que esta actividad no proporciona con manejo de excepciones y debe ser refinado aún más, en caso de que las definiciones de compilación construyan más de una solución.

Requiere tres args de entrada (buildDetail, platformConfiguration.Configuration y platformConfiguration.Platform) y debe colocarse directamente después de la actividad Run MSBuild.

+0

Parece un buen punto de partida :). ¡Gracias! – jessehouwing

+0

Volveré con una versión actualizada una vez que encuentre tiempo para ello :) – jessehouwing

Cuestiones relacionadas