2017-09-18 99 views
0

我有这些gradle这个任务:
- startTestDatabaseContainer:建立与数据库
启动泊坞窗容器 - removeTestDatabaseContainer:停止并删除泊坞窗容器
- flywayValidate:从org.flywaydb.flyway任务是验证我的移民文件我应该如何构建这些gradle任务依赖关系?

我希望按顺序执行这三项任务。阅读this使我这个解决方案:

flywayValidate.dependsOn startTestDatabaseContainer 
flywayValidate.finalizedBy removeTestDatabaseContainer 

该工程确定,但我不能没有startTestDatabaseContainerremoveTestDatabaseContainer也被调用运行在命令行gradle flywayValidate。我希望能够在没有这种情况下运行flywayValidate

当我无法在gradle中定义依赖关系时,我能做些什么来完成此任务?

我第一次尝试很干脆:

task validateMigration { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayValidate 
    finalizedBy removeTestDatabaseContainer 
} 

但失败,因为flywayValidate可以startTestDatabaseContainer之前运行。

编辑:我在Opal的解决方案这里设置了示范基地:github.com/stianlagstad/flyway-migration-error-causes-final-gradle-task-to-not-execute。克隆它并运行gradle validateMigration。迁移将失败,最终的gradle任务将不会运行(并且docker ps将显示容器仍在运行)。如果你修复了迁移文件,那么一切都按预期工作。我相信我误解了一些东西。任何指针都会有帮助!

回答

0
task validateMigration { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayMigrate 
    flywayMigrate.finalizedBy removeTestDatabaseContainer 
    flywayMigrate.mustRunAfter startTestDatabaseContainer 
} 

这个伎俩!谢谢orzeh for the PR on Github,谢谢Opal的帮助!

1

下面的设置应满足您的所有需求:

task startTestDatabaseContainer { 
    doLast { 
    println 'startTestDatabaseContainer' 
    } 
} 
task flywayValidate { 
    doLast { 
    println 'flywayValidate' 
    } 
} 
task removeTestDatabaseContainer { 
    doLast { 
    println 'removeTestDatabaseContainer' 
    } 
} 

task validateMigration { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayValidate 
    flywayValidate.mustRunAfter startTestDatabaseContainer 
    finalizedBy removeTestDatabaseContainer 
} 

编辑

task removeTestDatabaseContainer { 
    doLast { 
    println 'removeTestDatabaseContainer' 
    } 
} 

task startTestDatabaseContainer { 
    doLast { 
    println 'startTestDatabaseContainer' 
    } 
    finalizedBy removeTestDatabaseContainer 
} 

task flywayValidate { t-> 
    doLast { 
    println 'flywayValidate' 
    throw new TaskExecutionException(t, new RuntimeException('whatever')) 
    } 
} 

task validateMigration { 
    dependsOn startTestDatabaseContainer 
    dependsOn flywayValidate 
    flywayValidate.mustRunAfter startTestDatabaseContainer 
} 

Here的演示。

+0

谢谢!我遇到了另一个问题:当迁移失败时,removeTestDatabaseContainer任务没有运行(我通过添加一个doLast并使用println +看到docker容器仍在运行来证实这一点)。如果我在'validateMigration'任务中移除了两行'flywayValidate',那么'removeTestDatabaseContainer'已成功运行。你有什么建议吗? – L42

+0

@ L42,见编辑答案。 – Opal

+0

再次感谢您。但是,它看起来并不像调用removeTestDatabaseContainer。我将编辑我的原始问题,向您展示编辑中代码的输出结果。 – L42