MigrateOnlyRunner.java

package io.slayyyyer.orders.config;

import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.output.MigrateResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

/**
 * Runs Flyway and exits, with no web server. This is what the Cloud Run migration job
 * invokes (%s), so the schema change is a separate, observable step from the rollout.
 */
@Component
@ConditionalOnProperty(name = "app.migrate-only", havingValue = "true")
public class MigrateOnlyRunner implements ApplicationRunner {

    private static final Logger log = LoggerFactory.getLogger(MigrateOnlyRunner.class);

    private final Flyway flyway;
    private final ApplicationContext context;

    public MigrateOnlyRunner(Flyway flyway, ApplicationContext context) {
        this.flyway = flyway;
        this.context = context;
    }

    @Override
    public void run(ApplicationArguments args) {
        MigrateResult result = flyway.migrate();
        log.info(
                "migrate-only: applied {} migration(s), schema now at version {}",
                result.migrationsExecuted,
                result.targetSchemaVersion);

        int exitCode = SpringApplication.exit(context, () -> 0);
        System.exit(exitCode);
    }
}