Buscando una actividad de compilación que interrumpa una compilación cuando se introducen nuevas advertencias
-
09-12-2019 - |
Pregunta
Estamos intentando limpiar una gran cantidad de código de campo marrón, mientras que al mismo tiempo un equipo agrega nuevas funciones.Nos gustaría asegurarnos de que el código nuevo y el modificado se limpien de cualquier análisis de código/compilador u otras advertencias, pero hay demasiadas para comenzar limpiando la solución actual.
Estamos usando TFS 2010.
Entonces se propuso lo siguiente:
- Escriba/seleccione una actividad de compilación que compare la lista de advertencias en la compilación con las líneas de código que cambiaron con ese registro.
- Si la advertencia proporciona un número de línea y ese número de línea se cambió, la compilación falla.
Entiendo que esto no encontrará todas las advertencias nuevas y que las cosas introducidas en otras partes del código no se marcarán, pero al menos es algo.
Otra opción que se propuso:
- Compare la lista de advertencias de la compilación correcta conocida anterior con la lista de esta compilación.Si hay nuevas advertencias (seguimiento a nivel de nombre de archivo), falle la compilación.
¿Alguna acción conocida que pueda proporcionar dicha funcionalidad?
¿Alguna acción similar que pueda actuar sobre los informes de cobertura del código?
Solución
La siguiente actividad es sólo 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 subido.
Otra actividad que puede ubicar nuevo Las advertencias y/o presentar su ubicación en el código serían claramente superiores, pero pensé que este podría ser un punto de partida 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 manejo de excepciones y debe perfeccionarse aún más, en caso de que sus definiciones de compilación generen más de una solución.
Se necesitan tres argumentos de entrada (buildDetail
, platformConfiguration.Configuration
y platformConfiguration.Platform
) y debe colocarse directamente después del Run MSBuild
actividad.