Парсерная библиотека (или инструмент) для вывода командной строки распространённых инструментов

Вопрос или проблема

Я пытаюсь вызвать пару распространенных программных инструментов из PowerShell скриптов в рамках конвейеров Azure DevOps – например:

  • npm
  • tsc
  • dotnet
  • GraphViz
  • pdflatex

Каждый из них с удовольствием пишет статусные сообщения в stdout и/или stderr.

Чтобы понять их (и в частности, чтобы решить, какие из них настолько важны, что DevOps должен быть уведомлен о них), мне нужно разобрать этот stdout/stderr вывод. К сожалению (хотя это и понятно), каждый из этих инструментов выбирает свой собственный способ форматирования своего вывода1.

Вместо того чтобы самому разрабатывать соответствующие RegEx шаблоны для каждого из инструментов, существует ли бесплатная (предпочтительно с открытым кодом) библиотека или инструмент

  • который принимает stdout и stderr вывод другого инструмента в качестве входных данных (например, в виде массива строк или в виде массива строк с пометкой о происхождении из stdout/stderr)
  • содержит множество модулей, способных распознавать вывод многих распространенных инструментов, таких как те, что я перечислил выше
    • (ожидается, что я должен явно указать, из какого инструмента происходит вывод, который я предоставляю)
  • распознает, какие последовательные строки идут вместе, образуя одно логическое сообщение
  • и, возможно, разбирает достаточно, чтобы определить тип сообщения, например, ошибка, предупреждение или информация
  • для того, чтобы в итоге вернуть список этих сообщений, используя ту же структуру данных или синтаксис независимо от входного инструмента

?


Пример:

Предположим, я компилирую некоторый TypeScript и tsc выводит следующие строки в stderr:

my-class.ts(14,6): error TS1005: '=>' expected.

14 func = x x + 2;
        ~~

my-class.ts(20,9): error TS1002: Unterminated string literal.

20 b = 'abc;
           ~

На основании этого, я бы ожидал следующий вывод – здесь напечатанный в формате JSON, в зависимости от того, как работает библиотека, это также может быть некоторая структура данных в соответствующем языке/среде:

[{
  "type": "error",
  "message": "my-class.ts(14,6): error TS1005: '=>' expected.\n\n14 func = x x + 2;\n        ~~"
}, {
  "type": "error",
  "message": "my-class.ts(20,9): error TS1002: Unterminated string literal.\n\n20 b = 'abc;\n           ~"
}]

1: И я не думаю, что они обычно предлагают CLI переключатель для записи в более стандартизированный/разбираемый формат – функция, которую я знаю в основном из инструментов модульного тестирования.

Ответ или решение

Парсинг вывода командной строки различных инструментов может быть особенно сложной задачей, особенно когда вы работаете с множеством инструментов, каждый из которых имеет собственный формат вывода. В вашем контексте разработки на платформе Azure DevOps через PowerShell возникает необходимость в автоматизации обработки вывода таких популярных инструментов, как npm, tsc, dotnet, GraphViz и pdflatex. Это требует создания интуитивной и унифицированной системы парсинга, которая может конвертировать разнообразный вывод в стандартный формат.

Теоретическая Основа

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

Пример Использования

Предположим, что вам необходимо обработать вывод компилятора TypeScript (tsc), который генерирует в stderr такие сообщения об ошибках:

my-class.ts(14,6): error TS1005: '=>' expected.

14 func = x x + 2;
        ~~

my-class.ts(20,9): error TS1002: Unterminated string literal.

20 b = 'abc;
           ~

Эти сообщения нужно превратить в структурированный формат, такой как JSON:

[{
  "type": "error",
  "message": "my-class.ts(14,6): error TS1005: '=>' expected.\n\n14 func = x x + 2;\n        ~~"
}, {
  "type": "error",
  "message": "my-class.ts(20,9): error TS1002: Unterminated string literal.\n\n20 b = 'abc;\n           ~"
}]

Практическое Применение

При разработке системы для обработки и парсинга вывода стоит рассмотреть возможность использования готовых библиотек и инструментов, которые облегчат этот процесс. В мире open source особенно ценны решения, которые экономят время и силы благодаря своей готовности и высокой степени адаптируемости.

  1. Выбор Инструмента: Начните с поиска библиотек, которые специализируются на парсинге вывода популярных CLI-инструментов. Примеры таких библиотек могут включать:

    • CliParser: Библиотека, которая специализируется на анализе вывода CLI-инструментов.
    • ParseIt: Еще одно решение, которое позволяет определять шаблоны для разбора вывода.
  2. Интеграция с DevOps: Обеспечьте возможность интеграции вашего парсера с Azure DevOps, чтобы каждый раз, когда инструмент генерирует сообщение, оно автоматически обрабатывалось. Это может быть реализовано через использование готовых скриптов на PowerShell, которые будут использовать вашу библиотеку для преобразования необработанного текстового вывода в структурированный формат.

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

  4. Рендеринг и Уведомления: После парсинга вся информация может быть экспортирована в унифицированный формат (например, JSON) и может быть использована для генерации уведомлений в DevOps. Это позволит команде получать упорядоченные и четкие сообщения о состоянии систем без необходимости manual-жонглирования логами.

  5. Поддержка и Обновления: Важно следить за обновлениями инструментов, поскольку изменение форматов вывода может потребовать изменений и в парсере. Рекомендуется входить в комьюнити разработчиков используемых инструментов, чтобы быть в курсе новых фич и изменений, а также вносить соответствующие правки в вашу систему.

Таким образом, подход к решению проблемы парсинга вывода командной строки проложит путь к созданию более системы мониторинга и диагностики, обеспечивающей высокую степень автоматизации и точности в сложных DevOps-средах.

Оцените материал
Добавить комментарий

Капча загружается...