liquibase maven插件多个changeLogFile

时间:2016-03-18 11:28:38

标签: maven jenkins maven-3 liquibase

我正在使用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执行第二次,所以为了使它工作,我颠倒了这些逗号。

问题:执行的顺序是什么?我做错了吗?

1 个答案:

答案 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