我们正在使用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?
答案 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
任务。