概要
この記事では、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 などを使えばもっと楽になりそう