Buscando una actividad de compilación que interrumpa una compilación cuando se introducen nuevas advertencias

StackOverflow https://stackoverflow.com//questions/9607356

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top