Claude Code Action で「役割別 AI レビュー」を自動化する方法

# はじめに

最近、Claude Code Actionが話題になっています。
GitHub Actionsを使ってコードレビューを効率化できる便利なツールですが、同じ長いプロンプトを何度もコメント欄に書くと、重要な議論が埋もれてしまいます。

カスタムインストラクションを設定できることを以下の方の発信により知ることができました。

https://x.com/yoshi8__/status/1929767737674342837

https://x.com/yoshi8__/status/1929839335286940151

筆者もこの実装をやってみたいと感じており、
そこでこの記事では、以下のような問題を解決する方法をわかりやすく解説します。

* GitHubのコメントに毎回長い指示を書かなくてもいいようにする
* 一つのGitHub Actionで役割ごとに動作を切り替える（フロントエンド、バックエンド、QAなど）

具体的には、「@claude」だけでなく、「@claude\_frontend」「@claude\_backend」「@claude\_qa」など呼び方を変えるだけで、動的にカスタムインストラクションを設定する方法を説明します。

**この記事を読めば、コメント１行だけで簡単にレビューの種類を切り替えることができるようになります！**

---

## 目次

1. [背景とペルソナ](#背景とペルソナ)
2. [アーキテクチャ概要](#アーキテクチャ概要)
3. [ロジック解説](#ロジック解説)
4. [最終形 YAML 全コード](#最終形-yaml-全コード)
5. [処理シーケンス図](#処理シーケンス図)
6. [運用ベストプラクティス](#運用ベストプラクティス)
7. [まとめ](#まとめ)
8. [参考文献](#参考文献)

---

## 背景とペルソナ <a id="背景とペルソナ"></a>

この記事は以下のような方を対象にしています。

| 項目          | 内容                               |
| ----------- | -------------------------------- |
| **ターゲット読者** | GitHub Actionsを日常的に使うフルスタックエンジニア |
| **課題**      | YAMLファイルが役割ごとに肥大化し、管理が難しい        |
| **目的**      | コメント1行でレビューの役割を切り替えられるようにする      |

---

## アーキテクチャ概要 <a id="アーキテクチャ概要"></a>

以下は処理の流れを図で示したものです。

```mermaid
flowchart TD
    A[GitHub Event発生] --> B{本文に @claudeが含まれる?}
    B -- No --> Z[何もしない]
    B -- Yes --> C[トリガーを検出]
    C --> D{役割指定あり?}
    D -- Yes --> E[対応する.mdファイルを読み込み]
    D -- No --> F[デフォルト設定で実行]
    E --> G[Claude Code Actionを実行]
    F --> G
```

**ポイント:**

* GitHubの４種類のイベント（Issue、PR、コメント、レビュー）を監視します。
* 正規表現で役割を判定し、対応するプロンプトをMarkdownファイルから読み込みます。
* AWSのBedrock経由でClaudeを呼び出します。

---

## ロジック解説 <a id="ロジック解説"></a>

役割ごとに以下のように設定が変わります。

| 呼び名                | **TRIGGER\_PHRASE** | **CUSTOM\_INSTRUCTIONS**           |
| ------------------ | ------------------- | ---------------------------------- |
| `@claude`          | `@claude`           | なし（デフォルト動作）                        |
| `@claude_frontend` | `@claude_frontend`  | `.github/instructions/frontend.md` |
| `@claude_backend`  | `@claude_backend`   | `.github/instructions/backend.md`  |
| `@claude_qa`       | `@claude_qa`        | `.github/instructions/qa.md`       |

* カスタムインストラクションが空でもエラーにならないため、安全に運用可能です。
* 無駄な起動を防止するため、役割を検出した時だけ実行します。

---

## 最終形 YAML 全コード <a id="最終形-yaml-全コード"></a>

```yaml
# ------------------------------------------------------------
# .github/workflows/claude.yml
# Claude Code Action（Bedrock 経由）最終版
# - TRIGGER_PHRASE に応じて CUSTOM_INSTRUCTIONS を動的に切替
# - @claude            : 既定の Claude（インストラクションなし）
# - @claude_frontend   : フロントエンドレビュー用
# - @claude_backend    : バックエンドレビュー用
# - @claude_qa         : QA／テスト観点レビュー用
# ------------------------------------------------------------
name: Claude Assistant

################################################################################
# ❶ 対象イベント
################################################################################
on:
  issue_comment:                # イシュー／PR コメント
    types: [created]
  pull_request_review_comment:  # PR 行内コメント
    types: [created]
  issues:                       # イシュー本文
    types: [opened, assigned]
  pull_request_review:          # PR レビュー本文
    types: [submitted]

################################################################################
# ❷ ジョブ定義
################################################################################
jobs:
  claude-code-action:
    # コメント／本文に「@claude」で始まる文字列が含まれる場合のみ実行
    if: |
      (github.event_name == 'issue_comment'               && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review'         && contains(github.event.review.body,  '@claude')) ||
      (github.event_name == 'issues'                      && contains(github.event.issue.body,   '@claude'))

    runs-on: ubuntu-latest

    # ❸ 共通環境変数 ――― AWS / Bedrock
    env:
      AWS_REGION: ap-northeast-1
      ANTHROPIC_BEDROCK_BASE_URL: "https://bedrock-runtime.ap-northeast-1.amazonaws.com"

    permissions:
      contents: read          # ソース参照
      pull-requests: read     # PR 参照
      issues: read            # Issue 参照
      id-token: write         # OIDC 用

    steps:
      ##########################################################################
      # 1. ソース取得
      ##########################################################################
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 1   # 履歴最小化で高速化

      ##########################################################################
      # 2. AWS OIDC 認証
      ##########################################################################
      - name: Configure AWS Credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}   # 🤫 GitHub Secrets
          aws-region: ${{ env.AWS_REGION }}
          role-duration-seconds: 3600
          role-session-name: GitHubActions${{ github.run_id }}
          mask-aws-account-id: true

      ##########################################################################
      # 3. トリガー検出 & インストラクション判定
      ##########################################################################
      - name: Detect trigger and instruction type
        id: detect_trigger
        shell: bash
        env:
          # すべてのイベントで「本文」を BODY に格納
          BODY: |
            ${{ github.event.comment.body }}
            ${{ github.event.review.body }}
            ${{ github.event.issue.body }}
        run: |
          # デフォルト値を初期化
          echo "HAS_TRIGGER=false"        >> $GITHUB_OUTPUT

          # @claude_xxx （xxx=frontend/backend/qa…）を抽出
          if [[ "$BODY" =~ @claude_([a-zA-Z0-9]+) ]]; then
            TYPE="${BASH_REMATCH[1]}"
            echo "TRIGGER_PHRASE=@claude_${TYPE}"                   >> $GITHUB_ENV
            echo "INSTRUCTION_PATH=.github/instructions/${TYPE}.md" >> $GITHUB_ENV
            echo "HAS_TRIGGER=true"                                 >> $GITHUB_OUTPUT

          # プレーン @claude
          elif echo "$BODY" | grep -q "@claude"; then
            echo "TRIGGER_PHRASE=@claude"  >> $GITHUB_ENV
            echo "INSTRUCTION_PATH="       >> $GITHUB_ENV
            echo "HAS_TRIGGER=true"        >> $GITHUB_OUTPUT
          fi

      ##########################################################################
      # 4. カスタムインストラクションを環境変数へ取り込み
      #    - *.md に日本語で詳細プロンプトを記述しておく
      ##########################################################################
      - name: Read custom instructions (if any)
        if: steps.detect_trigger.outputs.HAS_TRIGGER == 'true' && env.INSTRUCTION_PATH != ''
        shell: bash
        run: |
          {
            echo "CUSTOM_INSTRUCTIONS<<EOF"
            cat "$INSTRUCTION_PATH"
            echo "EOF"
          } >> "$GITHUB_ENV"

      ##########################################################################
      # 5. Claude Code Action 起動
      ##########################################################################
      - name: Run Claude Code Action
        if: steps.detect_trigger.outputs.HAS_TRIGGER == 'true'
        uses: anthropics/claude-code-action@beta
        with:
          model: "apac.anthropic.claude-sonnet-4-20250514-v1:0"
          use_bedrock: "true"
          trigger_phrase:      ${{ env.TRIGGER_PHRASE }}      # 例）@claude_backend
          custom_instructions: ${{ env.CUSTOM_INSTRUCTIONS }} # 空でも OK
```

---

## 処理シーケンス図 <a id="処理シーケンス図"></a>

実際の処理の流れは以下の通りです。

```mermaid
sequenceDiagram
    participant Dev as 開発者
    participant GitHub
    participant GHA as GitHub Action
    participant Claude

    Dev->>GitHub: コメント（例: @claude_backendで呼び出す）
    GitHub->>GHA: イベントをトリガー
    GHA->>GHA: コメントから役割を判定
    GHA->>GHA: 役割に対応した.mdを読み込む
    GHA->>Claude: AWS Bedrock経由でClaudeを呼び出し
    Claude-->>GitHub: レビュー結果をコメントとして返す
```

---

## 運用ベストプラクティス <a id="運用ベストプラクティス"></a>

* カスタムインストラクションをGit管理し、変更履歴を追跡。
* プルリクエストのテンプレートに呼び出し方を明記し、チームで共有。
* AWSやClaudeの設定をGitHub Secretsで安全に管理。
* 頻繁な呼び出しを避け、必要な範囲で活用して効率化。

---

## まとめ <a id="まとめ"></a>

* **コメント１行で簡単に役割を切り替えられる**ため、開発の効率が向上します。
* YAMLファイルもシンプルに管理でき、導入・運用が非常に簡単です。
* 空でも安全に運用できる設計なので、初めての方でも安心して導入できます。

ぜひClaude Code Actionを活用し、チームの開発体験を改善しましょう。

---

### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。

https://mosaica.co.jp/

---

## 参考文献 <a id="参考文献"></a>

https://github.com/anthropics/claude-code-action

https://docs.anthropic.com/en/docs/claude-code/github-actions

https://github.com/aws-actions/configure-aws-credentials