Как разделить структуру пакета Liquibase для среды разработки и продукта в Spring Boot?

Моя структура пакета выглядит так:

введите описание изображения здесь

В /db.changelog/db.changelod-master.xml я включаю /db.changelog/v1/db.changelog-1.0.xml, где я также включаю все журналы изменений из Пакет /db.changelog/v1/changeset.

В моем приложении у меня есть два профиля: dev и prod, и мне нужно разделить структуру пакетов в соответствии с «Лучшими практиками» Liquibase. Некоторые журналы изменений могут быть в среде prod и dev.

Кроме того, я могу использовать атрибут context в теге changeset и явно установить значение dev или prod, но это обходной путь не желательно.

Простое использование выглядит так: я переключаюсь на профиль prod, и некоторые таблицы не будут созданы или некоторые вставки в базу данных будут пропущены.

Не могли бы вы помочь мне реорганизовать структуру пакетов в соответствии с рекомендациями Liquibase?


person Abzelhan    schedule 04.10.2018    source источник
comment
1- Как вы определили профиль разработчика и продукта в своем приложении? 2- Какие инструменты сборки вы использовали? (Maven, Gradle, ...) 3- В чем разница между журналом изменений профиля разработчика и профиля продукта? Есть разделенные пути?   -  person M-Razavi    schedule 04.10.2018
comment
@ M-Razavi, 1. Мы определяем профиль в maven внутри тега ‹profile›, а также в модуле ресурсов мы разделили пакеты с именами: dev, prod, test. В каждом пакете есть свой файл application.properties. 2. Maven 3. Для prod у нас есть справочные значения, такие как список городов и т. Д. Для dev у нас также есть справочные значения, но также есть некоторые предопределенные данные, необходимые для среды разработки, и эти данные не должны загружаться после того, как мы переключим профиль на prod в maven. 3. Все журналы изменений находятся в пакете, который я показываю на скриншоте, и мне нужно разделить журналы изменений в зависимости от среды.   -  person Abzelhan    schedule 04.10.2018


Ответы (2)


Решение1:
Вам необходимо определить свойство liquibase.contexts в вашем yaml-файле. Что-то вроде ниже.

spring:
  profiles: dev
  datasource:
    url: jdbc:postgresql://localhost:5432/dev
    username: postgres
    password: password
    driver-class-name: org.postgresql.Driver
liquibase:
   contexts: dev

После добавления этого нижеприведенный набор изменений будет выполняться только тогда, когда ваш локальный профиль - это 'dev' (например, spring -boot: run -Dspring.profiles.active = dev)

<changeSet id="20161016_my_first_change2" author="krudland" context="dev">
    <sql>
        insert into customer (firstname, lastname) values ('Franklin','Ike');
    </sql>
    <rollback>
        delete from customer where firstname = 'Franklin' and lastname = 'Ike';
    </rollback>
</changeSet>

Решение2:
Если вы не хотите использовать liquibase.context, вы можете использовать maven для фильтрации ресурсов: ключ заключался в использовании элемента maven filter в в сочетании с элементом resource, как описано в документации Liquibase.

Также важно включить цель resources в команду maven:

mvn resources:resources liquibase:update -Plocal

Это иерархия файлов, которую я использовал:

|-- pom.xml
`-- src
    `-- main
       |-- resources
       |   `-- liquibase.properties
       |   |-- changelog
       |       `-- db-changelog-master.xml
       |       `-- db-changelog-1.0.xml
       |-- filters
           |-- local
           |   `-- db.properties
           |-- dev
           |   `-- db.properties

Файл db.properties будет выглядеть следующим образом:

database.driver = oracle.jdbc.driver.OracleDriver
database.url = jdbc:oracle:thin:@<host_name>:<port_number>/instance
database.username = user
database.password = password123
database.changelogfile = db.changelog-master.xml

Файл Liquibase.properties будет выглядеть следующим образом:

changeLogFile: changelog/${database.changelogfile}
driver: ${database.driver}
url: ${database.url}
username: ${database.username}
password: ${database.password}
verbose: true

Файл POM будет выглядеть следующим образом:

<build>
      <pluginManagement>
         <plugins>
            <plugin>
               <groupId>org.liquibase</groupId>
               <artifactId>liquibase-maven-plugin</artifactId>
               <version>3.1.0</version>
               <configuration>
                  <propertyFile>target/classes/liquibase.properties</propertyFile>
               </configuration>
            </plugin>
         </plugins>
      </pluginManagement>
   </build>


<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <filters>
                <filter>src/main/filters/local/db.properties</filter>
            </filters>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    </profile>
    <profile>
        <id>dev</id>
        <build>
            <filters>
                <filter>src/main/filters/dev/db.properties</filter>
            </filters>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>
person M-Razavi    schedule 04.10.2018
comment
вопрос: как разделить структуру пакета Liquibase для среды разработки и среды разработки. В моем вопросе я указываю, что могу использовать контексты. Мне нужно знать, как разделить наборы изменений на отдельные файлы xml для сред prod и dev. - person Abzelhan; 04.10.2018
comment
@MisterMagic использует фильтрацию ресурсов. Я обновил свой ответ - person M-Razavi; 05.10.2018
comment
spring: profiles: dev datasource: url: jdbc:postgresql://localhost:5432/dev username: postgres password: password driver-class-name: org.postgresql.Driver liquibase: contexts: dev Как насчет того, чтобы определить несколько профилей / контекстов? - person SoT; 17.06.2020
comment
@SoT какое решение? - person M-Razavi; 17.06.2020
comment
Кроме того, когда я применяю решение 2, я получил ошибку: Ошибка при установке или запуске Liquibase: liquibase.exception.DatabaseException: liquibase.exception.DatabaseException: не удалось создать соединение с $ {database.url} с драйвером org.postgresql. Водитель. Кажется, что он не может передать значение из dev / db.properties в liquibase.properties. - person SoT; 18.06.2020

Что касается меня, я помещаю dev, prod в другой набор изменений с другим контекстом.

Остались в том же файле.

<changeSet author="test" id="API-111" context="dev">
    <sql>
        insert into api_key(id, value) values (1, 'dev_value');                   
    </sql>
</changeSet>

<changeSet author="test" id="API-111" context="uat">
    <sql>
        insert into api_key(id, value) values (1, 'uat_value');                   
    </sql>
</changeSet>    

<changeSet author="test" id="API-111" context="prod">
    <sql>
        insert into api_key(id, value) values (1, 'prod_value');                   
    </sql>
</changeSet>  
person sendon1982    schedule 15.06.2020