【Drizzle】Cloud SQLにMigrationする【Github Actions】

こんにちは、フリーランスエンジニアの太田雅昭です。

Drizzle

DrizzleはTypeScriptのDBライブラリです。ローカルでは通常pushを使いますが、本番ではgenerateとmigrateを使用するかと思います。

Github Actions

下記、前提です。

  • DB: PostgreSQL
  • Package manager: PNPM
  • PNPM scriptにdb:migrateを追加。内容はdrizzle-kit migrate
  • drizzle-kit generateを実行済み
  • リポジトリの環境変数
    • GCP_SA_KEY: サービスアカウントのjsonの中身
    • DATABASE_URL: postgresURL(postgresql://username:password@localhost:5432/db_name)

他にも色々固有の値が入っていますが、ご容赦ください。AIで修正すれば簡単かと思います。

下記のようなyamlを使用します。

# .github/workflows/deploy-cloud-run.yml

name: Deploy to Cloud Run

# Environment variables are set for build step to pass Zod validation
on:
  push:
    branches:
      - staging
    paths:
      - 'apps/web/**'
      - 'packages/**'
      - 'Dockerfile'
      - '.github/workflows/deploy-cloud-run.yml'

env:
  PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
  SERVICE_NAME: YOUR_SERVICE_NAME
  REGION: YOUR_REGION

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    permissions:
      contents: read
      id-token: write

    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Setup pnpm
      uses: pnpm/action-setup@v4
      with:
        version: 10.11.0

    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '22'
        cache: 'pnpm'

    - name: Install dependencies
      run: pnpm install --frozen-lockfile

    - name: Authenticate to Google Cloud
      uses: google-github-actions/auth@v2
      with:
        credentials_json: ${{ secrets.GCP_SA_KEY }}

    - name: Setup Cloud SQL Proxy
      run: |
        # Cloud SQL Proxyをダウンロード
        curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.14.1/cloud-sql-proxy.linux.amd64
        chmod +x cloud-sql-proxy
        
        # TCP/IP接続でプロキシを起動(ポート5432でリッスン)
        echo "Starting Cloud SQL Proxy for $PROJECT_ID:$REGION:main-db"
        ./cloud-sql-proxy $PROJECT_ID:$REGION:main-db --port 5432 --structured-logs &
        PROXY_PID=$!
        
        # プロキシが起動するまで少し待つ
        sleep 15
        
        # プロキシが正常に起動したか確認
        echo "Checking if proxy is listening on port 5432..."
        netstat -ln | grep :5432 || echo "Port 5432 not found"
        
        # プロキシプロセスが生きているか確認
        if kill -0 $PROXY_PID 2>/dev/null; then
          echo "Cloud SQL Proxy is still running (PID: $PROXY_PID)"
        else
          echo "Cloud SQL Proxy process died"
        fi
        
        # 接続テスト
        echo "Testing connection to localhost:5432..."
        timeout 5 bash -c 'cat < /dev/null > /dev/tcp/localhost/5432' && echo "Connection successful" || echo "Connection failed"

    - name: Run database migrations
      run: |
        cd packages/lib/db
        echo "Running database migrations..."
        pnpm db:migrate
        
        # マイグレーション後にテーブル一覧を確認
        echo "Checking tables after migration..."
        psql "$DATABASE_URL" -c "\dt" || echo "Failed to list tables"
        echo "Checking database name..."
        psql "$DATABASE_URL" -c "SELECT current_database();" || echo "Failed to get database name"
      env:
        DATABASE_URL: ${{ secrets.DATABASE_URL_STAGING }}

PostgreSQLのパスワード

PostgreSQLのパスワードは、CloudSQLのWeb画面から自動生成することもできます。ですがURL Safeではないため、うまくいかなかったりします。その場合は、下記でパスワードを生成するとうまくいくかと思います。

https://mohhh-ok.github.io/url-safe-password-generator

CloudSQL Studio

CloudSQL Studioでは、パスワード認証とIAM認証が使えます。パスワード認証だと毎回入力するのが面倒なので、IAMが便利です。IAMを追加した後下記を実行すれば、テーブルが見えるようになります。

-- 将来のテーブルへの自動権限
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT ALL PRIVILEGES ON TABLES TO "xxx@yyy.com";

-- シーケンス権限(AUTO INCREMENTとか使う場合)
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "xxx@yyy.com";