How to run flyway:clean before migrations in a SpringBoot app?

20.8k views Asked by At

I am using Springboot and Flyway. The migrations work just fine but I wanted to be able perform a clean flyway command when the application context gets loaded with test profile.

Is it possible to configure SpringBoot to do clean and then migrate if active profile is test?

4

There are 4 answers

1
dunni On BEST ANSWER

You can overwrite the Flyway autoconfiguration like this:

@Bean
@Profile("test")
public Flyway flyway(DataSource theDataSource) {
    Flyway flyway = new Flyway();
    flyway.setDataSource(theDataSource);
    flyway.setLocations("classpath:db/migration");
    flyway.clean();
    flyway.migrate();

    return flyway;
}

In Spring Boot 1.3 (current version is 1.3.0.M1, GA release is planned for September), you can use a FlywayMigrationStrategy bean to define the actions you want to run:

@Bean
@Profile("test")
public FlywayMigrationStrategy cleanMigrateStrategy() {
    FlywayMigrationStrategy strategy = new FlywayMigrationStrategy() {
        @Override
        public void migrate(Flyway flyway) {
            flyway.clean();
            flyway.migrate();
        }
    };

    return strategy;
}
0
stelios.anastasakis On

in more recent versions of spring boot (eg 2.0.2) you can use the property spring.flyway.clean-on-validation-error if you want to use clean because of a change in the sql files

0
t0r0X On

Same answer as @dunni (Thanks, by the way!), but updated to modern Java 8+

@Profile("test")
@Bean
public FlywayMigrationStrategy flywayCleanMigrationStrategy() {
  return flyway -> {
    flyway.clean();
    flyway.migrate();
  };
}
0
spyro On

... and here's the Kotlin version, if needed :)

@Profile("test")
@Configuration
class FlywayMigrationConfig {
    @Bean
    fun flywayCleanMigrationStrategy() = FlywayMigrationStrategy {
        it.clean()
        it.migrate()
    }
}