diff --git a/src/FlywayMigrationPlugin.groovy b/src/FlywayMigrationPlugin.groovy index 217cbd05..7c088a34 100644 --- a/src/FlywayMigrationPlugin.groovy +++ b/src/FlywayMigrationPlugin.groovy @@ -8,6 +8,7 @@ class FlywayMigrationPlugin implements TerraformEnvironmentStagePlugin, Resettab public void apply(TerraformEnvironmentStage stage) { stage.decorate(TerraformEnvironmentStage.PLAN, flywayInfoClosure()) + stage.decorate(TerraformEnvironmentStage.APPLY, flywayMigrateClosure()) } public Closure flywayInfoClosure() { @@ -22,6 +23,18 @@ class FlywayMigrationPlugin implements TerraformEnvironmentStagePlugin, Resettab } } + public Closure flywayMigrateClosure() { + return { innerClosure -> + innerClosure() + + def environmentVariables = buildEnvironmentVariableList(env) + withEnv(environmentVariables) { + def command = new FlywayCommand('migrate') + sh command.toString() + } + } + } + public Collection buildEnvironmentVariableList(env) { def list = [] if (passwordVariable) { diff --git a/test/FlywayMigrationPluginTest.groovy b/test/FlywayMigrationPluginTest.groovy index a14f17a1..5388c156 100644 --- a/test/FlywayMigrationPluginTest.groovy +++ b/test/FlywayMigrationPluginTest.groovy @@ -39,6 +39,18 @@ class FlywayMigrationPluginTest { verify(stage).decorate(TerraformEnvironmentStage.PLAN, infoClosure) } + + @Test + void addsFlywayMigrateClosureOnApply() { + def migrateClosure = { -> } + def plugin = spy(new FlywayMigrationPlugin()) + doReturn(migrateClosure).when(plugin).flywayMigrateClosure() + def stage = mock(TerraformEnvironmentStage.class) + + plugin.apply(stage) + + verify(stage).decorate(TerraformEnvironmentStage.APPLY, migrateClosure) + } } @Nested @@ -91,6 +103,36 @@ class FlywayMigrationPluginTest { } } + @Nested + public class FlywayMigrateClosure { + @Test + void runsTheNestedClosure() { + def plugin = new FlywayMigrationPlugin() + def iWasCalled = false + def nestedClosure = { -> iWasCalled = true } + + def flywayClosure = plugin.flywayMigrateClosure() + flywayClosure.delegate = new MockWorkflowScript() + flywayClosure(nestedClosure) + + assertThat(iWasCalled, equalTo(true)) + } + + @Test + void setsTheListOfOptionalEnvironmentVariables() { + def plugin = spy(new FlywayMigrationPlugin()) + def expectedList = ['KEY=value'] + doReturn(expectedList).when(plugin).buildEnvironmentVariableList(any(List.class)) + def flywayClosure = plugin.flywayMigrateClosure() + def mockWorkflowScript = spy(new MockWorkflowScript()) + flywayClosure.delegate = mockWorkflowScript + + flywayClosure { -> } + + verify(mockWorkflowScript).withEnv(eq(expectedList), any(Closure.class)) + } + } + @Nested public class BuildEnvironmentVariableList { @Test