Supabase の本番プロジェクトに安全にマイグレーションする CI/CD 設計

2025/11/02

最近 Supabase を頻繁に使っています。Supabase は PostgreSQL 版の Firebase の認識で、DB、認証、ストレージ、function...etc と、プロダクトを作る上で必要なものは大体揃っています。

Firebase と大きく違うところは PostgreSQL を採用しているところです。

Supabase をプロダクトに採用している場合、CI /CD でのテーブル設計の継続的なデリバリーが必要になると思います。今回は、ほとんどのチーム採用されているであろう、 GitHub Actions を使って本番環境への CI/CD 設計についてのまとめです。

Supabase CLI について

まず、Github Actions でマイグレーション管理する際に知っておきたいのが Supabase CLI です。Supabase CLI はローカルでの開発、Supabase へのデプロイ、CI/CD ワークフローへの設定ができます。

Supabase CLI のドキュメント

Supabase の本番環境へデプロイする GitHub Actions の設計

下記は私が実際に使っている Supabase の本番環境へのデプロイ設計です。Supabase CLI のコマンドを利用しています。下記はワークフローの流れです。

  • supabase/migrations に変更差分がある場合に実行
  • supabase link で Supbase プロジェクトとリンク
  • supabase migration list でプロジェクトへのマイグレーション差分が正しいか確認
  • supabase db push で実際にプロジェクトへマイグレーション
name: API production migration 

on:
  push:
    branches:
      - main 
    paths:
      - supabase/migrations/**
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      SUPABASE_PROJECT_ID: ${{ secrets.SUPABASE_PRODUCTION_PROJECT_ID }}
      SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Setup Supabase CLI
        uses: supabase/setup-cli@v1
        with:
          version: latest

      - run: supabase link --project-ref $SUPABASE_PROJECT_ID
      - run: supabase migration list
      - run: supabase db push 

ざっくりですが、これで本番へマイグレーションして、テーブル差分などをデプロイすることができます。実際の開発だと、ローカルの Supabase 環境で確認して、実際に CI/CD でデプロイする流れになると思います。

ただ、実際にマージしたときに、意図しない挙動になる可能性があります。

実際にエラーなく反映できるかは、Supabase に dry-run コマンドがあるので、本番リリースまでに安全にマイグレーションできるか確認する CI/CD の設計をしてみましょう。

開発ブランチでマイグレーションファイルのチェックと dry-run

下記も実際に自分が使っている CI/CD の設計です。ワークフローの下記になります。

  • supbase db lint、test db でマイグレーションファイルの構文に誤りがないか、正しいかをチェックできます
  • supabase db push --dry-run で差分更新に問題ないか確認
name: API DB check 

on:
  pull_request:
    branches: 
      - develop
      - main
    paths:
      - supabase/migrations/**
  workflow_dispatch:

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - uses: supabase/setup-cli@v1
        with:
          version: latest

      - run: supabase db start
      - run: supabase db lint
      - run: supabase test db

  dryrun:
    runs-on: ubuntu-latest

    env:
      SUPABASE_PROJECT_ID: ${{github.ref_name == 'main' && secrets.SUPABASE_PRODUCTION_PROJECT_ID || secrets.SUPABASE_STAGING_PROJECT_ID }}
      SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}

    steps:
      - uses: actions/checkout@v4
      - uses: supabase/setup-cli@v1
        with:
          version: latest

      - run: supabase link --project-ref $SUPABASE_PROJECT_ID
      - run: supabase migration list
      - run: supabase db push --dry-run

上記設計によって、develop ブランチ PR を作成すると、ステージング用の Supabase 環境に dry-run を実行できます。また、 develop から main に向けて PR を作成すると、本番環境向けて dry-run を実行します。

上記2つの CI/CD の設計によって、 Supbase プロジェクトの本番反映を安全に行えると思います。

著者

hiro08gh

hiro08gh (Hiroki Ueda)

フリーランスのフルサイクル / プロダクトエンジニア。プロダクト開発と犬が好き。Jamstack アーキテクチャーやサーバレス技術に興味があります。

Work Experience : MagicAl Pass、MONO Investment、microCMS、Commune...etc

SaaS 開発の経験が長く得意領域としています。業務において、ただ機能をリリースするだけではなく、「ユーザーが最大限使いやすいように考えること」、「長年使えるソフトウェアにすること」を大事にしています。

お仕事のお問い合わせは X (Twitter) の DM までお願いします。