В проекте «Гонца» теперь работают двое: ты и аналитик Аня, которая правит витрины для финансов. Вчера она переименовала колонку в 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.