middle
Что такое contexts и labels? Когда их использовать?
Contexts и labels — два механизма фильтрации changeset-ов, позволяющие выполнять разные наборы миграций в зависимости от окружения или задачи.
Contexts
Contexts привязывают changeset к определённому окружению (dev, test, staging, prod) и выполняют его только при совпадении контекста.
Пример
<changeSet id="7" author="ivanov" context="dev">
<insert tableName="users">
<column name="username" value="test_user"/>
<column name="email" value="test@example.com"/>
</insert>
</changeSet>
При запуске указывается контекст:
Пример
liquibase --contexts=dev update
Или в Spring Boot:
Пример
spring.liquibase.contexts=dev
Changeset без указания context выполняется всегда, вне зависимости от переданного контекста.
Labels
Labels — более гибкий механизм фильтрации. Labels поддерживают логические выражения (AND, OR, NOT, скобки).
Пример
<changeSet id="8" author="ivanov" labels="JIRA-456, release-2.0">
<addColumn tableName="accounts">
<column name="currency" type="VARCHAR(3)" defaultValue="RUB"/>
</addColumn>
</changeSet>
При запуске:
Пример
liquibase --label-filter="JIRA-456" update
Разница между contexts и labels
| Критерий | Contexts | Labels |
|---|---|---|
| Назначение | Разделение по окружениям | Разделение по задачам, релизам, фичам |
| Логика на changeset | Через запятую (OR) | Через запятую (OR) |
| Логика при запуске | Через запятую (OR) | Поддерживает AND, OR, NOT, скобки |
| Типичный пример | context="dev,test" |
labels="JIRA-123, release-1.5" |
На собеседовании: главное — чётко разделить назначение: contexts для окружений, labels для задач и релизов. Частая ошибка — путать их или не знать, что changeset без context выполняется всегда.