Как программно сообщить номер набора изменений TFS / AzureDevOps в моих журналах - PullRequest
0 голосов
/ 08 марта 2019

Иногда я нахожу бинарный поиск по наборам изменений и запускаю тесты, чтобы определить, когда был обнаружен дефект.Это оставляет мне множество очень похожих журналов, чтобы просеять их, и иногда у меня возникают проблемы с запоминанием того, какой диагностический файл поступил из какого набора изменений.

Я бы хотел как-то включить номер набора изменений в диагностические файлы.Есть ли способ сделать это с помощью Visual Studio / C # / AzureDevOps?

1 Ответ

0 голосов
/ 08 марта 2019

Microsoft раньше поддерживала файл с именем BuildInfo.config, который был полезен для такого рода вещей, но я думаю, что поддержка для него была прекращена после Visual Studio 2015.

По сути, это был простой XML-файл, созданный MSBuild. При развертывании вместе с двоичными файлами приложения среда ведения журналов может считывать файл и включать подробности в выходные данные журнала.

Существует множество способов создать подобную функцию самостоятельно. Вот что я бы сделал ...

  1. Создайте пустой файл информации о сборке и зарегистрируйте его с вашим исходным кодом. Этот файл является просто справочным примером - используйте данные заполнителя. Это может быть XML, JSON или любой другой формат (но, вероятно, должен быть основан на тексте). Установите для файла действие сборки значение «Содержимое», чтобы он был включен в выходные данные сборки.
  2. Используйте функцию инициализации шаблона или инициализации телеметрии, чтобы прочитать файл информации о сборке и включить его содержимое в вывод журнала. Точная реализация будет зависеть от вашей среды ведения журналов.
  3. Добавьте задачу сценария Powershell в свой конвейер разработки Azure. Сценарий должен либо обновить, либо перезаписать файл информации о сборке. Вы можете получить некоторую полезную информацию из переменных построения . Задача должна быть запущена до этапа компиляции MSBuild.

Создание и анализ файла BuildInfo

В этом примере я собираюсь реализовать свой файл информации о сборке как простой ключ / значение пары в текстовом файле. Я выбрал простой текст, потому что он позволяет наглядный пример не требуя каких-либо сторонних библиотек или сложного разбора. В вашем приложении вы Возможно, вы захотите использовать JSON, XML или что-то еще более стандартизированное.

Сначала создайте файл информации о сборке-заполнителе. Этот файл будет использоваться в вашем локальная среда разработки, и будет служить ссылкой для вашей информационной схемы сборки. Я назвал мой BuildInfo.txt и поместил его в корневой каталог моего проекта.

COMMIT=commit not set
BUILD=build not set

Затем напишите помощника для анализа файла информации о сборке. Моя очень зачаточная. Это было бы разумно добавить некоторые средства защиты от отсутствующей или искаженной информации о сборке, но Я решил опустить любой защитный код, чтобы пример был сфокусирован.

class BuildInfo
{
    // Singleton instance backing field
    static readonly Lazy<BuildInfo> instance = new Lazy<BuildInfo>(() => new BuildInfo());

    // Singleton instance public accessor
    public static BuildInfo Instance => instance.Value;

    public string Commit { get; }
    public string Build { get; }

    private BuildInfo()
    {
        // This is a very rudimentary example of parsing the info file. It
        // will fail loudly on malformed input. Consider:
        //   1) Using a standard file format (JSON, XML). I rolled my own
        //      here to avoid adding a dependency on a parsing library.
        //   2) If you want your app to fail when no build info is
        //      available, add a more descriptive exception. If you don't
        //      want it to fail, add some devensive code or fallback logic.
        var info = File.ReadAllLines("BuildInfo.txt")
            .Select(l => l.Split('=', 2))
            .ToDictionary(key => key[0], val => val[1]);

        Commit = info["COMMIT"];
        Build = info["BUILD"];
    }
}

Добавить информацию о сборке к вашему выводу журнала

Я использую log4net здесь, но любая структура логирования должна иметь несколько похожих механизм настройки вывода журнала. Обратитесь к документации по структуре для больше информации.

Сначала добавьте информацию о вашей сборке в контекст регистрации. Это должно пойти где-то в Код запуска вашего приложения - как можно раньше.

log4net.GlobalContext.Properties["Build"] = BuildInfo.Instance.Build;
log4net.GlobalContext.Properties["Commit"] = BuildInfo.Instance.Commit;

Затем обновите конфигурацию приложения журнала, чтобы включить настраиваемые поля. Вот пример конфигурации для консольного приложения. Важные биты %property{BuildId} и %property{Commit}.

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <target value="Console.Error" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5level [%property{BuildId}] [%property{Commit}] - %message%newline" />
        </layout>
    </appender>
  <root>
    <level value="ALL"/>
    <appender-ref ref="ConsoleAppender" />
  </root>
</log4net>

Теперь, когда вы позвоните log.Warn("Some log mesage"), вы увидите следующее консольный вывод:

WARN  [build not set] [commit not set] - Some log mesage

Получить детали сборки от CI

Наконец, вам нужно получить реальные подробности сборки из вашей среды CI. я сделал это с очень простой задачей скрипта PowerShell. Убедитесь, что задача выполняется до ваш шаг сборки!

@(
    "COMMIT=$($Env:BUILD_SOURCEVERSION)",
    "BUILD=$($Env:BUILD_BUILDID)"
) | Out-File BuildInfo.txt

(Совет. Чтобы просмотреть все доступные переменные среды, запустите Get-ChildItem Env: | Sort Name в задаче PowerShell)

(Еще один совет: если вы хотите использовать JSON вместо текста, взгляните на командлет ConvertTo-Json)

Теперь, если все части на месте, сервер CI должен перезаписать зарегистрированный файл информации о сборке. Новый файл должен быть пакетами с вашим развертываемые артефакты и копируются на ваш сервер. При запуске ваше приложение должно прочитайте информацию о сборке, и затем информация должна быть включена в каждое сообщение журнала.

Между сборкой и развертыванием нужно выстроить множество мелочей процесс, так что будьте готовы к некоторым пробам и ошибкам. Настройка CI / CD имеет тенденцию быть утомительно, по моему опыту.

...