如何两次运行liquibase“dropAll”的gradle任务?

时间:2014-03-06 20:54:22

标签: gradle liquibase

我们正在使用liquibase,gradle和com.augusttechgroup:gradle-liquibase-plugin。我们目前正面临着这个错误 https://liquibase.jira.com/browse/CORE-1803 这会杀死我们的连续集成服务器。在解决此问题之前,我们希望使用一种解决方法,以便我们可以在gradle中运行“dropAll”任务两次。

gradle dropAll dropAll

不起作用

gradle dropAll && gradle dropAll

是没有选择的,因为我们的连续集成服务器无法管理它。

有没有办法让任务运行两次,或者我是否必须使用gradle插件并编写我自己的dropAll任务,例如@judoole在此提出Liquibase 3.0.1 Gradle integration

3 个答案:

答案 0 :(得分:2)

我发现最简单的解决方案就是声明两个数据库。

liquibase {
    activities {
        main {
            url 'jdbc:postgresql://localhost:5432/db'
            username 'user'
            password 'passwd'
            ...
        }
        secondRun {
            url 'jdbc:postgresql://localhost:5432/db'
            username 'user'
            password 'passwd'
            ...        
        }
    }
    runList = 'main'
}

dropAll.doFirst { liquibase.runList = 'main,secondRun' }
dropAll.doLast { liquibase.runList = 'main' }

默认情况下,'runList'仅包含主db。但是对于dropAll他将两个数据库都设置为活动状态,这样dropAll就可以在两个数据库上运行......实际上是相同的。

答案 1 :(得分:1)

我会考虑使用JavaExec,就像链接的StackOverflow问题一样,特别是如果你只使用xml而不是Groovy来编写你的更改日志。 liquibase-gradle-plugin的美妙之处就在于你描述的这些奇怪的案例。来自Github回购:

  

假设对于每个部署,您需要更新数据   为您的应用程序的数据库建模,并且还需要运行一些   用于安全性的单独数据库中的SQL语句。

现在我没有使用过该插件,因为我不需要这些功能。但是我确实遇到了liquibase中的错误并且需要使用特定版本,即3.0.4,因为generateChangelog自3.0.5以来有一个奇怪的错误。使用JavaExec版本,我能够找到适合我需要的版本。

现在,liquibase-gradle-plugin不需要是您唯一的选择武器。 Gradle有足够的空间来编写自己的小任务。那些做一些sql的人。也许沿着这些方向尝试一下,看看是否有效:

configurations {    
    driver
}

dependencies {
    driver '<your-sql-driver>'
}

//"Bug" in Gradle. Groovy classes are loaded first. They need to know about sql driver
//Or I think it's still so
URLClassLoader loader = GroovyObject.class.classLoader
configurations.driver.each { File file ->
    loader.addURL(file.toURL())
}

task deleteFromTables(description: 'Deletes everything.') <<{
    def props = [user: "<username>", password: "<password>", allowMultiQueries: 'true'] as Properties
    def sql = Sql.newInstance("<url>", props, "<driver-classname>)

    try {
        //Here you can do your magic. Delete something, or simple drop the database.
        //After dropping it, you'd probably want another task for creating 
        //it back up again
        sql.execute("DELETE ...")
    } finally {
        sql.close()
    }
}

答案 2 :(得分:0)

Gradle确保每个Gradle调用最多执行一次每个任务。如果您需要做两次工作,则需要声明两个任务。有可能插件为您提供了一个合适的任务类型来声明第二个dropAll任务。