Ищете действие сборки, которое прерывает сборку при появлении новых предупреждений
-
09-12-2019 - |
Вопрос
Мы пытаемся очистить большую кучу кода с коричневыми полями, в то же время команда добавляет новую функциональность.Мы хотели бы убедиться, что измененный и новый код очищен от любых предупреждений компилятора / анализа кода или других предупреждений, но их слишком много, чтобы начать с очистки текущего решения.
Мы используем TFS 2010.
Итак, было предложено следующее:
- Напишите / выберите действие сборки, которое сравнивает список предупреждений в сборке со строками кода, которые изменились при этой регистрации.
- Если в предупреждении указан номер строки, и этот номер строки был изменен, завершите сборку с ошибкой.
Я понимаю, что при этом не будут найдены все новые предупреждения, и вещи, введенные в других частях кода, не будут помечены, но это хоть что-то.
Еще один вариант, который был предложен:
- Сравните список предупреждений предыдущей известной исправной сборки со списком этой сборки.Если появятся новые предупреждения (отслеживание на уровне имени файла), завершите сборку с ошибкой.
Какие-либо известные действия, которые могли бы обеспечить указанную функциональность?
Какие-либо аналогичные действия, которые могут действовать в отчетах о покрытии кода?
Решение
Это следующее действие - всего лишь базовый подход, который возвращает 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;
}
}
}
Обратите внимание, что это действие не обеспечивает обработку исключений и должно быть дополнительно доработано на случай, если ваши определения сборки создают более одного решения.
Требуется три входных аргумента (buildDetail
, platformConfiguration.Configuration
и platformConfiguration.Platform
) и должен быть помещен непосредственно после Run MSBuild
Активность.