Alla ricerca di un'attività di costruzione che rompe una build quando vengono introdotti nuovi avvertimenti
-
09-12-2019 - |
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?
- 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.
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
.