Example GitHub Action for State-based pipelines

ENTERPRISE

Deploy

The following example deploys the schema model to a target database whose connection information is stored as a secret.

This example shows how to automate "prepare" and "deploy" in one leap. In practice, most teams split these into separate steps so the generated script can be reviewed and approved before it’s applied to production.

Automating state-based deployments is available in Flyway Enterprise and a personal access token and email address need to be provided. These should also be provided as secrets.

name: Redgate Flyway

on:
  push:
    branches:
      - main

jobs:
  deploy:
    name: Redgate Flyway Deploy
    runs-on: ubuntu-latest
    env:
      FLYWAY_EMAIL: ${{ secrets.FLYWAY_EMAIL }}
      FLYWAY_TOKEN: ${{ secrets.FLYWAY_TOKEN }}
    steps:
      - name: Setup Flyway
        uses: red-gate/setup-flyway@v1
    
      - name: Redgate Flyway Deploy
        run: |
          flyway prepare deploy \
            -prepare.source=schemaModel \
            -prepare.target=production \
            -environment=production
            -environments.production.url="${{ secrets.FLYWAY_URL }}" \
            -environments.production.user="${{ secrets.FLYWAY_USER }}" \
            -environments.production.password="${{ secrets.FLYWAY_PASSWORD }}"

Deploy (with manual review)

The following example deploys the schema model to a target database whose connection information is stored as a secret.

A GitHub Environment named "Production" is used to control the deployment and stop the workflow until the deployment is approved. For details on how to configure an Environment to require a review before deployment see the GitHub documentation. Please note this feature is not available for private repositories on the GitHub free plan.

Automating state-based deployments is available in Flyway Enterprise and a personal access token and email address need to be provided. These should also be provided as secrets.

name: Redgate Flyway
 
on:
  push:
    branches:
      - main
 
jobs:
  prepare:
    name: Redgate Flyway Prepare
    runs-on: ubuntu-latest
    env:
      FLYWAY_EMAIL: ${{ secrets.FLYWAY_EMAIL }}
      FLYWAY_TOKEN: ${{ secrets.FLYWAY_TOKEN }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup Flyway
        uses: red-gate/setup-flyway@v1
    
      - name: Redgate Flyway Prepare
        run: |
          flyway prepare \
            -prepare.source=schemaModel \
            -prepare.target=production \
            -environments.production.url="${{ secrets.FLYWAY_URL }}" \
            -environments.production.user="${{ secrets.FLYWAY_USER }}" \
            -environments.production.password="${{ secrets.FLYWAY_PASSWORD }}"

      - name: Upload Deployment Script
        uses: actions/upload-artifact@v4
        with:
          name: database-deployment-script
          path: deployments/D__deployment.sql

  deploy:
    name: Redgate Flyway Deploy
    runs-on: ubuntu-latest
    needs: prepare
    environment:
      name: Production
    env:
      FLYWAY_EMAIL: ${{ secrets.FLYWAY_EMAIL }}
      FLYWAY_TOKEN: ${{ secrets.FLYWAY_TOKEN }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup Flyway
        uses: red-gate/setup-flyway@v1

      - name: Download Deployment Script
        uses: actions/download-artifact@v4
        with:
          name: database-deployment-script
          path: deployments
      - name: Redgate Flyway Deploy
        run: |
          flyway deploy \
            -environment=production \
            -environments.production.url="${{ secrets.FLYWAY_URL }}" \
            -environments.production.user="${{ secrets.FLYWAY_USER }}" \
            -environments.production.password="${{ secrets.FLYWAY_PASSWORD }}"

Additional examples


See additional examples using Windows and Linux agents for our sample Flyway Autopilot project on GitHub.


Didn't find what you were looking for?