Alla ricerca di un'attività di costruzione che rompe una build quando vengono introdotti nuovi avvertimenti

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

Domanda

Stiamo tentando di ripulire un grosso grappolo di codice di campo marrone, mentre allo stesso tempo una squadra aggiunge una nuova funzionalità. Vorremmo assicurarci e il nuovo codice viene pulito da qualsiasi analisi del compilatore / codice o di altri avvertimenti, ma ci sono troppi di loro per iniziare a pulire la soluzione corrente.

Stiamo usando TFS 2010.

Quindi è stato proposto quanto segue:

    .
  • Scrivi / Seleziona un'attività di costruzione che confronta l'elenco degli avvisi nella build contro le linee di codice che sono cambiate con quel check-in.
  • Se l'avviso fornisce un numero di riga, e quel numero di linea è stato modificato, fallire la build.

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

    Un'altra opzione che è stata proposta:

      .
    • Confronta l'elenco degli avvertimenti della precedente buona break build contro l'elenco di questa build. Se ci sono nuovi avvertimenti (traccia sul livello del nome del file), fallire la build.

      Qualsiasi azione nota là fuori che potrebbe fornire dette funzionalità?

      Qualsiasi azione simile che può agire sui rapporti sulla copertura del codice?

È stato utile?

Soluzione

Questa attività seguente è solo un approccio di base, che restituisce false se la tua crescita corrente ha avvisi inferiori o uguali rispetto alla tua ultima build e true se sono aumentati.
Un'altra attività che può localizzare Nuovo Avvertenze e / o presenti con la loro posizione nel codice sarebbero chiaramente superiori, eppure pensavo che questo potrebbe essere un punto di partenza 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;
        }
    }
}
.

Si noti che questa attività non fornisce una gestione delle eccezioni e dovrebbe essere raffinato ulteriormente, nel caso in cui le definizioni di costruzione costruiscano più di una soluzioni.
Ci vogliono tre args in ingresso (buildDetail, platformConfiguration.Configuration e platformConfiguration.Platform) edovrebbe essere posizionato direttamente dopo l'attività Run MSBuild.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top