はるさめ.dev

Github Actions で Supabase の起動時間を短縮する

に公開

背景

E2E テストを Github Actions で実施していて、その際に Supabase CLI で Supabase を立ち上げています。
その際にコンテナのダウンロードや実行で時間がかかるのでこれを短縮したいです。

解決法

  1. 起動サービスを制限する。

supabase start ではすべてのサービスが起動します。ただ、アプリによっては使わないサービスもあるかと思いますので、-x オプションで不要なサービスは除外して起動します。

ただ不要なサービスを排除しても10〜20秒短縮されるぐらいです。

-x で指定できるサービス一覧については「supabase start | supabase DOCS」を参照してください。
architecture | supabase DOCS」を見ると各サービスがなんの役割をしているのかがわかるので不要なものを除外してください。

# 除外するサービスの例
> supabase start -x gotrue,storage-api,realtime,imgproxy,inbucket,postgres-meta,studio,edge-runtime,logflare,vector,supavisor
  1. Supabase の起動をバックグラウンドで行う

Supabase に限ったテクニックではなさそうですが、Supabase の起動をバックグラウンドで行い、他の処理を先に進めてしまう方法です。
コマンドの最後に & をつけるとバックグラウンドで実行され、他のステップが並行して実行されるようになります。

> supabase start & # & を最後につけるとバックグラウンドで実行される

ただ、このままだと supabase の起動が完了する前に supabase のサービスを使用するとエラーになってしまうので、以下のようなステップを追加して supabase を使う直前で起動が完了するのを待つ必要があります。

      - name: Supabase 起動待ち
        run: |
          timeout=180
          counter=0
          until curl -s http://localhost:14321/rest/v1/ >/dev/null; do
            if [ $counter -gt $timeout ]; then
              echo "タイムアウト"
              exit 1
            fi
            echo "Waiting for Supabase to be ready..."
            sleep 1
            counter=$((counter + 1))
          done
          echo "Supabase is ready!"

(ref: https://github.com/orgs/supabase/discussions/9351#discussioncomment-11471330

なので Supabase の起動をステップの最初の方で実施して、e2e テストなど実際に supabase を使用する直前で完了を待つ形にするとワークフローにもよりますが時間をかなり短縮できます。

コメント