Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Слой операций

Операции отвечают за формирование SQL-запросов с помощью jOOQ, их выполнение и формирование на основе полученных данных результатов в виде классов предметной области.

Центральный компонент слоя операций – класс OperationHolder. Через него web-слою предоставляется доступ к операциям. OperationHolder инициализируется в main() функции приложения единожды при компиляции и зависит от контекста выполнения запросов DSLContext библиотеки jOOQ.

DSLContext создается функцией createJooqContext на основе данных для подключения к БД по протоколу JDBC. Контекст подключения создается исключительно в main() функции и передается в OperationHolder.

Subqueries

Подзапросы представляют собой переиспользуемые части запросов. Они встраиваются в другие запросы и позволяют избежать дублирования кода операций.

ExtractBuilderIdSubquery

Подзапрос для получения идентификатора Builder, используя SHA1 хэш от имени. Поиск по хэш позволяет использовать индекс для получения конкретного типа сборки.

ExtractFilteredBuildsSubquery

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

ExtractInvokedBuildsSubquery

Подзапрос для получения сборок, запущенных в рамках выполнения шага (steps). В базе данных buildbot связь шага и запущенной им сборки хранится в формате json в поле buildbot.steps.urls_json, примеры:

Запуск одной сборки:

[
  { // запрос на создание сборки X
    "name": "install_test_one_step_all #2203993",
    "url": "https://mdbe-buildbot.mariadb.net/#/buildrequests/2203993"
  },
  { // сборка X, добавляется только после завершения выполнения сборки
    "name": "failure: install_test_one_step_all #23601",
    "url": "https://mdbe-buildbot.mariadb.net/#/builders/21/builds/23601"
  }
]

Запуск нескольких сборок:

[
  { // запрос на создание сборки X
    "name": "run_mtr_all #2203368",
    "url": "https://mdbe-buildbot.mariadb.net/#/buildrequests/2203368"
  },
  {
    "name": "run_mtr_all #2203369",
    "url": "https://mdbe-buildbot.mariadb.net/#/buildrequests/2203369"
  },
  { // сборка X, добавляется только после завершения выполнения сборки
    "name": "success: Running all MTR on 'aarch64_rhel_9_gcp' #290",
    "url": "https://mdbe-buildbot.mariadb.net/#/builders/766/builds/290"
  },
  {
    "name": "success: Running all MTR on 'rocky_9_gcp' #436",
    "url": "https://mdbe-buildbot.mariadb.net/#/builders/608/builds/436"
  }
]

Данный подзапрос позволяет каждому шагу сопоставить дочерние сборки, которые он запустил. Выбираются только url, содержащие подстроку buildrequests и берется buildrequestid (число после последнего /), далее по нему находится запущенная сборка.

url -> id запроса на запуск сборки -> сборка
 
https://mdbe-buildbot.mariadb.net/#/buildrequests/2203368 -> 2203368 -> BuildsRecord(id=2198479, ...)

Так же дополнительно определено выражение invocationType, которое позволяет классифицировать шаги по типу запуска дочених задач:

  • MULTIPLE – запуск нескольких задач;
  • SINGLE – запуск одной задачи;
  • NONE – без запуска дочерних задач.

Операции

Все операции делятся на два типа:

  • публичные, которые вызываются из обработчиков;
  • приватные, которые используются только в рамках других операций.

ExtractBuildOperation

Операция для получения детальной информации о сборке, которая после будет отображена на странице сборки (странице с детальной информацией).

Входные данные:

  • номер сборки (builds.number);
  • конфигурация (BuildConfiguration)
    • тип сборки (dashboard),
    • теги интересующих шагов (например, #16, #21),
    • необходимые свойства сборки (например, target, branch, Image).

Выходные данные – объект ProcessedBuildInfo, если сборка с указанным номером существует, и NoBuildError, если нет.

ExtractBuildPackagesAllOperation

Операция для получения краткой информации по нескольким сборкам одного типа (builder). Используется для страниц панелей.

[Примечание] BuildPackagesAll в названии класса неверно, эта операция позволяет получать данные для любого типа сборки.

Входные данные:

  • buildConfiguration – конфигурация (BuildConfiguration),
  • paginationStart – порядковый номер первого элемента для постраничного отображения,
  • buildsLimit – количество выбираемых сборок,
  • filters – набор применяемых фильтров.

Выходные данные: список объектов BuildInfo.

Логика работы:

  1. Выбираем N сборок с учетом фильтров и постраничного вывода.
  2. Только для выбранных сборок получаем:
    • родительские сборки (если сборка была запущена другой сборкой),
    • значения интересующих свойств,
    • интересующие шаги.
  3. Формируем список объектов BuildInfo, связывая отдельные группы данных по id сборки.

ExtractBuildPropertiesOperation

Приватная операция, которая позволяет выбирать значения свойств для нескольких сборок.

ExtractBuildStepsOperation

Приватная операция, которая позволяет выбирать интересующие шаги нескольких сборок. Используется для панелей.

В результате выполнения операции для каждой сборки формируется ассоциативный массив, где ключ – тег шага (#16, #21), а значение – StepAndBuild. Пара шаг и сборка, которую он запустил.

[Важно] Принято соглашение. Если шаг запускал несколько сборок, то результат выполнения шага берется, из результата самого шага, а не результата запущенной им сборки. В тоже время данные запущенной шагом сборки заменяются данными основной сборки. На панелях это отражается следующим образом: ссылки рядом с шагами, которые запускают несколько дочерних сборок, ведут на саму основную сборку, а не на какую-либо из запущенных шагом.

ExtractParentBuildOperation

Приватная операция, которая позволяет находить для сборок их родительские сборки. Родитеская сборка – это сборка, которая в рамках одного из своих шагов запустила данную дочернюю сборку.

ExtractTotalNumberFailedTests

Операция для подсчета общего количества упавших тестов для MaxScale сборок. Данные запрошиваются из бд maxscale_test_results. На панелях Build & Test MaxScale и Test MaxScale Parallel это значение отображается как Total number of failed tests

ExtractStepConfigDifferenceOperation

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

ExtractFiltersCacheOperation

Данная операция не определена в OperationHolder, она используется в фоновой задаче jobrunr.backgroundTasks.RefreshFiltersCacheTask и позволяет получать все возможные значения определенных параметров для конкретных типов сборок. Полученные данные используются в элементах на страницах фильтрации, в качестве возможных вариантов выбора.