GitHub Actionsを活用してSupabaseのマルチステージCI/CDを実現する
Supabaseを業務で活用する際、複数の環境(本番環境、ステージング環境などのマルチステージな環境)を適切に管理する必要が出てきます。
Supabaseは、これらの環境でのCI/CDをサポートするサンプルリポジトリを提供しています。
本記事では、リポジトリで使われているCI/CD技術について詳しく説明していきます。
GitHub ActionsでSupabase CLIを使う
SupabaseはGitHub ActionsでCLIを使うためのActionを公開しています。
supabase/setup-cli
はSupabaseのアクセストークン認証に対応しており、ActionからSupabaseにマイグレーションすることができます。
env:
SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}
SUPABASE_DB_PASSWORD: ${{ secrets.SUPABASE_DB_PASSWORD }}
SUPABASE_PROJECT_ID: ${{ secrets.SUPABASE_PROJECT_ID }}
steps:
- uses: supabase/setup-cli@v1
- run: supabase link --project-ref $SUPABASE_PROJECT_ID
- run: supabase db push
CI
Supabase CLIをGitHub Actionsで使用することができることが分かったら、テストの自動化も簡単に実行できます。
Supabase CLIには、マイグレーションファイルの静的解析およびテストを行うための機能が用意されています。これらの機能は、GitHub Actionsのワークフロー内で実行することができます。
# 静的解析
supabase db lint
# テスト
supabase test db
テストファイルの作成方法については、Supabase CLIの公式ドキュメントを参照してください。
サンプルリポジトリのci.yaml
ファイルで、Actionでの使用例を確認することができます。
CD (ステージング環境)
GitHub Actionsでステージング用の環境変数を設定することで、ステージング環境にマイグレーションすることができます。
env:
SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}
SUPABASE_DB_PASSWORD: ${{ secrets.STAGING_DB_PASSWORD }}
SUPABASE_PROJECT_ID: ${{ secrets.STAGING_PROJECT_ID }}
steps:
- uses: actions/checkout@v4
- uses: supabase/setup-cli@v1
- run: supabase link --project-ref $SUPABASE_PROJECT_ID
- run: supabase db push
サンプルリポジトリのstaging.yaml
ファイルで、Actionでの使用例を確認することができます。
CD (本番環境)
こちらもステージング環境と同じく、GitHub Actionsで本番用の環境変数を設定することで、本番環境にマイグレーションすることができます。
env:
SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}
SUPABASE_DB_PASSWORD: ${{ secrets.PRODUCTION_DB_PASSWORD }}
SUPABASE_PROJECT_ID: ${{ secrets.PRODUCTION_PROJECT_ID }}
steps:
- uses: actions/checkout@v4
- uses: supabase/setup-cli@v1
- run: supabase link --project-ref $SUPABASE_PROJECT_ID
- run: supabase db push
サンプルリポジトリのstaging.yaml
ファイルで、Actionでの使用例を確認することができます。
Edge Functionsについて
サンプルリポジトリでは使われていませんが、ActionからEdge Functionsをデプロイすることも可能です。Edge Functionsで使う環境変数も設定することができます。
# Edge Functionsのデプロイ
supabase functions deploy --project-ref *****
# Edge Functionsのデプロイ(JWT認証なし)
supabase functions deploy --project-ref ***** --no-verify-jwt
# Edge Functionsで使う環境変数の設定
supabase secrets set --env-file ./supabase/.env
env:
SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}
SUPABASE_PROJECT_ID: ${{ secrets.PRODUCTION_PROJECT_ID }}
STRIPE_SECRET_KEY: ${{ secrets.PRODUCTION_STRIPE_SECRET_KEY }}
steps:
- uses: actions/checkout@v4
- uses: supabase/setup-cli@v1
- run: supabase link --project-ref $SUPABASE_PROJECT_ID
- run: supabase functions deploy --project-ref $SUPABASE_PROJECT_ID
- run: supabase secrets set STRIPE_SECRET_KEY=$STRIPE_SECRET_KEY
デプロイにおける注意点
2023/11/2 時点では、CLIでマイグレーションできないSupabaseの設定箇所が存在します。
業務においてマニュアルで設定する必要があった部分について共有します。
- SMTPサーバー
- メールテンプレート
- Supabase Storageのバケット
Supabase Storageについてはシードからバケットを作成することができるので、そちらをおすすめします。
上記以外にもCLIから設定できない箇所がありますので、各プロジェクトで都度確認をおこなってください。
Supabaseの設定についてはManagement APIが開発中なので、将来TerraformやPulumiで管理できるようになると思います。
また、デプロイはできてもマルチステージング環境に対応できない箇所もありました。
- WebhooksのPOST先URL(マイグレーションファイルで管理されている)
WebhooksのPOST先がマルチステージングだと、上記の問題がつらいです。
Supabaseはブランチ機能も開発中なので、こちらも将来解決する問題だと思います。
Discussion