▶️

github actionでClaude Code Actionを走らせてみた。

に公開

Claude code actionを使ってPRのレビューとissue対応を自動化できるように、github actionを定義しました。

action定義についても様々な記事があり、チームや個人で利用されている方が多くいますね.

本記事は、Bed Rockを利用したパターンの一例として、みていただけますと幸いです!

参考
https://docs.anthropic.com/ja/docs/claude-code/github-actions#aws-bedrock

Amazon Bed Rockとは?

AWSが提供するAIエージェントを構築するツールです。
こちらを利用して、今回は設定していきます。
https://aws.amazon.com/jp/bedrock/

実際のコード PR Review toggleが推奨

PRのレビュー用のaction
name: Claude PR Reviewer

on:
  pull_request_review_comment:
    types: [created]
  pull_request_review:
    types: [submitted]

jobs:
  review-pr:
    if: |
      (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'))
    runs-on: ubuntu-latest
    permissions:
        contents: read
        pull-requests: write
        issues: read
        id-token: write
        actions: read

    env:
      AWS_REGION: ap-northeast-1
      CLAUDE_MODEL_ID: anthropic.claude-4-20250101-v1:0  # 利用可能なモデル
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 50  # 適度な履歴を保持

      - name: Configure AWS Credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region:  ${{ env.AWS_REGION }}

      - name: Run Claude Code for PR Review
        uses: anthropics/claude-code-action@v1
        timeout-minutes: 30  # 適切なタイムアウト設定
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          use_bedrock: "true"
          claude_args: '--max-turns 5'

ワークフローの徹底解説

1.実行条件 (if:)

if: |
  (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'))

ワークフローは毎回実行されるのではなく、コメント本文に@claudeという文字列が含まれている場合のみ、ジョブが実行されます.これにより,無駄な実行を防ぎ、コストを節約できます。今回は、コスト面を考慮して、自動で実行させることができないように意図的にしています.

  1. トリガー設定 (on:)
on:
  pull_request_review_comment:
    types: [created]
  pull_request_review:
    types: [submitted]

このワークフローは、PRのレビューコメントやレビュー自体が新しく作成・提出されたときに起動します.これにより、開発者がレビュープロセスの中で自然にClaudeを呼び出せるようになります.

  1. 権限設定 (permissions:)
permissions:
  contents: read
  pull-requests: write
  id-token: write

セキュリティのベストプラクティスである「最小権限の原則」に従い、このジョブに必要な権限だけをGITHUB_TOKENに与えています.

contents: read: リポジトリのコードをチェックアウトするために必要です.
pull-requests: write: ClaudeがレビューコメントをPRに書き込むために必要です.
id-token: write: AWSとのOIDC認証(後述)のために必要です.

  1. AWS認証 (configure-aws-credentials)
- name: Configure AWS Credentials (OIDC)
  uses: aws-actions/configure-aws-credentials@v4
  with:
    role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
    aws-region:  ${{ env.AWS_REGION }}

ここでは、OIDC (OpenID Connect) という仕組みを利用し、パスワードやアクセスキーをGitHub Secretsに保存することなく、安全にAWSの権限を一時的に取得しています. secrets.AWS_ROLE_ARNには、事前にAWS側で作成したIAMロールのARNを設定します.
このIAMロールをリポジトリごとに定義することで、権限を最小単位で管理ができるようにしています.
IAMユーザーではなく、ロールで定義を行うところがポイントです.

実際のコード Issue
name: Claude Issues Handler

on:
  issues:
    types: [opened, assigned]
  issue_comment:
    types: [created]

jobs:
  handle-issue:
    if: |
      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
    runs-on: ubuntu-latest
    permissions:
        contents: write
        pull-requests: write
        issues: write
        id-token: write
        actions: read
    env:
      AWS_REGION: ap-northeast-1
      CLAUDE_MODEL_ID: anthropic.claude-4-20250101-v1:0  # 利用可能な場合
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 50  # 適度な履歴を保持

      - name: Configure AWS Credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region:  ${{ env.AWS_REGION }}
        continue-on-error: false
        
      - name: Verify AWS Connection
        run: |
          aws sts get-caller-identity || {
            echo "❌ AWS authentication failed"
            exit 1
          }
        continue-on-error: false

      - name: Run Claude Code for Issues
        uses: anthropics/claude-code-action@v1
        timeout-minutes: 30  # 適切なタイムアウト設定
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          use_bedrock: "true"
          claude_args: '--max-turns 5'

issue用も基本的は同じです!PRを作成させるので、

    permissions:
        contents: write
        pull-requests: write
        issues: write
        id-token: write
        actions: read

contentsの作成を許可させるところは、変えています!

課題感

ざっと箇条書きで書きます.

  • レビューが基本英語
    @claudeだけで、レビューを開始した際、英語でレビューが返ってくる。これ自体は、そこまで困らないが、メンバー間で日本語のみの利用であれば、初めから設定してもいいかもしれない.
@claude 日本でレビューをして

これで、日本語にはなるが、最初からデフォルトでプロンプトに設定しておいても良さそう.

  • レビューの文章が長い.
    不要なコメントと感じるところもあり、レビューの文章量も制限をするなど、読みやすいレビュー文になるように、チューニングは試みたい.

  • PRのコメントで、反応しない場所がある.
    慣れたら、気にならなさそうだが、コメントを書く場所を意識していく必要がある.
    (画像追加)

今回はプロンプトの調整などをしていなかったので、今後細かなチューニングは行っていきたいと考えています.

最後まで、読んでいただき、ありがとうございました.

Discussion