liquibase maven 插件多个 changeLogFile

Alk*_*ris 4 liquibase maven-3 maven jenkins

我正在使用liquibase maven plugin通过jenkins自动构建更新数据库更改。

我有这个 pom.xml

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.4.2</version>
    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.5</version>
        </dependency>
    </dependencies>
    <configuration>
        <changeLogFile>${basedir}/src/main/resources/schema.sql</changeLogFile>
        <changeLogFile>${basedir}/src/main/resources/data.sql</changeLogFile>
        <driver>org.postgresql.Driver</driver>
        <url>jdbc:postgresql://${db.url}</url>
        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我需要跑schema.sql之前data.sql。当我在本地运行它时,它可以工作。当我通过 jenkins 运行它时,schema changeLogFile第二个执行,所以为了使它工作,我反转了命令。

问题:执行顺序是什么?难道我做错了什么?

A_D*_*teo 8

官方目标文件规定,只有一个入口预见:

changeLogFile
指定用于 Liquibase 的更改日志文件。

  • 类型:java.lang.String
  • 要求:否
  • 表达${liquibase.changeLogFile}

您可以添加更多条目,但它们将被忽略并且 maven 不会抱怨:它不验证插件配置的内容,它不能,因为那部分取决于插件并且 maven 不预先知道。也就是说,是通用的。

为了确保确定性顺序并changeLogFile执行两个,您应该指定几个插件executions如下:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.4.2</version>
    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.5</version>
        </dependency>
    </dependencies>
    <configuration>
        <changeLogFile>${basedir}/src/main/resources/schema.sql</changeLogFile>
        <changeLogFile>${basedir}/src/main/resources/data.sql</changeLogFile>
        <driver>org.postgresql.Driver</driver>
        <url>jdbc:postgresql://${db.url}</url>
        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
    </configuration>
    <executions>
        <execution>
            <id>update-schema</id>
            <phase>process-resources</phase>
            <goals>
                <goal>update</goal>
            </goals>
            <configuration>
                <changeLogFile>${basedir}/src/main/resources/schema.sql</changeLogFile>
            </configuration>
        </execution>
        <execution>
            <id>update-data</id>
            <phase>process-resources</phase>
            <goals>
                <goal>update</goal>
            </goals>
            <configuration>
                <changeLogFile>${basedir}/src/main/resources/data.sql</changeLogFile>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

注意:我们为该executions部分之外的所有执行指定一个通用配置,然后每个execution我们只定义附加配置,即每次不同的文件。

确定性顺序由 Maven 保证:对于同一个插件,对于同一个阶段,将遵守 POM 中的声明顺序。

但是,作为process-resources阶段的一部分,此执行现在将成为您构建的一部分,这可能不是您想要的。因此,在这种情况下,最好将其移动到配置文件如下:

<profiles>
    <profile>
        <id>liquibase-executions</id>
        <build>
            <defaultGoal>process-resources</defaultGoal>
            <plugins>
                <!-- MOVE HERE liquibase plugin configuration and executions -->
            </plugins>
        </build>
    </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

然后执行以下操作(也根据您的评论):

mvn -Pliquibase-executions -Ddb.url=IP:PORT/DB -Dliquibase.username=USERNAME
Run Code Online (Sandbox Code Playgroud)