Supabase の本番プロジェクトに安全にマイグレーションする CI/CD 設計
最近 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 の本番環境へデプロイする 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 (Hiroki Ueda)
フリーランスのフルサイクル / プロダクトエンジニア。プロダクト開発と犬が好き。Jamstack アーキテクチャーやサーバレス技術に興味があります。
Work Experience : MagicAl Pass、MONO Investment、microCMS、Commune...etc
SaaS 開発の経験が長く得意領域としています。業務において、ただ機能をリリースするだけではなく、「ユーザーが最大限使いやすいように考えること」、「長年使えるソフトウェアにすること」を大事にしています。
お仕事のお問い合わせは X (Twitter) の DM までお願いします。