こんにちは。
最近、生成AIの流れが早すぎてついていくのに必死なエンジニアの方が多いのではないでしょうか。
特に、ソースコードを書いてくれるAIについて、これまではあくまで主体はエンジニアですが、最近は独立してソースコードを書いてくれるサービスが増えてきている印象です。
直近でも、Codex、Julesなど出ましたね。
その中でおそらく一番期待されるものの一つであろう、Claude CodeをGitHub Actions上で動かす仕組みの実装について、今回はご紹介してみようと思います。
Claude Codeとは
Claude Codeは、Anthropic社が提供するAIコーディングアシスタントです。
ターミナル上で動作し、プロジェクトのコードベースを理解して自然言語コマンドでコードの編集やバグ修正、テスト実行、コミットやPRの作成まで行ってくれる「エージェント型」の開発支援ツールです。
簡単に言えば、AIが自分のチームメンバーのようにコード作業を自動化してくれるものです。
Claude Codeは通常ターミナルやIDE統合で使いますが、GitHub Actionsと連携することで、IssueやPull Request上でもAIアシスタントとして活躍させることができます。
GitHub上で@claude
メンションをIssueやPRに書き込むだけで、コード解析やバグ修正、新機能の実装まで提案・実施してくれるのが特徴です。
GitHub Actionsとは
GitHub Actionsは、GitHubリポジトリ内のワークフロー(例えばビルド・テスト・デプロイなどの一連の作業)を自動化するためのプラットフォームです。
あらかじめ定義したルールに基づき、PushやIssue作成といったイベントをトリガーにして指定の処理を実行できます。
ワークフローはリポジトリの.github/workflows
以下にYAML形式で定義し、ジョブ(処理の単位)やステップ(具体的なコマンドやアクション)を記述します。
Actionsには公式・コミュニティ提供の再利用可能な「アクション」(たとえばactions/checkout@v4
でコードをチェックアウトするなど)が多数あり、これらを組み合わせて簡単にCI/CDや各種自動化を構築できます。
GitHub Actionsを使えば、開発フローの中で繰り返し発生する定型作業を自動化し、開発者の手間を減らすことができるのです。
Claude Code APIのセットアップ方法(APIキー取得・権限・セキュリティ)
1. Anthropic APIキーの取得
まずClaude Codeを使うにはAnthropicのAPIキーが必要です。Anthropicの開発者サイト(Anthropic Console)でアカウントを作成し、ダッシュボードからAPIキーを発行してください。
無料アカウントでもキーを取得できますが、利用には従量課金制のクレジットが必要になるため、プロジェクトで本格利用する場合は必要に応じて課金プランを検討しましょう(参考: 無料でも開始できますが上位プランではより多くのリクエストが可能です)。
発行したAPIキーはClaude Code(Anthropic API)専用の秘密鍵であり、このキーを使ってClaude(AIモデル)へのリクエストを認証します。
2. 必要な権限の確認
GitHubリポジトリ側では、後述するGitHub Appのインストールやシークレットの設定のためリポジトリ管理者(Admin) 権限が必要です。
自分が対象リポジトリの管理権限を持っているか確認してください。
また、GitHub Actionsでコードを自動修正・PR作成するにはリポジトリへの書き込み権限が必要です。
デフォルトではGitHub Actionsの実行権限はReadのみになっているため、後述するようにWorkflow権限を変更しておきます。
3. APIキーのセキュリティ管理
発行したAnthropic APIキーは絶対に公開しないようにしましょう。【秘密情報をコードにベタ書きせず、GitHubリポジトリのシークレット機能に保存】します。
リポジトリの設定 (Settings) -> Secrets and variables -> Actions から、新しいシークレット ANTHROPIC_API_KEY
を追加し、値に取得したキーを登録してください。
後でActionsのワークフローからこのシークレットを参照することで、安全にキーを利用できます。下図はGitHub上でシークレットを追加する画面の例です。
実装手順: GitHub ActionsでIssueから自動PRを生成する
ここからは、Claude CodeとGitHub Actionsを組み合わせて、GitHubのIssue内容をもとに自動的にコードを修正・追加し、Pull Requestを生成する仕組みの構築手順を説明します。手順は大きく5つに分かれます。
1. GitHub ActionsワークフローYAMLの作成
まず、GitHubリポジトリにワークフロー定義用のYAMLファイルを追加します。例えば.github/workflows/claude.yml
という名前で以下の内容を作成してください。
name: Claude Assistant # ワークフローの名前
on:
issues:
types: [opened, assigned] # Issueが作成された or 担当者が割り当てられたときにトリガー
issue_comment:
types: [created] # IssueやPRへのコメントが投稿されたときにトリガー
pull_request_review:
types: [submitted] # PRレビューが送信されたときにトリガー
jobs:
claude-response:
runs-on: ubuntu-latest
permissions:
contents: write # リポジトリ内容への書き込み権限(コード変更に必要)
issues: write # Issueへの書き込み権限(コメントやラベル操作に使用)
pull-requests: write # Pull Request作成権限(新規PRの作成に必要)
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Bun runtime
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.2.11"
- name: Run Claude Code Action
uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
上記はAnthropic公式のClaude Code Actionを利用したワークフロー定義の例です。ポイントを解説します:
-
トリガー (on: セクション): Issueが新規作成されたりassignされたとき、またIssue/PRへのコメントが投稿されたときにワークフローを開始しています。今回はIssueをもとに自動PRを作るので、Issueのイベントを拾っています。特に
issue_comment: created
を含めているのは、後ほどIssue上で@claude
とコメントすることでAIを起動するためです。 -
permissions: ワークフロー内でGitHubのリソースに書き込むための権限を指定しています。ここではコードの編集・コミットにcontents: write、IssueやPRにコメントしたりPR作成するのに
issues: write
およびpull-requests: write
を付与しています。加えて、GitHubのリポジトリ設定からWorkflow permissionsを “Read and write” に変更しておく必要があります(デフォルトは読み取り専用)。リポジトリのSettings → Actions → Generalで下図のように設定してください。GitHubリポジトリの「Workflow permissions」を“Read and write”に変更する。必要に応じて「GitHub ActionsにPull Requestの作成を許可」も有効化する
-
Set up Bun: Claude Code Actionは実行環境にBun(JavaScriptランタイム)を使用しています。そのため
oven-sh/setup-bun@v2
アクションで指定バージョンのBunをセットアップしています。 -
Claude Code Actionの実行:
anthropics/claude-code-action@beta
がAnthropic提供のアクション本体です。先ほど設定したシークレット${{ secrets.ANTHROPIC_API_KEY }}
を引数に渡し、Claude APIキーをアクションに教えています。github_tokenには${{ secrets.GITHUB_TOKEN }}
を指定していますが、これはGitHub Actionsが自動で生成するトークンで、リポジトリへのアクセスに使われます(上で付与したpermissionsの範囲で有効)。Claude Code Actionではこのトークン経由でリポジトリのコードやIssue内容を読み書きし、必要に応じてブランチ作成やコミット、PR作成を行います。
以上のYAMLをリポジトリに追加・コミットしましょう。Claude Code公式の手順では、CLIから/install-github-app
を実行するとこのYAMLが自動生成されPRが作られる仕組みになっています。うまく自動生成できなかった場合でも、上記のように手動でファイルを追加すれば問題ありません。
2. Issue内容をClaudeに渡しPRを生成するスクリプト例(Python)
上記のYAML定義ではAnthropic社の提供するActionが内部でAIへの指示出しやコード変更適用まで行ってくれます。しかし、処理の流れを理解するために、Issueをプロンプト(入力)としてClaude APIを呼び出し、返答をもとにコードを修正してPRを作成する処理をスクリプトで記述する例も紹介します。ここではPythonを使った簡単な例を示します(Node.jsでもAnthropic提供のSDKを使って同様の処理が可能です)。
import os, subprocess
import anthropic # Anthropic社のPython SDK
# GitHub Actionsから渡された環境変数からIssueのタイトル・本文を取得
issue_title = os.environ.get("ISSUE_TITLE")
issue_body = os.environ.get("ISSUE_BODY")
# Claudeへのプロンプトメッセージを構築(Issueタイトルと本文を渡す)
user_prompt = f"Issue: {issue_title}\n{issue_body}\nこのIssueの内容に基づいて必要なコード変更を実装してください。"
# Anthropic APIクライアントを初期化(環境変数からAPIキーを取得)
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
# Claude(Large Language Model)にメッセージを送信して回答を取得
response = client.messages.create(
model="claude-2", # 利用するモデルID(例: claude-2 系列)
max_tokens=1000, # 生成させる最大トークン数(適宜調整)
messages=[ {"role": "user", "content": user_prompt} ]
)
answer = response.messages[0]["content"] # Claudeからの回答内容
# (回答内容からコードの修正内容を解釈し、ファイルを書き換える処理をここに実装)
# 例: 回答に含まれるパッチやコードブロックを解析し、該当ファイルを編集する
# 変更をGitにコミットし、新規ブランチをプッシュ
branch_name = "claude-fix-issue"
subprocess.run(["git", "checkout", "-b", branch_name])
subprocess.run(["git", "add", "."])
commit_msg = f"AI fix for issue: {issue_title}"
subprocess.run(["git", "commit", "-m", commit_msg])
subprocess.run(["git", "push", "origin", branch_name])
# GitHub APIを使ってプルリクエストを作成(エンドポイントにPOSTリクエスト)
import requests
repo = os.environ.get("GITHUB_REPOSITORY") # "owner/name" 形式
gh_token = os.environ.get("GITHUB_TOKEN")
headers = {"Authorization": f"Bearer {gh_token}"}
data = {
"title": f"Fix: {issue_title}",
"head": branch_name,
"base": "main",
"body": "This PR was generated by Claude based on the issue."
}
requests.post(f"https://api.github.com/repos/{repo}/pulls", json=data, headers=headers)
上記の流れを順に説明します。
- Issue内容の取得: GitHub Actionsからこのスクリプトを呼ぶ際に、環境変数や入力としてIssueのタイトルと本文を渡しておくことで、スクリプト内でそれを取得できます(例では
ISSUE_TITLE
とISSUE_BODY
環境変数を利用)。これらを使い、Claudeへのユーザープロンプトとして「Issueのタイトルと説明文」を含むメッセージを組み立てています。 - Claude(API)の呼び出し: AnthropicのPython SDK (anthropic モジュール)を使ってClaudeモデルにメッセージを送り、回答を取得しています。api_keyには環境変数から読み込んだキーをセットし、modelには利用するClaudeモデル(例: claude-2)を指定します。メッセージはOpenAIのChatGPT APIに似た形式で、ここではシンプルにユーザー役割でIssue内容を投げています。Claudeからの回答(answer)には、Issueを解決するためのコード提案や手順がテキストで返ってくるでしょう。
- コードへの変更適用: 返ってきた回答内容を解析し、必要なコード変更をリポジトリのファイルに適用します。この部分の実装は回答フォーマットによって異なります。Claude Code Actionでは、Claudeが内部で直接ファイル編集やgit diffの生成を行ってくれますが、手動スクリプトの場合は回答を読み取って自前でファイルを書き換える処理を書く必要があります。例えば、回答に「diff」形式でパッチが含まれていればそれをパースして該当箇所を書き換える、あるいは提案されたコードブロックをコピーしてファイルに挿入するといった形です(初心者には少し高度な処理になるため、Claude Code Actionの利用が簡単です)。
- Gitブランチ作成とPR作成: 修正を加えたら、スクリプト内でGitコマンドを呼び出し(Actionsランナー上でGitを使用できます)、新しいブランチを切ってコミットをプッシュしています。その後、GitHubのPull Request作成APIエンドポイント(
/repos/:owner/:repo/pulls
)に対してHTTP POSTすることで、新規PRを作成しています。ここでは環境変数GITHUB_TOKEN
(自動で提供されるトークン)を使い、認証ヘッダ付きでリポジトリに対してPR作成リクエストを送っています。
以上は簡易的な例ですが、GitHub Actions上でAnthropicのAPIを直接呼び出してPR作成まで行うにはこのようなステップが必要になります。実際にはAnthropic提供のClaude Code Actionを使えば、これらの処理(Issue内容の取得~コード編集~PR発行)をすべてAction内部で自動的に行ってくれるため、自分で一からコードを書く必要はありません。スクリプト例はClaude Code Actionの内部動作イメージとして参考にしてください。
3. GitHub Actions上でClaudeを呼び出す構成(環境変数・認証設定など)
次に、GitHub Actionsの環境でClaude(Anthropic API)を呼び出すための設定を確認します。ポイントはAPIキーやリポジトリ情報を適切に環境変数として渡すことと、必要な認証情報を確実に設定することです。
- Anthropic APIキーの注入: 先ほどリポジトリのシークレットに登録した
ANTHROPIC_API_KEY
は、Actionsワークフロー内で${{ secrets.ANTHROPIC_API_KEY }}
という形で参照できます。公式Claude Code Actionを使う場合は、先のYAML例のようにwith:オプションでanthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
と渡せば、アクション内部で自動的にこのキーが環境変数ANTHROPIC_API_KEY
として利用されます。自作のスクリプトを使う場合でも、例えばenvセクションで環境変数としてキーをスクリプトに渡すことができます。いずれにせよ、APIキーはシークレット経由で安全に提供し、コード上にハードコーディングしないようにします。 - GitHubトークンの利用: GitHub Actionsはデフォルトで
GITHUB_TOKEN
という特殊なトークンを提供しており、これを使ってGitHubのAPIにアクセスしたりリポジトリに対する操作(IssueやPRの書き込み、コードプッシュなど)を行います。先のYAML例でもgithub_token: ${{ secrets.GITHUB_TOKEN }}
と指定しました。secrets.GITHUB_TOKEN
はGitHubが自動生成するトークンで、リポジトリへの読み書き権限はリポジトリ設定かワークフローのpermissionsで指定した範囲に限られます。今回のケースでは、コードのコミットやPR作成が必要なので、先述の通りcontents: write
やpull-requests: write
といった権限を付与しました。これにより、Claude Code Action(または自作スクリプト)からGitHub API経由でブランチの作成・プッシュやPRのオープンができるようになります。 - リポジトリ情報の取得: Actions実行環境では、例えばリポジトリ名やIssue番号などのコンテキスト情報が自動で環境変数や
${{ github.event }}
のような表現で参照できます。自作スクリプトでIssue内容を使いたい場合、${{ github.event.issue.title }}
や${{ github.event.issue.body }}
をワークフローから環境変数にセットして渡す方法があります(例:ISSUE_BODY: ${{ github.event.issue.body }}
)。Claude Code Actionではこうした処理が内部で行われており、Issue本体やコメント内容をAIに渡してくれます。したがって、通常はワークフロー内で特別なことをしなくてもIssueやPRの内容がClaudeに伝わるようになっています。
まとめると、GitHub Actions上でClaudeを動かすには「Anthropic APIキー」と「GitHubリポジトリへのアクセス権(トークンと適切な権限設定)」という2つの情報を準備・設定する必要があります。それさえ整えれば、あとのプロンプト生成や結果の適用はClaude Code Actionが代行してくれます。
4. Claude GitHub Appのインストールとリポジトリ連携
Claude CodeをGitHub Actionsで使うために、Claude専用のGitHub App(アプリ)をリポジトリにインストールします。Anthropicが提供する公式のGitHub App「Claude」を導入することで、先ほど設定したワークフローが適切に動作し、Claudeがリポジトリ内でコード変更やPR作成を行えるようになります。
インストール手順は次の通りです:
- ブラウザで Claude GitHub App のページ にアクセスします。
- 「Install」ボタンをクリックし、インストール先として目的のリポジトリを選択します(「Only select repositories」から対象リポジトリにチェックを入れます)。
- 承認を進め、インストールが完了したら、GitHubリポジトリのSettings -> Integrations -> GitHub Appsの一覧に「Claude」が表示されていることを確認してください。インストール済みのアプリの欄にClaudeがあればOKです。
Claude GitHub Appは、リポジトリへの読み書きやPR作成に必要な権限(ContentsやIssuesへのアクセス権など)を持つよう要求されます。インストール時にこれらのアクセス許可を与えることになりますが、基本的には先述のワークフローで付与したものと同等の範囲です。GitHub Appを使うことで、Claude Code Actionが裏でGitHub APIを呼び出す際に、GitHub App経由の認証が行われます。また、Anthropicの公式Quickstartではターミナル上でclaude /install-github-app
コマンドを使ってこのインストールとセットアップを対話的に行う方法も紹介されています。手動でうまくいかない場合はCLI経由の方法も試せます。
補足: GitHub App「Claude」をインストールせずに、github_tokenにデフォルトのGITHUB_TOKENを使って動かすことも技術的には可能ですが、Anthropicの手順ではGitHub Appを利用する方法が推奨されています。初心者の方は指示に従ってAppを導入するのが確実です。
5. ワークフローを実行して確認する方法
準備が整ったら、実際にこの仕組みを動かしてみましょう。以下の手順で動作確認を行います。
-
Issueを作成する: リポジトリで新しくIssueを立てます。内容は簡単な機能追加やバグ報告にしましょう(例:「ログインフォームにユーザー認証を追加してほしい」など)。
-
Claudeに実装を依頼するコメントを書く: 作成したIssueのコメント欄に、Claudeへの指示となるコメントを書き込みます。例えば:
@claude このIssueの内容に基づいて機能を実装してください。
このように
@claude
メンションを含めたコメントを投稿すると、先ほどのGitHub Actionsワークフローがトリガーされます(issue_comment: created
イベントにマッチします)。コメント全文がClaudeへのプロンプトとして渡され、Claude CodeがIssueの説明を読み取って必要なコード変更を開始します。 -
Claudeがコードを編集しPRを作成する: ワークフロー実行中、Claude Code Actionはリポジトリのコードベースを解析し、Issueで要求された変更を実現するコードを自動生成します。具体的には、新しいブランチを切ってファイルを編集し、コミットを作成してPull Requestを開くところまで自動で行われます。例えば「ログインエンドポイントに認証機能を追加して」と依頼した場合、ClaudeはJWT認証のコードを追加するブランチを作り、変更点を含むPRを自動生成します(筆者のテストでは、基本的なJWT認証ロジックを追加するPRが作成されました)。
-
結果を確認・レビューする: GitHub上で、新しく作成されたPull Requestを確認します。変更されたコードの差分(diff)や、Claudeが生成した説明文が含まれているはずです。自動生成されたコードがお望みの内容に沿っているかをレビューしてください。不明点があればPR上でClaudeに質問コメントをすることもできます(@claude この関数の意図を説明してくださいのようにコメントすれば、Claudeが追加説明を返してくれます)。AIの提案した変更が適切であれば、そのPRをマージすることでコードベースに反映できます。
-
必要に応じて修正・追記する: 場合によってはClaudeの生成したコードをそのままマージする前に、人間の目で細部を調整したり、セキュリティやコードスタイルの観点から修正する必要があるかもしれません。Claude Codeは強力ですが万能ではないため、最終的な判断と責任は開発者にあります。常に生成結果をレビューし、プロジェクトの標準に沿っているか確認しましょう。必要ならばPR上で追加コミットして調整し、問題なければマージしてください。
以上で一連の流れの確認は完了です。うまく動作すれば、Issueにコメントした直後にGitHub Actionsのワークフロー実行が始まり(Actionsタブで確認できます)、しばらくして新しいPull Requestが作られるはずです。例えば、あるIssueに「@claude fix the TypeError in the user dashboard component」とコメントすると、ClaudeがそのIssueの内容(ダッシュボードコンポーネントのTypeError)を理解し、該当箇所を修正したコードをコミットしてPRを開いてくれます。このように、簡単な指示でAIがブランチを作り、コードを書き換えてPRを用意してくれるのがClaude Code + GitHub Actionsの強力なところです。
最後に、セキュリティと運用上の注意として以下を挙げておきます:
- APIキーの管理やGitHubトークンの権限設定には最新の注意を払うこと(キー漏洩防止、不要な権限を与えない等)。
- Claudeの提案は常に正しいとは限らないため、必ず人間がレビューを行い、問題がないことを確認してからコードを本番に取り込むこと。
- 初めは小さなIssueや簡単な修正で試し、Claude Codeの挙動に慣れると良いでしょう。プロジェクトに合わせて
CLAUDE.md
というガイドラインファイルを用意すれば、コードスタイルや制約をClaudeに理解させることもできます。
以上、初心者向けにClaude CodeをGitHub Actions上で活用し、Issueから自動でPull Requestを生成する方法を解説しました。
適切にセットアップすれば、あなたのGitHubリポジトリにまるでバーチャルな共同開発者が加わったかのように、Issue対応がスピーディーになるでしょう。
ぜひ試してみてください。各種設定や使用法で困った場合は公式ドキュメントやコミュニティ(AnthropicのDiscordやGitHubリポジトリのFAQ)も参照してみてください。
これであなたもClaude CodeとGitHub Actionsを駆使して、開発効率アップを体感できるはずです。お疲れさまでした!