Procurando por uma atividade de construção que interrompe uma construção quando novos avisos são introduzidos

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

Pergunta

Estamos tentando limpar um grande monte de código de campo marrom, enquanto ao mesmo tempo uma equipe está adicionando novas funcionalidades.Gostaríamos de ter certeza de que o código alterado e o novo código sejam limpos de qualquer análise de compilador/código ou outros avisos, mas há muitos deles para começar limpando a solução atual.

Estamos usando o TFS 2010.

Então foi proposto o seguinte:

  • Escreva/selecione uma atividade de build que compare a lista de avisos no build com as linhas de código que foram alteradas com esse check-in.
  • Se o aviso fornecer um número de linha e esse número de linha tiver sido alterado, a compilação falhará.

Entendo que isso não encontrará todos os novos avisos e coisas introduzidas em outras partes do código não serão sinalizadas, mas é pelo menos alguma coisa.

Outra opção que foi proposta:

  • Compare a lista de avisos da compilação anterior conhecida com a lista desta compilação.Se houver novos avisos (rastrear no nível do nome do arquivo), falhe na compilação.

Alguma ação conhecida que possa fornecer essa funcionalidade?

Alguma ação semelhante que possa atuar nos relatórios de cobertura de código?

Foi útil?

Solução

A atividade a seguir é apenas uma abordagem básica, que retorna false se sua compilação atual tiver avisos menores ou iguais aos de sua última compilação e true se eles subiram.
Outra atividade que pode localizar novo avisos e/ou presentes com sua localização no código seriam claramente superiores, mas pensei que este poderia ser um ponto de partida 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;
        }
    }
}

Observe que esta atividade não fornece tratamento de exceções e deve ser refinada ainda mais, caso suas definições de build construam mais de uma solução.

São necessários três argumentos de entrada (buildDetail, platformConfiguration.Configuration e platformConfiguration.Platform) e deve ser colocado diretamente após o Run MSBuild atividade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top