我正在使用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>
我需要在schema.sql
之前运行data.sql
。当我在本地运行它时,它工作。当我通过jenkins运行时,schema changeLogFile
执行第二次,所以为了使它工作,我颠倒了这些逗号。
问题:执行的顺序是什么?我做错了吗?
答案 0 :(得分:4)
official goal documentation指定只预见一个条目:
<强> 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>
注意:我们为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>
然后执行以下内容(根据您的评论):
mvn -Pliquibase-executions -Ddb.url=IP:PORT/DB -Dliquibase.username=USERNAME