0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Firebase Data Connect でスキーマの変更を検知してGitHub にコメントをするCI

Posted at

概要

この記事では、GitHub Actions を使って DataConnect のスキーマ変更を検知し、Pull Request に自動でコメントするワークフロー

モチベーション

DataConnect のスキーマはコード外で管理されるため、Pull Request の差分では見えづらく、実際にどんなスキーマの変更があるかわかりにくいため

実装例

name: DataConnect Schema Validation

on:
  pull_request:
    paths:
      - "dataconnect/**"
      - ".github/workflows/dataconnect-schema-check.yml"
  workflow_dispatch:

jobs:
  schema-validation:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Setup Node
        uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
        with:
          node-version: 20

      - name: Install Firebase CLI
        run: npm install -g firebase-tools

      - name: Create SA Key File
        run: echo "${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}" | base64 -d > ${{ github.workspace }}/gcloud-service-key.json

      - name: Check Schema Changes
        id: check_diff
        run: |
          export GOOGLE_APPLICATION_CREDENTIALS="${{ github.workspace }}/gcloud-service-key.json"
          diff_output=$(firebase dataconnect:sql:diff --project ${{ secrets.GCP_PROJECT_ID_DEV }})
          echo "diff_output<<EOF" >> $GITHUB_OUTPUT
          echo "$diff_output" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

          # スキーマ変更の有無をSQLコマンドの存在で判断
          if echo "$diff_output" | grep -q "CREATE\|ALTER\|DROP"; then
            echo "has_changes=true" >> $GITHUB_OUTPUT
          else
            echo "has_changes=false" >> $GITHUB_OUTPUT
          fi

      - name: Comment on PR if Changes Found
        if: github.event_name == 'pull_request'
        run: |
          # 既存のコメントをチェック
          EXISTING_COMMENTS=$(curl -s \
            -H "Accept: application/vnd.github+json" \
            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments")

          # 「DataConnect Schema Changes」を含むコメントを検索
          COMMENT_ID=$(echo "$EXISTING_COMMENTS" | jq -r '.[] | select(.body | contains("DataConnect Schema Changes")) | .id')

          # コメント内容を設定
          if [[ "${{ steps.check_diff.outputs.has_changes }}" == "false" ]]; then
            PR_COMMENT="## DataConnect Schema Changes: ${{ secrets.GCP_PROJECT_ID_DEV }}

            \`\`\`bash
            ✅ スキーマ変更はありません
            \`\`\`"
          else
            PR_COMMENT="## DataConnect Schema Changes: ${{ secrets.GCP_PROJECT_ID_DEV }}
            <details>
            <summary>クリックして詳細を確認</summary>

            ### 検出されたスキーマ変更
            以下のSQLコマンドが適用される予定です。

            \`\`\`sql
            ${{ steps.check_diff.outputs.diff_output }}
            \`\`\`
            </details>"
          fi

          if [ -n "$COMMENT_ID" ]; then
            # 既存のコメントを更新
            echo "既存のコメントを更新します (ID: $COMMENT_ID)"
            curl \
              -X PATCH \
              -H "Accept: application/vnd.github+json" \
              -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
              "https://api.github.com/repos/${{ github.repository }}/issues/comments/$COMMENT_ID" \
              -d "{\"body\":$(echo "$PR_COMMENT" | jq -R -s .)}"
          else
            # 新しいコメントを作成
            echo "新しいコメントを作成します"
            curl \
              -X POST \
              -H "Accept: application/vnd.github+json" \
              -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
              "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" \
              -d "{\"body\":$(echo "$PR_COMMENT" | jq -R -s .)}"
          fi

curl + jq を使って既存コメントの存在確認と更新をしていましたが、これは正直パワープレイです。
peter-evans/create-or-update-comment などを使えばもっと楽になりそう

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?