Learning Platform
Глоссарий Troubleshooting
Урок 17.04 · 20 мин
Начальный
PackagesVersioningUpdatesBreaking changesCompatibility

Обновление packages: версионирование и breaking changes

Когда dbt-проект растёт, packages становятся критической зависимостью. dbt_utils, dbt_expectations, codegen используются в десятках мест. Если в new version что-то изменилось — пайплайн может сломаться.

Этот урок — про процесс обновления packages: как читать changelog, как обновлять, как тестировать.


Semantic versioning

Большинство dbt-packages следуют semantic versioning — формат MAJOR.MINOR.PATCH:

ЧастьКогда меняетсяПример
MAJORBreaking changes. API не совместим со старой версией.1.0.0 -> 2.0.0
MINORNew features, обратно-совместимые.1.3.0 -> 1.4.0
PATCHBug fixes, обратно-совместимые.1.3.0 -> 1.3.1

В packages.yml:

packages:
  - package: dbt-labs/dbt_utils
    version: 1.3.0    # exact (рекомендуется)

  - package: calogica/dbt_expectations
    version: [">=0.10.0", "<0.11.0"]    # range (мажор фиксирован)

Best practice: exact version в production. Range — для разработки/exploration.


Что в changelog

Перед обновлением — прочитайте changelog. Это обычно CHANGELOG.md в репозитории пакета. Для dbt_utils: https://github.com/dbt-labs/dbt-utils/blob/main/CHANGELOG.md.

Типичный changelog:

# dbt_utils 1.3.0 (2024-12-15)

## Breaking Changes
- Removed deprecated `dbt_utils.surrogate_key()` (use `generate_surrogate_key`)
- `dbt_utils.star` теперь требует dbt-core >= 1.5.0

## Features
- Added `dbt_utils.deduplicate` macro
- `pivot()` now supports custom separator

## Fixes
- Fix `date_spine` on BigQuery for leap years
- Better error message in `unique_combination_of_columns`

Что искать:

  1. Breaking changes — что нужно поправить в проекте.
  2. Deprecated — что нужно мигрировать (даже если ещё работает).
  3. Required dbt-core version — может ли пакет работать с вашей версией.

Reading deprecation warnings

dbt пишет warnings при использовании deprecated функций. Например:

$ dbt run
WARNING: dbt_utils.surrogate_key is deprecated. Use dbt_utils.generate_surrogate_key instead.
  Found in: models/marts/dim_customers.sql:5

Эти warnings — first signal что нужно update код. Если их игнорировать — следующая major version пакета удалит deprecated, и проект упадёт.

Best practice: relay warnings in PR review. Любая новая deprecated warning — не merge, фикс.


Обновление: dbt deps —upgrade

# Apply versions from packages.yml + update package-lock.yml
dbt deps

# Force update — игнорирует lock-файл, тянет latest matching versions
dbt deps --upgrade

dbt deps --upgrade особенно полезен, если у вас в packages.yml:

- package: dbt-labs/dbt_utils
  version: [">=1.0.0", "<2.0.0"]

Без --upgrade: dbt deps читает lock и устанавливает версию из lock (например 1.0.5). С --upgrade: dbt deps игнорирует lock, резолвит latest matching (например 1.3.2). Lock обновляется.

В практике:

  1. Локально: dbt deps --upgrade для обновления версий.
  2. CI: dbt deps (без флага) — читает lock, всем одинаковые версии.

После dbt deps --upgrade — закоммитьте новый package-lock.yml в git.


Процесс обновления: пошаговый

Допустим, вы хотите обновить dbt_utils с 1.0.0 до 1.3.0.

Шаг 1: Прочитать changelog

Открыть CHANGELOG.md dbt_utils. Прочитать все entries между 1.0 и 1.3:

  • Что breaking?
  • Что deprecated?
  • Какие new features (могут быть полезны)?

Шаг 2: Update packages.yml

# До:
- package: dbt-labs/dbt_utils
  version: 1.0.0

# После:
- package: dbt-labs/dbt_utils
  version: 1.3.0

Шаг 3: dbt deps

dbt deps --upgrade

Может появиться warning о conflicts с другими пакетами. Resolve через обновление их версий тоже.

Шаг 4: Run full test suite

dbt build

dbt build запускает всё: models, tests, snapshots, seeds. Если breaking change что-то ломает — поймаете.

Шаг 5: Investigate failures

Что часто ломается:

Тип проблемыСимптомРешение
Deprecated macrocompilation error: macro 'surrogate_key' not foundЗаменить на generate_surrogate_key
Changed signatureunexpected argument 'foo'Прочитать docs new version, обновить вызовы
Removed configconfig 'bar' is no longer supportedMigrate config to new format
dbt-core incompatiblepackage requires dbt-core >= 1.5, you have 1.3Сначала обновить dbt-core, затем package

Шаг 6: Update код

Например, заменить surrogate_key на generate_surrogate_key:

-- До:
{{ dbt_utils.surrogate_key(['customer_id', 'order_id']) }}

-- После:
{{ dbt_utils.generate_surrogate_key(['customer_id', 'order_id']) }}

Используйте grep или sed для massive find/replace:

grep -rn "dbt_utils.surrogate_key" models/
# Найдите все вхождения, замените

# Или autoреплейс (осторожно с backup):
find models/ -name "*.sql" -exec sed -i.bak 's/dbt_utils.surrogate_key/dbt_utils.generate_surrogate_key/g' {} \;

Шаг 7: Rerun build + tests

dbt clean    # очистить старые artifacts
dbt deps
dbt build

Если всё passes — обновление успешно.

Шаг 8: Commit + PR

git add packages.yml package-lock.yml models/
git commit -m "Update dbt_utils to 1.3.0"
git push origin update-dbt-utils
# -> PR

В PR description — обычно описывают breaking changes и rationale.


Известные breaking changes (2026 baseline)

dbt_utils

FromToBreaking
0.x1.0Removed compatibility with dbt-core менее 1.0. Renamed surrogate_key -> generate_surrogate_key (alias kept).
1.01.1None significant.
1.11.2Removed dbt_utils.except (use SQL EXCEPT).
1.21.3dbt_utils.pivot syntax changes for null handling.

dbt_expectations

FromToBreaking
0.7.x0.8.xRenamed several test names; dropped support for dbt менее 1.3.
0.8.x0.9.xNew parametrize syntax for some tests; old syntax raises error.
0.9.x0.10.xDrop dbt-core менее 1.7 support. Some tests now require additional macros.

Прочтите конкретный changelog перед мажорным upgrade.


Compatibility матрица

На момент 2026:

PackageLatest versiondbt-core compatibility
dbt-labs/dbt_utils1.3.xне меньше 1.5.0
calogica/dbt_expectations0.10.xне меньше 1.7.0
dbt-labs/codegen0.13.xне меньше 1.5.0
dbt-labs/audit_helper0.12.xне меньше 1.5.0
dbt-labs/dbt_external_tables0.10.xне меньше 1.5.0

dbt-core 1.10 — все актуальные пакеты совместимы.


CI: автоматическое тестирование обновлений

Используйте Dependabot или Renovate для авто-PR с обновлениями:

# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

Для dbt packages есть отдельные tools, например:

  • dbt-bouncer — для квалити чеков.
  • Custom GitHub Actions, которые читают packages.yml + проверяют новые версии.

Альтернатива: manually обновлять раз в квартал. Это плохо для security patches, но в практике работает в маленьких командах.


Антипаттерны обновлений

Антипаттерны обновлений packages

Реальный package-lock.yml пример

Что в нём после dbt deps:

# package-lock.yml (генерируется dbt 1.7+)
packages:
  - package: dbt-labs/dbt_utils
    version: 1.3.0
  - package: calogica/dbt_expectations
    version: 0.10.4
  - git: https://github.com/dbt-labs/codegen.git
    revision: 0fa6bfe3ee04b6c0d9b65e30c70f3f81a8d80b6c   # exact commit SHA
sha1_hash: 8a2f3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a

Что замечается:

  1. Hub-пакеты — фиксируется exact version.
  2. Git-пакеты — фиксируется exact commit SHA (даже если в packages.yml был tag).
  3. sha1_hash — целостность lock-файла.

После обновления dbt deps --upgrade:

# Новый package-lock.yml
packages:
  - package: dbt-labs/dbt_utils
    version: 1.3.2   # был 1.3.0, теперь 1.3.2
  - package: calogica/dbt_expectations
    version: 0.10.4
  ...

Только что изменилось — обновилась версия. CI на всех будет получать одинаковые.


Попробуй сам

В вашем dbt-проекте:

  1. Установите dbt_utils 1.0.0 (старая версия):
packages:
  - package: dbt-labs/dbt_utils
    version: 1.0.0
dbt deps
cat package-lock.yml  # увидите 1.0.0
  1. Используйте deprecated surrogate_key в модели:
-- models/test_macro.sql
SELECT {{ dbt_utils.surrogate_key(['customer_id', 'order_id']) }} AS sk
FROM {{ ref('stg_jaffle__orders') }}
dbt run --select test_macro
# Может пройти с warning или success — зависит от версии
  1. Обновите до 1.3.0:
packages:
  - package: dbt-labs/dbt_utils
    version: 1.3.0
dbt deps --upgrade
cat package-lock.yml  # теперь 1.3.0
  1. Перезапустите test_macro:
dbt run --select test_macro
# WARNING: dbt_utils.surrogate_key is deprecated...
  1. Migrate к новому имени:
SELECT {{ dbt_utils.generate_surrogate_key(['customer_id', 'order_id']) }} AS sk
dbt run --select test_macro  # теперь без warning

Это миниатюра реального процесса update. На production-проекте — то же самое, но на 50+ файлах.


Ключевые выводы

  1. Semantic versioning (MAJOR.MINOR.PATCH). Major — breaking, minor — features, patch — fixes.
  2. packages.yml: exact version в production. Range [">=1.0.0", "менее 2.0.0"] с upper bound для гибкости.
  3. package-lock.yml (1.7+) — фиксирует exact versions. Коммитьте в git — все получают одно.
  4. dbt deps — apply из lock. dbt deps --upgrade — игнорирует lock, latest matching.
  5. Процесс обновления: changelog -> packages.yml -> dbt deps —upgrade -> dbt build -> fix breakings -> commit.
  6. Deprecation warnings — first signal. Migrate в момент появления, не накапливайте.
  7. Антипаттерны: update без changelog, range без upper bound, скип патч-версий, combine update с feature work в одном PR.
  8. Автоматизация: Dependabot / Renovate для auto-PR с updates.
GitHub Flow для обновлений
Проверка знанийKnowledge check
В CI упал dbt build с ошибкой 'macro generate_surrogate_key not found, did you mean surrogate_key?'. В git logs видно, что вчера обновили dbt_utils с 0.8.0 до 1.0.0. Что произошло?
ОтветAnswer
Это **наоборот** — старая версия не имеет нового макроса. Несколько возможностей:\n\n1. **package-lock.yml не закоммитили.** В `packages.yml` написано 1.0.0, но `package-lock.yml` ещё содержит 0.8.0. В CI dbt deps читает lock — тянет 0.8.0. Решение: обновить lock и закоммитить:\n\n```bash\ndbt clean\ndbt deps --upgrade\ngit add package-lock.yml\ngit commit -m "Update lock to dbt_utils 1.0.0"\n```\n\n2. **dbt_packages/ закоммичены (старый антипаттерн).** Если `dbt_packages/` в git, CI берёт оттуда — 0.8.0. Решение: `dbt_packages/` в `.gitignore`.\n\n3. **dbt deps не запускается в CI.** Проверьте pipeline: должно быть `dbt deps && dbt build`. Если только `dbt build` — пакеты не обновятся.\n\n4. **CI кэширует dbt_packages/ старый.** Если есть GitHub Actions cache на `dbt_packages/` — он может содержать 0.8.0. Решение: invalidate cache или сделать его зависимым от `hashFiles('packages.yml', 'package-lock.yml')`.\n\n5. **`--upgrade` не использовался при первом обновлении.** Локально сделали `dbt deps` (без --upgrade) после правки packages.yml — lock не обновился (если был range). Запустить `dbt deps --upgrade`.\n\nДиагностика: `cat package-lock.yml` — какие версии локально. `cat dbt_packages/dbt_utils/dbt_project.yml` — какая версия реально скачана. Сверить.
Проверка знанийKnowledge check
Команда хочет обновить dbt_expectations с 0.8 до 0.10. Major version bump с breaking changes. Какой план?
ОтветAnswer
План в 6 шагов:\n\n**1. Прочитать changelog**.\n\n[CHANGELOG dbt_expectations](https://github.com/calogica/dbt-expectations/blob/main/CHANGELOG.md). Записать:\n- Какие тесты переименованы (старые ↔ новые имена)?\n- Какие тесты удалены (нужны workaround)?\n- Какие сигнатуры изменились (новые параметры)?\n- Требует ли новая версия dbt-core, который у нас?\n\n**2. Сделать checklist что нужно поправить**.\n\nНапример: «в 20 моделях используется `dbt_expectations.expect_column_values_to_be_within_set` — оно переименовано в `expect_column_values_to_be_in_set`».\n\n**3. Создать feature branch для upgrade**.\n\n```bash\ngit checkout -b upgrade-dbt-expectations-0.10\n```\n\nЭто isolated PR — только upgrade. Не смешивать с другими feature.\n\n**4. Обновить packages.yml + dbt deps --upgrade**.\n\n```yaml\n- package: calogica/dbt_expectations\n version: 0.10.4\n```\n\n```bash\ndbt deps --upgrade\n```\n\n**5. Запустить dbt build, найти все breakings**.\n\n```bash\ndbt build 2>&1 | tee build.log\ngrep -i error build.log\n```\n\nИсправить каждую ошибку по checklist'у. Find/replace для массовых переименований:\n\n```bash\ngrep -rn "expect_column_values_to_be_within_set" models/\nfind models/ -name "*.yml" -exec sed -i.bak 's/expect_column_values_to_be_within_set/expect_column_values_to_be_in_set/g' {} \\;\n```\n\nПовторять цикл пока `dbt build` не passes.\n\n**6. PR review и testing**.\n\nPR review — отдельный от feature PR. Reviewer проверяет:\n- packages.yml + package-lock.yml согласованы.\n- Все deprecation warnings из старой версии fixed (не накапливаем).\n- `dbt test` passes на dev environment.\n- CI green.\n\nДополнительно: запустить на **staging environment** (если есть) перед merge в main. Major upgrades — особенно осторожно.\n\nВремя на такой upgrade: **2-3 дня** на среднем проекте (50-100 моделей). На больших — до недели. Этап рутинный, но требует фокуса.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Semantic versioning (semver): 1.3.0 -> 2.0.0 vs 1.3.0 -> 1.4.0 vs 1.3.0 -> 1.3.1 — что в каждом случае?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 4