Gymterview
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 выполняется всегда.