寻找在引入新警告时打破构建的构建活动

jes*_*ing 11 tfs code-coverage custom-action tfsbuild tfs2010

我们正在尝试清理大量的棕色字段代码,同时团队正在添加新功能.我们希望确保更改并从任何编译器/代码分析或其他警告中清除新代码,但是从清理当前解决方案开始,它们太多了.

我们正在使用TFS 2010.

所以提出以下建议:

  • 编写/选择构建活动,该构建活动将构建中的警告列表与使用该签入更改的代码行进行比较.
  • 如果警告提供了行号,并且该行号已更改,则构建失败.

我理解这不会发现所有新的警告,代码的其他部分引入的东西也不会被标记,但它至少是一些东西.

建议的另一个选择:

  • 将先前已知的良好构建的警告列表与此构建的列表进行比较.如果有新警告(跟踪文件名级别),则构建失败.

任何可能提供所述功能的已知操作?

任何可以对代码覆盖率报告采取行动的类似操作?

pan*_*lif 4

以下活动只是一个基本方法,false如果当前构建的警告少于或等于上次构建的警告以及警告true是否上升,则该方法会返回。
另一项可以定位警告和/或在代码中显示其位置的活动显然会更好,但我认为这可能是一个有趣的起点:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此活动不提供异常处理,应进一步细化,以防您的构建定义构建多个解决方案。

它需要三个输入参数(buildDetailplatformConfiguration.ConfigurationplatformConfiguration.Platform),并且应直接放置在Run MSBuild活动之后。