なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

GitHub Actions で PlanetScale の main ブランチに変更がマージされていなければチェックを落としたい

PlanetScale というサーバーレス DB サービスがあり、PlanetScale では Branching という git の branch のようなシステムが搭載されています。

planetscale.com

planetscale.com

めちゃくちゃ簡単に言えば、データベーススキーマに対しての Git の branch システムであり、本番のデータベースから分岐を作成して、新しいスキーマを試せるようなシステムです。 各ブランチから本番のブランチには GitHub の Pull Request のように、 Deploy Request というのを作成し、マージすることで zero-downtime で変更を適用させることが出来ます。

そこでありがち(?)なのが、本番のブランチへ Deploy Request をマージするのを忘れてしまったまま新しいスキーマを使うコードを GitHub の PR でマージしてしまい、障害を起こすというパターンです。 なので、そこの安全性を高めるべく、 Deploy Request をマージした後にのみ GitHub Actions の Check をパスさせる Actions を作ろう!というのが今回の記事。

PlanetScale ではありがたいことに、 CLI が提供されており、 GitHub Actions で使うための公式の Actions も提供されています。

github.com

また、ブランチ間の差分なども 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 をマージし忘れたままリリースすることも無いでしょう。めでたしめでたし。