GitHub Actionsを活用してSupabaseのマルチステージCI/CDを実現する

2023/11/02に公開

Supabaseを業務で活用する際、複数の環境(本番環境、ステージング環境などのマルチステージな環境)を適切に管理する必要が出てきます。
Supabaseは、これらの環境でのCI/CDをサポートするサンプルリポジトリを提供しています。

https://github.com/supabase/supabase-action-example

本記事では、リポジトリで使われているCI/CD技術について詳しく説明していきます。

GitHub ActionsでSupabase CLIを使う

SupabaseはGitHub ActionsでCLIを使うためのActionを公開しています。

https://github.com/supabase/setup-cli

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の公式ドキュメントを参照してください。

https://supabase.com/docs/reference/cli/supabase-test-new

サンプルリポジトリのci.yamlファイルで、Actionでの使用例を確認することができます。

https://github.com/supabase/supabase-action-example/blob/main/.github/workflows/ci.yaml

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@v3
      - uses: supabase/setup-cli@v1
      - run: supabase link --project-ref $SUPABASE_PROJECT_ID
      - run: supabase db push

サンプルリポジトリのstaging.yamlファイルで、Actionでの使用例を確認することができます。

https://github.com/supabase/supabase-action-example/blob/main/.github/workflows/staging.yaml

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@v3
      - uses: supabase/setup-cli@v1
      - run: supabase link --project-ref $SUPABASE_PROJECT_ID
      - run: supabase db push

サンプルリポジトリのstaging.yamlファイルで、Actionでの使用例を確認することができます。

https://github.com/supabase/supabase-action-example/blob/main/.github/workflows/production.yaml

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@v3
      - 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