Recherche d'une activité de build qui interrompt une build lorsque de nouveaux avertissements sont introduits

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

Question

Nous essayons de nettoyer une grande partie du code des champs bruns, tandis qu'en même temps une équipe ajoute de nouvelles fonctionnalités.Nous aimerions nous assurer que le code modifié et nouveau est nettoyé de toute analyse du compilateur/code ou d'autres avertissements, mais il y en a trop pour commencer par nettoyer la solution actuelle.

Nous utilisons TFS 2010.

Ainsi, ce qui suit a été proposé :

  • Écrivez/sélectionnez une activité de build qui compare la liste des avertissements de la build aux lignes de code qui ont changé avec cet enregistrement.
  • Si l’avertissement fournit un numéro de ligne et que ce numéro de ligne a été modifié, la génération échoue.

Je comprends que cela ne trouvera pas tous les nouveaux avertissements et que les éléments introduits dans d'autres parties du code ne seront pas signalés, mais c'est au moins quelque chose.

Autre option proposée :

  • Comparez la liste des avertissements de la précédente version correcte connue avec la liste de cette version.S'il y a de nouveaux avertissements (suivi au niveau du nom de fichier), échouez la construction.

Existe-t-il des actions connues susceptibles de fournir cette fonctionnalité ?

Existe-t-il des actions similaires pouvant agir sur les rapports de couverture de code ?

Était-ce utile?

La solution

L'activité suivante n'est qu'une approche de base, qui renvoie false si votre build actuelle contient des avertissements inférieurs ou égaux à ceux de votre dernière build et true s'ils se sont levés.
Une autre activité qui permet de localiser nouveau les avertissements et/ou présents avec leur emplacement dans le code seraient clairement supérieurs, mais j'ai pensé que cela pourrait être un point de départ intéressant :

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

Notez que cette activité ne fournit pas de gestion des exceptions et doit être affinée davantage, au cas où vos définitions de build génèrent plusieurs solutions.

Il faut trois arguments d'entrée (buildDetail, platformConfiguration.Configuration et platformConfiguration.Platform) et doit être placé directement après le Run MSBuild activité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top