ENECHANGE Developer Blog

ENECHANGE開発者ブログ

Claude Code GitHub Actionsによるエラー初期分析を横展開した際の工夫点

こんにちは、VPoTの岩本 (iwamot) です。

同僚の片田さんによる「Claude Code GitHub Actionsを用いてエラーの初期分析効率化を目指す」では、Sentryに通知されたエラーを生成AIで初期分析する取り組みが紹介されていました。

ENECHANGEではSmartBear Software社のBugSnagをエラー監視に使っているプロダクトも多いので、同様に初期分析の仕組みを作ってみました。

本記事では、BugSnagエラー初期分析フローの全体像と、横展開する際に工夫したポイントをご紹介します。

BugSnagエラー初期分析フローの全体像

まず、全体像からです。

  1. BugSnagがエラーを検知、GitHub Issueを自動作成(bugsnagラベル付与)
  2. Issueの作成をトリガーに、GitHub Actionsワークフローが起動
  3. GitHub ActionsワークフローがClaude Code Actionを起動
  4. Claude Code ActionがSmartBear MCPサーバー経由でエラー詳細を取得
  5. Claude Code Actionがリポジトリのソースコードを読み込み、原因箇所を調査
  6. エラー詳細とソースコードの分析結果を報告書にまとめ、元のIssueにコメント投稿

BugSnagとGitHubで完結している、すっきりしたフローになっています。

横展開する際に工夫したポイント

この仕組みを作るうえで工夫したポイントは以下のとおりです。

1. サービス間のインテグレーション活用

今回のフローではシンプルさを重視し、サービス間のインテグレーションを活用しました。具体的には「BugSnag ↔️ GitHub Issues ↔️ Slack」です。

BugSnagは多くのイシュー管理システムと統合可能で、GitHub Issuesもそのひとつです。

docs.bugsnag.com

「BugSnag ↔️ GitHub Issues」間のインテグレーションを設定すると、BugSnagのエラー検知をトリガーとして、GitHub Issueを自動作成できます。

ENECHANGEではソースコード管理にGitHubを利用しているため、この方法が最もシンプルだと判断しました。

また、GitHub Issueの作成や分析コメントの追加をSlackに通知したいニーズについては、「GitHub Issues ↔️ Slack」間のインテグレーションに任せることにしました。/github subscribe で設定する、よくあるパターンです。

2. Amazon Bedrockの採用

今回のフローでは、Claude APIではなくAmazon Bedrock経由でClaudeを使うことにしました。

ENECHANGEでは現状、ClaudeのMaxプランを個人で契約し、経費精算しています。自動化の仕組みは継続的に動くものなので、個人契約への依存は避け、組織で管理しているAWSを選択しました。

Claude Code GitHub ActionはAmazon Bedrockが利用可能なので、とくに詰まるところなく実装できました。

3. ソースコードの参照

今回のフローでは、チェックアウトしたリポジトリのコードをClaude Codeに参照させることにしました。それにより、精度の高い分析が期待できると判断してのことです。

具体的には allowed_toolsRead,Glob,Grep を指定しています。

下図は実際の分析コメントの一部です。エラーの原因を分かりやすく示してくれています。

4. プロンプトの調整

実際に動かしてみると、意図したMCPツールを使ってくれないケースがあったため、プロンプトに下記の注意事項を追加しました。

## 注意事項
- SmartBear MCPツール(`mcp__smartbear__bugsnag_*`)は直接利用可能です。Bashでの確認は不要です。

これにより、無駄にMCPツールを探すターンが抑えられました。ちょっとしたことで挙動が安定するのが、LLMの面白いところです。

まとめ

以上、Claude Code GitHub Actionsによるエラー初期分析フローと、横展開した際の工夫点をご紹介しました。

同僚の取り組みをベースに、シンプルに実装できてよかったなと思っています。まだ導入したばかりなので、運用しながら改善を続けていく予定です。

おまけ

以下、現状のワークフローを載せておきます。

name: BugSnag Alert Initial Analyze

on:
  issues:
    types: [opened]

jobs:
  analyze:
    if: contains(github.event.issue.labels.*.name, 'bugsnag')
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
      issues: write
      id-token: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
        with:
          fetch-depth: 1
          persist-credentials: false

      - name: Generate GitHub App token
        id: app-token
        uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
        with:
          app-id: ${{ secrets.CLAUDE_APP_ID }}
          private-key: ${{ secrets.CLAUDE_APP_PRIVATE_KEY }}
          permission-contents: read
          permission-issues: write

      - name: Configure AWS Credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4.3.1
        with:
          role-to-assume: ${{ secrets.CLAUDE_APP_AWS_ROLE }}
          aws-region: us-west-2

      - name: Extract BugSnag project API key
        id: bugsnag
        run: |
          PROJECT=$(echo "$ISSUE_BODY" | grep -oP 'app\.bugsnag\.com/[^/]+/\K[^/]+' | head -1)
          KEY=$(echo "$KEYS_JSON" | jq -r --arg p "$PROJECT" '.[$p] // empty')
          if [ -n "$KEY" ]; then
            echo "::add-mask::$KEY"
          fi
          echo "api_key=$KEY" >> "$GITHUB_OUTPUT"
        env:
          ISSUE_BODY: ${{ github.event.issue.body }}
          KEYS_JSON: ${{ secrets.BUGSNAG_PROJECT_API_KEYS }}

      - name: Run Claude Code with SmartBear MCP
        id: claude
        uses: anthropics/claude-code-action@ff34ce0ff04a470bd3fa56c1ef391c8f1c19f8e9 # v1.0.38
        with:
          github_token: ${{ steps.app-token.outputs.token }}
          use_bedrock: "true"
          prompt: |
            # BugSnag エラー初動分析

            以下のGitHub issueに記載されたBugSnagエラーを分析してください。

            ## Issue情報
            - タイトル: ${{ github.event.issue.title }}
            - 本文:
            ${{ github.event.issue.body }}

            ## 注意事項
            - SmartBear MCPツール(`mcp__smartbear__bugsnag_*`)は直接利用可能です。Bashでの確認は不要です。

            ## やること

            1. issue本文に含まれるBugSnagのダッシュボードURLを元に、SmartBear MCPサーバーの `Get Event Details From Dashboard URL` でエラーの詳細を取得してください。
               - 追加情報が必要な場合は `Get Error` や `Get Event Details` も使ってください。
            2. スタックトレースに含まれるファイルパスと行番号を元に、リポジトリのソースコードを確認してください。
               - エラーが発生した箇所の前後のコードを読み、原因の特定に役立ててください。
            3. 取得したエラー情報とソースコードの分析結果を合わせて、以下のテンプレートに沿って報告書を作成してください。
            4. 時間はJST(日本標準時)に変換して出力してください。

            ## 報告書テンプレート

            ```
            ## 初動分析レポート

            ### 事象
            (何をすると)(どうなる)

            ### 原因
            (何が)(何へ)影響しているから
            (調査中)

            ### 影響範囲
            (発生時間帯)
            (対象件数)
            (調査中)

            #### どのバージョンから発生している不具合なのか

            #### 現行最新バージョンでも発生する不具合なのか

            ### 再現手順

            ### 暫定対策(思いつけば)

            ### 恒久対策(思いつけば)

            ### エラー該当箇所

            ### リポジトリの該当箇所
            ```

            報告書が完成したら、以下のコマンドでissueにコメントとして投稿してください。
            `gh issue comment ${{ github.event.issue.number }} --repo ${{ github.repository }} --body "<報告書の内容>"`
          claude_args: |
            --model global.anthropic.claude-sonnet-4-5-20250929-v1:0
            --mcp-config '{"mcpServers": {"smartbear": {"command": "npx", "args": ["-y", "@smartbear/mcp@latest"], "env": {"BUGSNAG_AUTH_TOKEN": "${{ secrets.BUGSNAG_AUTH_TOKEN }}", "BUGSNAG_PROJECT_API_KEY": "${{ steps.bugsnag.outputs.api_key }}"}}}}'
            --allowedTools "Read,Glob,Grep,mcp__smartbear__bugsnag_get_event_details_from_dashboard_url,mcp__smartbear__bugsnag_get_error,mcp__smartbear__bugsnag_get_event_details,mcp__smartbear__bugsnag_list_projects,mcp__smartbear__bugsnag_list_project_errors,mcp__smartbear__bugsnag_list_releases,mcp__smartbear__bugsnag_get_release,Bash(gh issue:*)"