doda システムアーキテクト部の齋藤です。
今年は私たちの部署では doda開発生成AI元年
を掲げて生成 AI 活用に取り組んでいます。今後いくつか記事を出せればと思っていますが、今回はその初回の記事となります。
サードパーティの GitHub Action を使っていて一部処理の書き換えをしたいことはありますか?
他の会社でも使うような機能の追加やバグの修正であれば OSS に対して PR を出せばよいと思いますが、反映まで待ちきれなかったり、もしくは独自の環境の問題で発生する場合は PR は出さないけど自分たちの環境ではコードを一部変えたいということもあると思います。
そのような場合の対処法として、第一選択肢は Fork して使うことが考えられると思います。 しかしこの方法の場合には、バージョンアップ時の手間が気になるかと思います。
今回は生成 AI 周りの OSS 活用となり、バージョンアップの影響が特に大きいと判断して別の方法で修正を行いましたのでご紹介します。
経緯
先日Claude Code GitHub Actionsが発表されましたね。 私たちの環境でも導入を試しました。
ドキュメントに従ってワークフローを作成し、issue に @claude
タグをつけて動いた! と思ったのも束の間、以下のエラーが出力しました。
bun install v1.2.11 (cb6abd21) error: Integrity check failed for tarball: @modelcontextprotocol/sdk error: IntegrityCheckFailed extracting tarball from @modelcontextprotocol/sdk error: Integrity check failed for tarball: bun-types error: IntegrityCheckFailed extracting tarball from bun-types Error: Process completed with exit code 1.
...まったく分かりません。 Github のanthropics/claude-code-action リポジトリで検索しても同じ問題は見つけられず、エラー文言で検索しても私の知識では解決には至りませんでした。
生成 AI を活用して早く動かしてみたかった私は早々にこの問題を諦めて、今回の本題であるサードパーティの GitHub Aciton を上書きする方法を試すことにしました。
上書き方法
Claude Code GitHub Actionsの挙動理解
上書きする方法の前に Claude Code GitHub Actions の挙動を整理しておきます。 簡単には以下のような流れで Claude Code GitHub Actions は実行されます。
- コンテキストの収集とプロンプト生成
- Claude Code の実行
- Github へのコメントなどの完了処理
STEP 1 と STEP 3 はClaude Code GitHub Actionsで実行されますが、STEP 2 は Claude Code GitHub Actions からClaude Code Base Actionを呼び出すことで実行されます。
ラッパーとしてのActionを用意する
今回のエラーは bun install で発生していました。
そのため npm install
で実行してみて解消しないかを検証してみることにしました。
まず claude-code-action-wrapper
というリポジトリを私たちの Organization 配下に作成しました。
このリポジトリに action.yml
を作成します。
そしてそのアクションの中で以下のようなことを行いました。
Claude Code GitHub Actions
とClaude Code Base Action
をクローンする- Node.js と Bun をセットアップする
Claude Code GitHub Actions
とClaude Code Base Action
のディレクトリでnpm install
をする- 以降は
Claude Code GitHub Actions
とClaude Code Base Action
の action を実行する
以下は action.yml の抜粋です。
runs: using: "composite" steps: - name: Checkout the action repository uses: actions/checkout@v4 - name: Clone Claude Code Action shell: bash run: | git clone --branch v0.0.9 --single-branch https://github.com/anthropics/claude-code-action.git git clone --branch v0.0.6 --single-branch https://github.com/anthropics/claude-code-base-action.git - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: Install Bun # https://github.com/oven-sh/setup-bun/releases/tag/v2.0.2 uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 with: bun-version: 1.2.11 - name: Install Claude Code Action Dependencies shell: bash run: | cd claude-code-action npm install - name: Install Claude Code Base Action Dependencies shell: bash run: | cd claude-code-base-action npm install # claude-code-action runs # https://github.com/anthropics/claude-code-action/blob/main/action.yml - name: Prepare action id: prepare shell: bash run: | bun run claude-code-action/src/entrypoints/prepare.ts env: TRIGGER_PHRASE: ${{ inputs.trigger_phrase }} ASSIGNEE_TRIGGER: ${{ inputs.assignee_trigger }} ALLOWED_TOOLS: ${{ inputs.allowed_tools }} CUSTOM_INSTRUCTIONS: ${{ inputs.custom_instructions }} DIRECT_PROMPT: ${{ inputs.direct_prompt }} OVERRIDE_GITHUB_TOKEN: ${{ inputs.github_token }} GITHUB_RUN_ID: ${{ github.run_id }} # 以降claude-code-base-actionの呼び出しが続く
※clone時にタグで取得していますが、ハッシュ値を使う方がより安全です。
あとは Claude Code Github Actions を使いたいリポジトリ側でこのアクションを呼ぶだけです。
- uses: ${owner}/claude-code-action-wrapper@main with: prompt: "${{ github.event.comment.body }}" trigger_phrase: "@claude" timeout_minutes: "10" github_token: ${{ steps.app-token.outputs.token }} use_bedrock: "true" anthropic_model: "anthropic.claude-3-5-sonnet-20240620-v1:0" allowed_tools: "Bash(git status),Bash(git log),Bash(git show),Bash(git blame),Bash(git reflog),Bash(git stash list),Bash(git ls-files),Bash(git branch),Bash(git tag),Bash(git diff),View,GlobTool,GrepTool,BatchTool"
GitHub Enterprise ServerにClaude Code GitHub Actionsが対応していなかった
ラッパーを用意したことで無事 bun run
をすることが出来ました。
しかし次のようなエラーが発生しました。(ログが残っていなかったので正確ではないです)
Checking permissions for actor: xxxx Failed to check permissions: xxx
このエラーを Claude Code GitHub Actions で探すとこの箇所ということが分かりました。
ここは対象リポジトリに対して、@claude
のメンションを付けた人が書き込み権限を持っているかを確認する処理のようです。
権限を取得する API 呼び出し部分でエラーが出ていました。
API定義
権限は設定通り付与しているつもりでしたので、action.yml に以下のような設定を追加して確認してみました。
- name: debug shell: bash run: curl -L \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${{ inputs.github_token }}" \ -H "X-GitHub-Api-Version: 2022-11-28" \ ${GITHUB_API_URL:-https://api.github.com}/repos/${owner}/${repository}/collaborators/${actor}/permission
※${owner}
${repository}
${actor}
には実際の値を入れています。
すると json が普通に返ってくるため設定の問題ではなさそうということが分かりました。
原因判明と対応
エラーが発生している API の呼び出し箇所は octokit.repos.getCollaboratorPermissionLevel
です。
この octokit
を生成している箇所を確認してみました。
すると以下のようなコードでした。client.ts
rest: new Octokit({ auth: token }), graphql: graphql.defaults({ baseUrl: GITHUB_API_URL, headers: { authorization: `token ${token}`, }, }),
Octokit の使い方が分からなかったので調べてみると、インスタンス生成のオプションに baseUrl
というものがあり、Enterprise Server の場合はどうもそこの設定が必要そうだぞと分かりました。
試しに action の中でそこを書き換えてみることにしました。
- name: Update Octokit baseUrl in client.ts shell: bash run: | sed -i 's/rest: new Octokit({ auth: token })/rest: new Octokit({ auth: token, baseUrl: GITHUB_API_URL })/' claude-code-action/src/github/api/client.ts
再実行してみると無事通るようになりました!
そしてこの問題は私たち以外でも同じことが起こると思うので OSS 本体にも PR を投げて解決済みです。
最後に
これで無事動くようになりましたが、最後の Claude Code 実行で以下エラーが出ました。
{ "type": "result", "subtype": "success", "cost_usd": 0, "is_error": true, "duration_ms": 216, "duration_api_ms": 0, "num_turns": 1, "result": "API Error: 400 You invoked an unsupported model or your request did not allow prompt caching. See the documentation for more information.", "total_cost": 0, "session_id": "xxxx-xxxx-xxxx-xxxx" }
今回は Claude Code の実行 model に Bedrock を利用して Sonnet3.5 を指定していました。 私たちの AWS 環境では東京リージョン以外の利用が許可されていないためこの選択をしています。
しかしこのエラーを見てわかるように Bedrock の Sonnet3.5 ではプロンプトキャッシュは対応していません。 そのため現状のままでは Claude Code Github Actions は使えないということが判明しました。 つまり残念ながらこの記事を書いている段階ではまだ導入出来ていないため導入してみての状況などはお伝えすることが出来ません。
しかしこの問題の解消に向けては動いています。 これまで doda の開発組織では AWS のみを利用していましたが、社内では GCP の実績がすでに多くあるため私たちも導入の検討をしていたり、もしくはリージョンの縛りのない別の AWS のアカウントの活用なども進めています。 早く Claude Code Github Actions が使えるようにして、doda の開発を劇的に変えていきたいと考えています。
齋藤 悠太 Yuta Saito
プロダクト開発統括部 dodaシステムアーキテクト部 dodaマイクロサービスグループ マネジャー
SIerや事業会社業務での開発を経験し、2020年9月にパーソルキャリアに入社。現在はdodaサイト開発に携わっている。好きな技術領域はJava、Spring、AWS。
※2025年6月時点の情報です。