App Store Review Guidelines の変更を Gemini で要約

はじめに

Apple の App Store Review Guidelines は、アプリ審査の基準を定めた重要なドキュメントです。定期的に更新されるため、変更内容を追いかけることが開発者にとって欠かせません。

以前から GitHub Actions で Guidelines の変更を監視していましたが、差分(diff)をそのまま見るだけでした。HTML の差分は読みにくく、変更の影響を把握するのに時間がかかります。

そこで、Gemini API を使って差分を日本語で要約し、PR に自動的に追加する仕組みを作りました。

課題

従来の差分確認には以下の問題がありました。

  • HTML の diff は読みにくい(タグや属性の変更が混在)
  • 変更の影響範囲が一目で分からない
  • 日本語訳が必要(公式は英語のみ)
  • 重要度の判断に時間がかかる

毎週月曜日に自動実行される監視システムはありましたが、PR を見ても「どこが変わったのか」「自分のアプリに影響があるのか」をすぐに判断できませんでした。

解決策

Gemini API(gemini-2.5-pro)で差分を日本語要約することで、変更内容を素早く把握できるようになりました。

要約には以下の情報が含まれます。

  • 変更サマリー(概要を 3-5 行で説明)
  • 詳細な変更内容(追加・削除・変更)
  • 影響評価(iOS/macOS アプリ開発者への影響)
  • 対応が必要な項目

PR を開くだけで、変更の全体像が分かります。

システム概要

全体の流れ

毎週月曜日 9:00 (JST)
    ↓
GitHub Actions (self-hosted runner)
    ↓
curl で Guidelines HTML を取得
    ↓
前回からの差分を検出
    ↓
差分あり → Gemini API で要約生成
    ↓
PR 作成(要約を本文に含める)

GitHub Actions ワークフロー

実際のワークフローファイル全体を以下に示します。

name: Monitor App Store Guidelines

on:
  schedule:
    - cron: '0 0 * * 1'  # 毎週月曜日 0:00 UTC (JST 9:00)
  workflow_dispatch:

permissions:
  contents: write
  pull-requests: write

env:
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  GIT_AUTHOR_NAME: "github-actions[bot]"
  GIT_AUTHOR_EMAIL: "41898282+github-actions[bot]@users.noreply.github.com"
  GIT_COMMITTER_NAME: "github-actions[bot]"
  GIT_COMMITTER_EMAIL: "41898282+github-actions[bot]@users.noreply.github.com"

jobs:
  check-updates:
    runs-on: self-hosted
    steps:
      - name: Checkout repository
        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955

      - name: Fetch latest guidelines
        run: |
          curl -s -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
            --retry 3 \
            --max-time 60 \
            https://developer.apple.com/app-store/review/guidelines/ \
            -o guidelines.html.new

          sed -i '' 's/\?[0-9]\{10,\}//g' guidelines.html.new 2>/dev/null || sed -i 's/\?[0-9]\{10,\}//g' guidelines.html.new

      - name: Check for differences
        id: diff
        run: |
          if [ ! -f guidelines.html ]; then
            mv guidelines.html.new guidelines.html
            exit 0
          fi

          if diff -u guidelines.html guidelines.html.new > diff.txt; then
            exit 0
          fi

          echo "has_diff=true" >> $GITHUB_OUTPUT

      - name: Prepare diff content for Gemini
        if: steps.diff.outputs.has_diff == 'true'
        id: prepare_diff
        run: |
          DIFF_CONTENT=$(cat diff.txt)
          DELIMITER="EOF_DIFF_$(date +%s)_$$"
          {
            echo "diff_content<<$DELIMITER"
            echo "$DIFF_CONTENT"
            echo "$DELIMITER"
          } >> $GITHUB_OUTPUT

      - name: Summarize changes with Gemini
        if: steps.diff.outputs.has_diff == 'true'
        id: gemini_summary
        continue-on-error: true
        uses: google-github-actions/run-gemini-cli@f7db4b6f82ad0c3725cf4c98bdd93af80e22b4dc # v0.1.14
        with:
          gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
          gemini_model: gemini-2.5-pro
          prompt: |
            あなたは Apple App Store Review Guidelines の変更を分析する専門家です。

            以下は Apple App Store Review Guidelines  HTML 差分です。
            この差分を分析し、以下の形式で日本語で要約してください。
            他のテキストは一切含めず、以下の形式のみを出力してください:

            ## 変更サマリー
            - 変更の概要を 3-5 行で説明してください

            ## 詳細な変更内容
            ### 追加された内容
            - 追加された項目

            ### 削除された内容
            - 削除された項目

            ### 変更された内容
            - 変更された項目

            ## 影響評価
            ### iOS/macOS アプリ開発者への影響
            - 具体的な影響

            ### 対応が必要な項目
            - 対応が必要な項目、なければ「なし」と記載

            差分内容:
            ```diff
            ${{ steps.prepare_diff.outputs.diff_content }}
            ```

      - name: Save summary to file
        if: steps.diff.outputs.has_diff == 'true'
        env:
          OUTCOME: ${{ steps.gemini_summary.outcome }}
        run: |
          if [ "$OUTCOME" == "success" ]; then
            SUMMARY_TEXT="${{ steps.gemini_summary.outputs.summary }}"
            if [ -n "$SUMMARY_TEXT" ]; then
              CLEANED=$(printf '%s' "$SUMMARY_TEXT" | tr -d '\000-\010\013\014\016-\037')
              printf '%s\n' "$CLEANED" > summary.md
            else
              echo "要約の生成に失敗しました(出力が空)。" > summary.md
            fi
          else
            echo "要約の生成に失敗しました。" > summary.md
          fi

      - name: Create Pull Request
        if: steps.diff.outputs.has_diff == 'true'
        run: |
          TIMESTAMP=${GITHUB_RUN_ID}
          DATE_READABLE=$(date +%Y-%m-%d)
          DATE_UTC=$(date -u +"%Y-%m-%d %H:%M:%S UTC")
          BRANCH_NAME="guidelines-update-$TIMESTAMP"

          git checkout -b "$BRANCH_NAME"

          mv guidelines.html.new guidelines.html
          git add guidelines.html
          git commit -m "Update App Store Guidelines baseline"
          git push origin "$BRANCH_NAME"

          cat > pr_body.md <<EOF
          ## App Store Review Guidelines の変更を検知しました

          $([ -f summary.md ] && [ -s summary.md ] && cat summary.md || echo "要約の生成に失敗しました。")

          ---

          ### 参照
          - [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/)
          - 検知日時: $DATE_UTC
          EOF

          gh pr create \
            --title "App Store Guidelines Update - $DATE_READABLE" \
            --body-file pr_body.md \
            --base main \
            --head "$BRANCH_NAME"

      - name: Cleanup
        if: always()
        run: rm -f *.txt *.md *.new *.normalized

このワークフローは以下のステップで動作します。

  1. リポジトリをチェックアウト - 最新のベースライン HTML を取得
  2. Guidelines を取得 - curl でダウンロードし、クエリパラメータを正規化
  3. 差分を検出 - 初回実行時はベースライン作成、2 回目以降は差分チェック
  4. 差分を準備 - Gemini に渡すための形式に整形
  5. Gemini で要約生成 - gemini-2.5-pro で日本語要約を生成
  6. 要約を保存 - ファイルに保存(失敗時はエラーメッセージ)
  7. PR を作成 - ブランチ作成、ベースライン更新、PR 作成
  8. クリーンアップ - 一時ファイルを削除

使用技術

GitHub Actions で定期実行を管理しています。毎週月曜日 0:00 UTC(JST 9:00)に自動実行されます。手動実行も可能です。

curl で Apple の公式サイトから HTML を取得します。リトライとタイムアウト設定により、ネットワークエラーに対応しています。

diff コマンド でベースラインとの差分を検出します。

比較の前に、クエリパラメータを正規化します。HTML 内の URL に含まれるキャッシュバスティング用の数値(例:style.css?1699876543210)は、取得のたびに変わります。これを削除することで、実質的なコンテンツ変更のみを検出できます。

Gemini API で差分を日本語要約します。google-github-actions/run-gemini-cli@v0.1.14 を使用し、gemini-2.5-pro モデルで要約を生成しています。

gh CLI で Pull Request を自動作成します。要約を PR の本文に含めることで、変更内容を素早く確認できます。

実際の PR の例

以下は、実際に生成された PR の例です。

App Store Guidelines PR

まとめ

Gemini API を使って App Store Review Guidelines の変更を日本語で要約することで、変更の把握が格段に楽になりました。

PR を開くだけで変更サマリー、詳細、影響評価、対応項目が一目で分かります。HTML の diff を読む必要がなくなり、重要な変更を見逃すリスクも減りました。

GitHub Actions と Gemini API の組み合わせは、定期的な情報収集の自動化に最適です。他の公式ドキュメントの監視にも応用できます。

参考リンク