Supabase の本番プロジェクトに安全にマイグレーションする CI/CD 設計
最近 Supabase を頻繁に使っています。Supabase はデータベース、認証、ストレージ、function...etc と、プロダクトを作る上で必要なものは大体揃っています。
Firebase に近い BaaS ですが、大きく違うところは PostgreSQL を採用しているところです。
Supabase をプロダクトに採用している場合、ローカルの更新差分を本番プロジェクトへ反映したいケースが出てくると思います。その際に、CI /CD でのデプロイフローを組むと運用時に便利です。今回は、GitHub Actions を使って本番環境への CI/CD 設計についてのまとめです。
Supabase CLI について
まず、Github Actions でマイグレーション管理する際に知っておきたいのが Supabase CLI です。Supabase CLI はローカルでの開発、Supabase へのデプロイ、CI/CD ワークフローへの設定ができます。
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 環境 (Docker) で確認して、実際に GitHub Actions でデプロイして反映する流れになると思います。
ただ、実際にマージしたときに、意図しない挙動になる可能性もあるかもしれません。
実際にエラーなく反映できるかは、Supabase に dry-run コマンドがあるので、本番プロジェクトへのリリースまでに、安全にマイグレーションできるか確認する CI/CD の設計をしてみましょう。
マイグレーションファイルのチェックと dry-run
実際に本番プロジェクトへ反映する前に、dry-run を実行して問題ないかを確認することができます。下記も実際に自分が使っている CI/CD の設計です。ワークフローの下記になります。
- supbase db lint、test db でマイグレーションファイルの構文に誤りがないか、正しいかをチェックできます
- supabase db push --dry-run で差分更新に問題ないか確認
name: API DB check
on:
pull_request:
branches:
- 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
上記設計によって、main ブランチに PR を作成すると、本番プロジェクトに dry-run を実行できます。
上記2つの CI/CD の設計によって、 Supbase プロジェクトの本番反映を安全に行えます。
著者

hiro08gh (Hiroki Ueda)
フリーランスのエンジニア。プロダクト開発と犬が好き。Jamstack アーキテクチャーやサーバレス技術に興味があります。
SaaS 開発の経験が長く得意領域としています。業務において、ただ機能をリリースするだけではなく、「ユーザーが最大限使いやすいように考えること」、「長年使えるソフトウェアにすること」を大事にしています。
お仕事のお問い合わせは X (Twitter) の DM までお願いします。