Course contentsShow
← Docker, Kubernetes & CI/CD
Lesson 650 of 8029. CI/CD Pipeline EngineeringFree lesson

Automating Database Migrations within CI/CD Workflows

Safely execute schema changes and data migrations during deployment stages using version-controlled scripts integrated into the pipeline orchestration.

In this lesson, you will learn how to safely synchronize database schema updates with your application code deployments by integrating versioned migration scripts directly into your CI/CD pipeline.

Decoupling Schema Changes from Application Logic

When deploying applications to Kubernetes, your database schema must evolve alongside your code. However, simply running an ALTER TABLE command during an application rollout is risky. If the migration fails, your deployment might hang or leave the database in an inconsistent state. To solve this, we use Migration Tools (like Flyway, Liquibase, or Go-migrate) that treat database schema changes as version-controlled code.

The "Migration Job" Pattern

Instead of manual execution, we treat the migration as an idempotent, ephemeral task that runs before the application update. In Kubernetes, the standard practice is to trigger a Job object within your pipeline orchestration.

This job is configured with the same environment variables as your main application, ensuring it connects to the correct database instance. By running this as a pre-deploy step, you ensure the schema is ready before the new container pods (which expect the updated schema) start serving traffic.

# Example: Kubernetes Job for a migration
apiVersion: batch/v1
kind: Job
metadata:
  name: db-migration-v1-2
spec:
  template:
    spec:
      containers:
      - name: migration-tool
        image: my-registry/migration-tool:latest
        command: ["migrate", "-path", "/migrations", "up"]
        envFrom:
          - secretRef:
              name: db-credentials
      restartPolicy: OnFailure

Ensuring Safe Execution

To achieve safe automation, follow these core principles:

  1. Idempotency: Every migration script must be runnable multiple times without errors, typically managed by a version table (schema_version) in the database that tracks which scripts have already been applied.
  2. Backward Compatibility: Ensure that your schema changes (like renaming a column) are deployed in a way that doesn't break the existing version of the application.
  3. Execution Order: Integrate the migration job into your CI/CD pipeline orchestration (e.g., in your GitLab CI or GitHub Actions workflow) as a "gate." The deployment of the application code should only proceed if the migration job completes successfully.

Key Takeaway: Automating database migrations requires treating schema files as immutable versioned code and gating your application deployment on the successful execution of an idempotent pre-deployment job.