# Dependabot PR CI修正コマンド DependabotのプルリクエストでCIエラーが発生しているものを自動的に修正します。 ## 使用方法 ```bash /dp-ci-fix ``` ## 処理手順 1. Dependabotが作成したPR一覧を取得 2. CIが失敗しているPRを特定 3. 各失敗PRに対してClaudeが修正を実行 4. 修正結果をレポート ## 実装 ### ステップ1: Dependabot PRとCIステータスの取得 ```bash # GitHub CLIの確認 if ! command -v gh &> /dev/null; then echo "❌ Error: GitHub CLI (gh) がインストールされていません" echo "インストール方法: https://cli.github.com/" exit 1 fi echo "🤖 Dependabot PRのCIエラーを確認中..." echo "========================================" # Dependabotが作成したPRを取得 DEPENDABOT_PRS=$(gh pr list --state open --author "app/dependabot" --json number,title,headRefName,statusCheckRollup) if [ "$DEPENDABOT_PRS" = "[]" ]; then echo "✨ Dependabotのオープン中のPRはありません" exit 0 fi # CIが失敗しているPRをフィルタリング FAILED_PRS=$(echo "$DEPENDABOT_PRS" | jq -r '.[] | select(.statusCheckRollup != null) | select(.statusCheckRollup | map(select(.conclusion == "FAILURE")) | length > 0) | @json') if [ -z "$FAILED_PRS" ]; then echo "✅ CIエラーのあるDependabot PRはありません" exit 0 fi FAILED_COUNT=$(echo "$FAILED_PRS" | wc -l | tr -d ' ') echo "❌ CIエラーが見つかりました: ${FAILED_COUNT}件のPR" echo "" ``` ### ステップ2: 各失敗PRの修正 ```bash # 元のブランチを保存 ORIGINAL_BRANCH=$(git branch --show-current) echo "💾 元のブランチ: $ORIGINAL_BRANCH" echo "" # 修正結果を記録 SUCCESS_PRS=() FAILED_FIX_PRS=() # 各PRを処理 echo "$FAILED_PRS" | while IFS= read -r pr_json; do PR_NUMBER=$(echo "$pr_json" | jq -r '.number') PR_TITLE=$(echo "$pr_json" | jq -r '.title') PR_BRANCH=$(echo "$pr_json" | jq -r '.headRefName') echo "🔧 PR #${PR_NUMBER} を修正中: ${PR_TITLE}" echo " ブランチ: ${PR_BRANCH}" # ブランチをチェックアウト if ! git fetch origin "$PR_BRANCH" 2>/dev/null; then echo " ❌ ブランチの取得に失敗" FAILED_FIX_PRS+=("#${PR_NUMBER}") continue fi if ! git checkout "$PR_BRANCH" 2>/dev/null; then echo " ❌ チェックアウトに失敗" FAILED_FIX_PRS+=("#${PR_NUMBER}") continue fi # 依存関係の再インストール(Claudeがリポジトリを確認して適切なコマンドを実行) echo " 📦 依存関係を再インストール中..." echo " ℹ️ Claudeがリポジトリの構成を確認して適切なインストールコマンドを実行します" # CI失敗の種類を確認 FAILED_CHECKS=$(gh pr checks "$PR_NUMBER" 2>/dev/null | grep -E "(fail|error|✗)" || echo "") echo " 失敗したチェック:" echo "$FAILED_CHECKS" | while IFS= read -r check; do echo " - $check" done # Claudeに修正を依頼 echo " 🤖 Claudeに修正を依頼します" echo "" echo " 失敗したチェック内容に基づいて、以下の修正を行ってください:" echo "$FAILED_CHECKS" echo "" echo " ⚠️ 重要な制約:" echo " - lintエラー: できる限りignoreコメントを使わず実際のコードを修正すること" echo " - リポジトリの構成を確認して適切な修正方法を選択すること" echo "" # メジャーバージョンアップの確認 PR_DIFF=$(gh pr diff "$PR_NUMBER" 2>/dev/null || echo "") if echo "$PR_DIFF" | grep -qE '^\-.*"[^"]+": *"[0-9]+\.[0-9]+'; then OLD_VER=$(echo "$PR_DIFF" | grep -E '^\-.*"[^"]+": *"[0-9]+\.[0-9]+' | head -1 | sed -E 's/.*"([0-9]+)\..*/\1/') NEW_VER=$(echo "$PR_DIFF" | grep -E '^\+.*"[^"]+": *"[0-9]+\.[0-9]+' | head -1 | sed -E 's/.*"([0-9]+)\..*/\1/') PACKAGE=$(echo "$PR_DIFF" | grep -E '^\+.*"[^"]+": *"[0-9]+\.[0-9]+' | head -1 | sed -E 's/.*"([^"]+)".*/\1/') if [ "$OLD_VER" != "$NEW_VER" ] && [ -n "$PACKAGE" ]; then echo " ⚠️ メジャーバージョンアップ: $PACKAGE ($OLD_VER.x → $NEW_VER.x)" echo " 🔍 マイグレーションガイドを確認中..." /gemini-search "$PACKAGE version $NEW_VER migration guide" 2>/dev/null | head -10 || true echo "" fi fi # 変更があればコミット if [ -n "$(git status --porcelain)" ]; then echo " 💾 変更をコミット中..." git add . git commit -m "fix: CI errors for dependabot PR 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude " # プッシュ echo " 📤 リモートにプッシュ中..." if git push origin "$PR_BRANCH"; then echo " ✅ プッシュ完了" # CI結果を待機して確認 echo " ⏳ CI実行を待機中(最大5分)..." sleep 30 # 初回実行開始を待つ TIMEOUT=270 # 残り4分30秒 INTERVAL=30 CI_PASSED=false while [ $TIMEOUT -gt 0 ]; do CI_STATUS=$(gh pr checks "$PR_NUMBER" --json state,conclusion 2>/dev/null || echo "") # すべてのチェックが完了しているか確認 if echo "$CI_STATUS" | jq -e 'all(.state == "COMPLETED")' >/dev/null 2>&1; then # すべて成功しているか確認 if echo "$CI_STATUS" | jq -e 'all(.conclusion == "SUCCESS")' >/dev/null 2>&1; then echo " ✅ CI成功" CI_PASSED=true SUCCESS_PRS+=("#${PR_NUMBER}: ${PR_TITLE} ✓") break else echo " ❌ CI失敗" FAILED_FIX_PRS+=("#${PR_NUMBER}: ${PR_TITLE} (CI失敗)") break fi fi sleep $INTERVAL TIMEOUT=$((TIMEOUT - INTERVAL)) done if [ "$CI_PASSED" = false ] && [ $TIMEOUT -le 0 ]; then echo " ⏱️ CI確認タイムアウト" FAILED_FIX_PRS+=("#${PR_NUMBER}: ${PR_TITLE} (CI確認中)") fi else echo " ❌ プッシュに失敗" FAILED_FIX_PRS+=("#${PR_NUMBER}: ${PR_TITLE}") fi else echo " ℹ️ 自動修正可能な変更なし" FAILED_FIX_PRS+=("#${PR_NUMBER}: ${PR_TITLE} (要手動修正)") fi echo "" done # 元のブランチに戻る echo "🔙 元のブランチに戻ります: $ORIGINAL_BRANCH" git checkout "$ORIGINAL_BRANCH" ``` ### ステップ4: 結果レポート ```bash echo "" echo "📊 修正結果レポート" echo "========================================" if [ ${#SUCCESS_PRS[@]} -gt 0 ]; then echo "" echo "✅ 修正成功 (${#SUCCESS_PRS[@]}件):" for pr in "${SUCCESS_PRS[@]}"; do echo " - $pr" done fi if [ ${#FAILED_FIX_PRS[@]} -gt 0 ]; then echo "" echo "❌ 修正失敗または手動対応が必要 (${#FAILED_FIX_PRS[@]}件):" for pr in "${FAILED_FIX_PRS[@]}"; do echo " - $pr" done fi echo "" echo "🔄 次のステップ:" echo "1. 数分待ってCIが再実行されるのを確認" echo "2. 手動対応が必要なPRは個別に確認" echo "3. /pr-list でPRの状態を確認" echo "" echo "✅ Dependabot PR CI修正処理が完了しました" ``` ## 注意事項 - GitHub CLIが必要です - Claudeがリポジトリを確認して修正方法を判断します - すべてのエラーが自動修正できるわけではありません - 複雑なエラーは手動での修正が必要です - 修正後、CIの再実行には数分かかる場合があります