Suchen Sie nach einer Build-Aktivität, die einen Build unterbricht, wenn neue Warnungen eingeführt werden

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

Frage

Wir versuchen, eine große Menge an Brown-Field-Code zu bereinigen, während gleichzeitig ein Team neue Funktionen hinzufügt.Wir möchten sicherstellen, dass geänderter und neuer Code von jeglicher Compiler-/Codeanalyse oder anderen Warnungen bereinigt wird, aber es gibt zu viele davon, um mit der Bereinigung der aktuellen Lösung zu beginnen.

Wir verwenden TFS 2010.

Daher wurde Folgendes vorgeschlagen:

  • Schreiben/wählen Sie eine Build-Aktivität aus, die die Liste der Warnungen im Build mit den Codezeilen vergleicht, die sich bei diesem Check-in geändert haben.
  • Wenn die Warnung eine Zeilennummer angibt und diese Zeilennummer geändert wurde, schlägt der Build fehl.

Ich verstehe, dass dadurch nicht alle neuen Warnungen gefunden werden und Dinge, die in anderen Teilen des Codes eingeführt werden, nicht gekennzeichnet werden, aber es ist zumindest etwas.

Eine weitere vorgeschlagene Option:

  • Vergleichen Sie die Liste der Warnungen des vorherigen als funktionierend bekannten Builds mit der Liste dieses Builds.Wenn neue Warnungen vorliegen (auf Dateinamenebene verfolgen), schlägt der Build fehl.

Gibt es bekannte Aktionen, die diese Funktionalität bereitstellen könnten?

Gibt es ähnliche Aktionen, die auf Code Coverage-Berichte einwirken können?

War es hilfreich?

Lösung

Diese folgende Aktivität ist nur ein grundlegender Ansatz, der wiederkehrt false wenn Ihr aktueller Build weniger oder gleich viele Warnungen hat wie Ihr letzter Build und true wenn sie auferstanden sind.
Eine weitere Aktivität, die lokalisiert werden kann neu Warnungen und/oder die Angabe ihrer Position im Code wären eindeutig überlegen, ich dachte jedoch, dass dies ein interessanter Ausgangspunkt sein könnte:

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

Beachten Sie, dass diese Aktivität keine Ausnahmebehandlung bietet und weiter verfeinert werden sollte, falls Ihre Build-Definitionen mehr als eine Lösung erstellen.

Es sind drei Eingabeargumente erforderlich (buildDetail, platformConfiguration.Configuration Und platformConfiguration.Platform) und sollte direkt nach dem platziert werden Run MSBuild Aktivität.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top