Раздел 26 · Data Engineering

CI/CD для dbt: slim CI и проверки в пулл-реквесте

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В проекте «Гонца» теперь работают двое: ты и аналитик Аня, которая правит витрины для финансов. Вчера она переименовала колонку в stg_zones, проверила свою модель и влила правку. Ночью dbt build на проде упал на твоей витрине: она читала старое имя колонки. Отто остался без дашборда. Такие поломки ловят до слияния, автоматической проверкой каждого пулл-реквеста. Но собирать на каждую правку весь проект долго. Нужно собрать только то, что правка задела.

Пробник на кухне

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

Чтобы так рассуждать, повару нужно помнить вчерашние рецепты и сравнить их с сегодняшними. У dbt для этого есть манифест: файл target/manifest.json, где записаны все модели проекта с их кодом и конфигами.

Что такое CI

CI это робот, который на каждый пулл-реквест разворачивает проект и проверяет его. Для dbt проверка выглядит так: собрать модели правки во временной схеме, например dbt_ci_pr_42, прогнать их тесты и, если всё зелёное, разрешить слияние. Если тест упал, кнопка слияния серая, и сломанная модель на прод не попадает.

Наивный CI делает dbt build целиком. На проекте из десяти моделей это минута, на проекте из пятисот моделей это час и счёт за хранилище. Поэтому в dbt придумали slim CI: собирать только изменённое.

state:modified

Метод селектора state: сравнивает текущий проект с сохранённым манифестом. Манифест прода кладут в папку, например prod, и передают флагом --state:

СелекторЧто выберет
state:new --state prodузлы, которых в манифесте прода ещё нет
state:modified --state prodновые узлы и узлы, у которых поменялся код или конфиг
state:modified+ --state prodвсё изменённое и всех потомков

Плюс здесь тот же, что в уроке про селекторы. Без него CI проверит переименование колонки в stg_zones, но не заметит, что витрина ниже по графу сломалась. Именно эту ошибку пропустила Аня.

Тесты dbt добавляет сам: если модель изменилась, её тесты тоже попадут в выборку.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.