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

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

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

# 実装例

``` yaml
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](https://github.com/peter-evans/create-or-update-comment) などを使えばもっと楽になりそう