PlanetScale というサーバーレス DB サービスがあり、PlanetScale では Branching という git の branch のようなシステムが搭載されています。
めちゃくちゃ簡単に言えば、データベーススキーマに対しての Git の branch システムであり、本番のデータベースから分岐を作成して、新しいスキーマを試せるようなシステムです。 各ブランチから本番のブランチには GitHub の Pull Request のように、 Deploy Request というのを作成し、マージすることで zero-downtime で変更を適用させることが出来ます。
そこでありがち(?)なのが、本番のブランチへ Deploy Request をマージするのを忘れてしまったまま新しいスキーマを使うコードを GitHub の PR でマージしてしまい、障害を起こすというパターンです。 なので、そこの安全性を高めるべく、 Deploy Request をマージした後にのみ GitHub Actions の Check をパスさせる Actions を作ろう!というのが今回の記事。
PlanetScale ではありがたいことに、 CLI が提供されており、 GitHub Actions で使うための公式の Actions も提供されています。
また、ブランチ間の差分なども pscale branch diff
コマンドで取得することができるので、今回は「main ブランチと develop ブランチとで差分があれば Fail させる」という形で Actions を組み立てます。
できあがったものが次のとおりです:
name: PlanetScale Branch Check on: # 好きなタイミングで! jobs: check-planetscale-branches: name: Check PlanetScale branches for diffs runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup pscale uses: planetscale/setup-pscale-action@d9f5e4cb7212d2785f7263b59a60725bea78cd47 # v1 - name: Check for differences between main and develop branches id: diff-check env: PLANETSCALE_SERVICE_TOKEN_ID: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_ID }} PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }} PLANETSCALE_ORG_NAME: ${{ secrets.PLANETSCALE_ORG_NAME }} PLANETSCALE_DATABASE_NAME: ${{ secrets.PLANETSCALE_DATABASE_NAME }} run: | DIFF_OUTPUT=$(pscale branch diff $PLANETSCALE_DATABASE_NAME develop main --org $PLANETSCALE_ORG_NAME --format json || true) if [[ $(echo "$DIFF_OUTPUT" | jq 'length') -gt 0 ]]; then echo "$DIFF_OUTPUT" | jq '.' echo "diff_exists=true" >> $GITHUB_OUTPUT else echo "diff_exists=false" >> $GITHUB_OUTPUT fi - name: Fail CI if differences exist if: steps.diff-check.outputs.diff_exists == 'true' run: | echo "::error::PlanetScale branches 'main' and 'develop' have differences that need to be resolved." exit 1
PlanetScale の Service Token は管理画面から生成しておいてください。必要な権限は下記の通りです:
read_branch
read_database
pscale branch diff
コマンドは、差分が無ければ空配列を返すので、空配列なら差分無し、そうでなければ差分有りとして設定し、 CI を落とします。
あとはこれを適当なファイルとして保存してあげれば完成!これでもう Deploy Request をマージし忘れたままリリースすることも無いでしょう。めでたしめでたし。