Continuous integration jobs в dbt
Вы можете настроить задания непрерывной интеграции (CI), которые будут запускаться, когда кто‑то открывает новый pull request (PR) в вашем репозитории Git. Запуская и тестируя только изменённые модели, dbt обеспечивает максимальную эффективность таких заданий и бережное использование ресурсов вашей платформы данных.
Если у вас монорепозиторий с несколькими dbt‑проектами, открытие одного pull request в одном из проектов приведёт к запуску заданий для всех проектов, подключённых к этому монорепозиторию. Чтобы избежать этого, вы можете использовать отдельные целевые ветки для каждого проекта (например, main-project-a, main-project-b), чтобы разделить триггеры CI.
Предварительные требования
- У вас есть аккаунт dbt.
- Возможности CI:
- Для функций параллельных CI‑проверок и умной отмены устаревших сборок ваш аккаунт dbt должен быть на тарифе Starter, Enterprise или Enterprise+.
- SQL‑линтинг доступен на release tracks dbt и для аккаунтов dbt на тарифах Starter, Enterprise или Enterprise+. В вашем проекте должен быть настроен SQLFluff.
- Возможности Advanced CI:
- Для функции compare changes ваш аккаунт dbt должен быть на тарифе уровня Enterprise и иметь включённые функции Advanced CI. Пожалуйста, попросите администратора dbt включить эту возможность. После включения в настройках CI‑задания станет доступна опция dbt compare.
- Настройте подключение к вашему провайдеру Git. Эта интеграция позволяет dbt запускать задания от вашего имени при срабатывании триггеров.
- Если вы используете нативную интеграцию с GitLab, вам потребуется платный или self‑hosted аккаунт, который поддерживает GitLab webhooks и project access tokens. Если вы используете GitLab Free, merge request’ы будут запускать CI‑задания, но статус выполнения CI (успех или ошибка задания) не будет передаваться обратно в GitLab.
Доступность функций в зависимости от Git‑провайдера
-
Если ваш git‑провайдер имеет нативную интеграцию с dbt, вы можете без лишних усилий настраивать задания continuous integration (CI) прямо в dbt.
-
Для провайдеров без нативной интеграции вы всё равно можете использовать метод Git clone, чтобы импортировать git URL, и задействовать Administrative API dbt для запуска CI‑заданий.
В следующей таблице приведены доступные варианты интеграции и соответствующие им возможности.
| Loading table... |
Настройка CI-задач
dbt Labs рекомендует создавать CI‑задания в отдельной deployment environment dbt, подключённой к staging‑базе данных. Наличие отдельного окружения, выделенного специально для CI, обеспечивает лучшую изоляцию между временными схемами, создаваемыми в CI, и вашими production‑сборками данных.
Кроме того, иногда командам требуется, чтобы CI‑задания запускались при создании PR не только в ветку main. Если в рамках процесса релизов ваша команда поддерживает staging‑ветку, отдельное окружение позволит задать пользовательскую ветку. Соответственно, CI‑задание в этом выделенном окружении будет запускаться только при создании PR в указанную пользовательскую ветку. Подробнее см. в разделе Get started with CI tests.
Чтобы упростить создание CI заданий, многие параметры на странице CI задания установлены на значения по умолчанию, которые dbt Labs рекомендует использовать. Если вы не хотите использовать значения по умолчанию, вы можете их изменить.
-
На странице вашей среды развертывания нажмите Создать задание > Задание непрерывной интеграции, чтобы создать новое CI задание.
-
Параметры в разделе Настройки задания:
- Имя задания — Укажите имя для этого CI задания.
- Описание — Предоставьте описание CI задания.
- Среда — По умолчанию будет установлена среда, из которой вы создали CI задание. Используйте выпадающий список, чтобы изменить настройку по умолчанию.
-
Опции в разделе Git trigger:
- Triggered by pull requests — По умолчанию эта опция включена. Каждый раз, когда разработчик открывает pull request или отправляет коммит в уже существующий pull request, эта задача будет автоматически запускаться.
- Run on draft pull request — Включите эту опцию, если вы хотите, чтобы задача также запускалась каждый раз, когда разработчик открывает черновик pull request (draft pull request) или отправляет коммит в этот черновик.
- Triggered by pull requests — По умолчанию эта опция включена. Каждый раз, когда разработчик открывает pull request или отправляет коммит в уже существующий pull request, эта задача будет автоматически запускаться.
-
Опции в разделе Execution settings:
-
Commands — По умолчанию здесь указан командный вызов
dbt build --select state:modified+. Он сообщает dbt, что нужно собирать только новые или изменённые модели и все зависящие от них downstream‑модели. Важно отметить, что сравнение состояния (state comparison) возможно только в том случае, если выбрано отложенное окружение (deferred environment), с которым будет выполняться сравнение. Нажмите Add command, чтобы добавить дополнительные commands, которые должны выполняться при запуске этой задачи. -
Linting — Включите эту опцию, чтобы dbt выполнил linting SQL‑файлов в вашем проекте в качестве первого шага
dbt run. Если в ходе этой проверки возникает ошибка, dbt может либо Stop running on error, либо Continue running on error. -
dbt compareEnterpriseEnterprise + — Включите эту опцию, чтобы сравнить последнее применённое состояние production‑окружения (если оно существует) с последними изменениями из pull request и определить, в чём заключаются различия. Чтобы включить сравнение на уровне записей и анализ по первичному ключу, необходимо добавить primary key constraint или uniqueness test. В противном случае в dbt вы получите сообщение об ошибке «Primary key missing».
Чтобы просмотреть отчёт о сравнении, перейдите на вкладку Compare tab в деталях запуска задачи. Краткая сводка отчёта также доступна непосредственно из pull request в вашем провайдере Git (см. пример CI‑отчёта).
Чтобы просмотреть отчет о сравнении, перейдите на вкладку Сравнение в деталях выполнения задания. Краткое содержание отчета также доступно из pull запроса в вашем Git провайдере (см. пример отчета CI).
Совет по оптимизацииКогда вы включаете флажок dbt compare, вы можете настроить команду сравнения для оптимизации вашего CI задания. Например, если у вас есть большие модели, которые занимают много времени для сравнения, вы можете исключить их, чтобы ускорить процесс, используя флаг
--exclude. Обратитесь к пользовательским командам сравнения изменений для получения более подробной информации.Кроме того, если вы установите
event_timeв ваших моделях/семенах/снимках/источниках, это позволит вам сравнивать совпадающие диапазоны дат между таблицами, фильтруя их по пересекающимся диапазонам дат. Это полезно для более быстрого рабочего процесса CI или настройки пользовательской выборки.
-
-
Сравнение изменений с окружением (Deferral) — По умолчанию в качестве такого окружения используется Production, если вы его создали. Эта опция позволяет dbt сравнивать состояние кода в PR с кодом, который выполняется в отложенном окружении, чтобы проверять только изменённый код, а не пересобирать всю таблицу или весь DAG целиком.
к сведениюВ более ранних версиях dbt была доступна возможность отложенного выполнения только относительно конкретного job, а не окружения. При deferral к job состояние сравнивается с кодом проекта из последнего успешного запуска этого job. Deferral к окружению более эффективен, поскольку dbt сравнивает код с представлением проекта (которое хранится в
manifest.json) из последнего успешного deploy job, выполненного в этом окружении. Учитывая все deploy jobs, которые выполняются в отложенном окружении, dbt получает более точное и актуальное представление состояния проекта.- Тайм-аут выполнения — Отмените CI задание, если время выполнения превышает значение тайм-аута. Вы можете использовать эту опцию, чтобы гарантировать, что проверка CI не потребляет слишком много ресурсов вашего хранилища. Если вы включите опцию dbt compare, значение тайм-аута по умолчанию будет
3600(один час), чтобы предотвратить длительные сравнения.
- Тайм-аут выполнения — Отмените CI задание, если время выполнения превышает значение тайм-аута. Вы можете использовать эту опцию, чтобы гарантировать, что проверка CI не потребляет слишком много ресурсов вашего хранилища. Если вы включите опцию dbt compare, значение тайм-аута по умолчанию будет
-
(необязательно) Параметры в разделе Advanced settings:
- Environment variables — Определите переменные окружения, чтобы настроить поведение проекта при выполнении этого CI‑задания. Вы можете указать, что CI‑задание запускается в окружении Staging или CI, задав переменную окружения и изменив код проекта так, чтобы он вел себя по‑разному в зависимости от контекста. Для команд распространена практика обрабатывать в CI только подмножество данных, используя переменные окружения для ветвления логики в коде dbt‑проекта.
- Target name — Определите target name. Аналогично Environment Variables, этот параметр позволяет настраивать поведение проекта. Его можно использовать, чтобы указать, что CI‑задание выполняется в окружении Staging или CI, задав имя таргета и изменив код проекта так, чтобы он вел себя по‑разному в зависимости от контекста.
- dbt version — По умолчанию используется версия dbt, унаследованная от окружения. dbt Labs настоятельно рекомендует не менять значение по умолчанию. Возможность переопределить версию на уровне задания полезна только при обновлении проекта на следующую версию dbt; в остальных случаях несоответствие версий между окружением и заданием может привести к запутанному поведению.
- Threads — По умолчанию установлено значение 4 threads. Увеличьте количество потоков, чтобы повысить параллельность выполнения моделей.
- Generate docs on run — Включите этот параметр, если хотите генерировать документацию проекта при выполнении этого задания. По умолчанию он отключён, поскольку проверка генерации документации при каждом CI‑прогоне не является рекомендуемой практикой.
- Run source freshness — Включите этот параметр, чтобы перед запуском CI‑задания выполнить команду
dbt source freshness. Подробнее см. в разделе Source freshness.
Пример CI-проверки в pull request
Ниже приведен пример CI-проверки в pull request на GitHub. Зеленая галочка означает, что dbt build и тесты завершились успешно. Если нажать на секцию dbt, вы перейдете к соответствующему CI-запуску в dbt.
Пример CI-отчета в pull request Preview
Ниже приведен пример CI-отчета в pull request на GitHub, который отображается, когда для CI job включена опция dbt compare. В нем показана высокоуровневая сводка по моделям, которые изменились в pull request.
Триггер CI job через API EnterpriseEnterprise +
Если вы не используете нативную интеграцию dbt с Git через GitHub, GitLab или Azure DevOps, вы можете использовать Administrative API, чтобы запускать CI job. Однако dbt не будет автоматически удалять временную схему. Это связано с тем, что автоматическое удаление зависит от входящих webhook’ов от провайдеров Git, а это доступно только через нативные интеграции.
Предварительные требования
- У вас есть учетная запись dbt.
- У вас тариф dbt Enterprise или Enterprise+. Доступ также сохраняется у legacy Team планов.
- Для возможностей Concurrent CI checks и Smart cancellation of stale builds ваш аккаунт dbt должен быть на тарифе Enterprise или Enterprise+ (а также у legacy Team планов). Starter планы не имеют доступа к этим возможностям при триггере CI job через API.
- Настройте CI job через API endpoint Create Job, указав
"job_type": ci, или через UI dbt. - Вызовите API endpoint Trigger Job Run, чтобы запустить CI job. В payload нужно обязательно передать оба поля:
-
Укажите ID pull request (PR) в одном из следующих полей:
github_pull_request_idgitlab_merge_request_idazure_devops_pull_request_idnon_native_pull_request_id(например, для BitBucket)
-
Укажите
git_shaилиgit_branch, чтобы нацелиться на нужный commit или ветку, относительно которых нужно выполнить job.
-
Семантические проверки в CI StarterEnterpriseEnterprise +
Автоматически тестируйте ваши семантические узлы (метрики, семантические модели и сохраненные запросы) во время обзоров кода, добавляя проверки валидации хранилища в ваше CI задание, гарантируя, что любые изменения кода в dbt моделях не нарушают эти метрики.
Для этого добавьте команду dbt sl validate --select state:modified+ в CI задание. Это обеспечивает валидацию измененных семантических узлов и их зависимостей.
Преимущества
- Тестирование семантических узлов в CI-задаче поддерживает deferral и selection для семантических узлов.
- Это позволяет выявлять проблемы на ранних этапах разработки и предоставлять конечным пользователям данные высокого качества.
- Семантическая валидация выполняет explain-запрос в хранилище данных для семантических узлов, чтобы убедиться, что сгенерированный SQL будет корректно выполняться.
- Для семантических узлов и моделей, которые не находятся ниже по графу зависимостей от изменённых моделей, dbt выполняет deferral к продакшн‑моделям.
Настройка семантических проверок в вашем CI задании
Чтобы узнать, как это настроить, обратитесь к следующим шагам:
- Перейдите на страницу Настройки задания и нажмите Редактировать.
- Добавьте команду
dbt sl validate --select state:modified+в раздел Команды в Настройках выполнения. Команда использует выбор состояния и отложение для выполнения валидации на любых семантических узлах, зависимых от изменений модели. Чтобы сократить время выполнения задания, мы рекомендуем запускать CI только на измененных семантических моделях. - Нажмите Сохранить, чтобы сохранить изменения.
Существуют дополнительные команды и варианты использования, описанные в следующем разделе, такие как валидация всех семантических узлов, валидация конкретных семантических узлов и так далее.
Проверка семантических узлов, находящихся ниже по графу зависимостей от изменений моделей, в вашем CI‑джобе.Варианты использования
Используйте или комбинируйте различные селекторы или команды для проверки семантических узлов в вашем CI задании. Семантические проверки в CI поддерживают следующие варианты использования:






