Claude Code を GitLab CI/CD で動かす

Claude Code エンジニアリング 8分で読めます

Issue に「@claude この機能を実装して」とコメントすると、GitLab のパイプラインで Claude Code が動き、変更をブランチに書いてマージリクエスト(MR)を開く。Claude Code GitLab CI/CD はこうした使い方を .gitlab-ci.yml のジョブ1つで実現する連携です。本記事では公式ドキュメント「Claude Code GitLab CI/CD」に沿って、仕組み・最小構成のジョブ・クラウドプロバイダでの認証・運用上の注意を日本語で整理します。

公式ドキュメントによると、この連携はベータ版で、機能は今後変わる可能性があります。また保守しているのは GitLab 側で、サポート窓口は GitLab の Issue です。GitHub 向けの Claude CodeをGitHub Actionsで動かす と発想は近いものの、設定方法は別物なので混同しないようにしてください。

GitLab 連携でできること

この連携は Claude Code CLI と Agent SDK の上に作られており、CI/CD ジョブの中で Claude をプログラムから呼び出します。処理の流れは公式ドキュメントで次の3段階として説明されています。

  1. イベント駆動の起動: Issue・MR・レビュースレッドで @claude を含むコメントが付くなど、選んだトリガーで GitLab がジョブを起動します。ジョブはスレッドとリポジトリから文脈を集めてプロンプトを組み立て、Claude Code を実行します。
  2. プロバイダの選択: Claude API、Amazon Bedrock(IAM ベースのアクセス)、Google Cloud の Agent Platform(Workload Identity Federation)から環境に合うものを使えます。リージョンのエンドポイントを選べば、レイテンシやデータ所在の要件にも合わせられます。
  3. 隔離された実行: 各処理はネットワークとファイルシステムを制限したコンテナで動き、書き込みはワークスペースの範囲に限定されます。変更はすべて MR を通るため、レビュアーが差分を確認し、既存の承認ルールもそのまま効きます。

パイプラインの中で Claude ができることとして、公式には次の例が挙がっています。

Claude はリポジトリの CLAUDE.md と既存コードのパターンに従って作業します(CLAUDE.md については CLAUDE.md で Claude Code にプロジェクトを記憶させるを参照)。

クイックセットアップ

最短の始め方は、API キーをマスク変数として登録し、.gitlab-ci.yml に最小限のジョブを足すことです。

  1. マスクされた CI/CD 変数を追加する: Settings → CI/CD → Variables を開き、ANTHROPIC_API_KEY を追加します(必要に応じて protected にもします)。
  2. .gitlab-ci.yml に Claude のジョブを追加する: 公式ドキュメントに掲載されている例は次のとおりです。
stages:
  - ai

claude:
  stage: ai
  image: node:24-alpine3.21
  # ジョブの起動条件は用途に合わせて調整する
  # - 手動実行
  # - マージリクエストのイベント
  # - '@claude' を含むコメントを受けた web/API トリガー
  rules:
    - if: '$CI_PIPELINE_SOURCE == "web"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
  variables:
    GIT_STRATEGY: fetch
  before_script:
    - apk update
    - apk add --no-cache git curl bash
    - curl -fsSL https://claude.ai/install.sh | bash
    # インストーラは claude を ~/.local/bin に置くが、このイメージでは PATH に入っていない
    - export PATH="$HOME/.local/bin:$PATH"
  script:
    # 任意: 環境に GitLab MCP サーバーがあれば起動する
    - /bin/gitlab-mcp-server || true
    # web/API トリガーで文脈を渡すときは AI_FLOW_* 変数を使う
    - echo "$AI_FLOW_INPUT for $AI_FLOW_CONTEXT on $AI_FLOW_EVENT"
    - >
      claude
      -p "${AI_FLOW_INPUT:-'Review this MR and implement the requested changes'}"
      --permission-mode acceptEdits
      --allowedTools "Bash Read Edit Write mcp__gitlab"
      --debug

ポイントは3つです。まず claude -p で指示を渡す非対話の実行(Claude Codeをヘッドレス(非対話)で実行する)であること。次に --permission-mode acceptEdits でファイル編集を自動承認していること(Manual・Plan・Autoをどう選ぶ? Claude Code権限モードの使い分け)。そして --allowedTools で使えるツールを BashReadEditWrite と GitLab 用 MCP ツール mcp__gitlab に絞っていることです。

ジョブと変数を追加したら、CI/CD → Pipelines から手動でジョブを実行して試すか、MR からトリガーして Claude にブランチ上で変更を提案させます。

本番向けの手動セットアップ

より管理された構成やエンタープライズ向けプロバイダが必要な場合、公式ドキュメントは次の手順を推奨しています。

  1. プロバイダへのアクセスを設定する
    • Claude API: ANTHROPIC_API_KEY をマスクされた CI/CD 変数として保存する
    • Amazon Bedrock: GitLab を AWS の OIDC として設定し、Bedrock 用の IAM ロールを作る
    • Google Cloud の Agent Platform: GitLab 向けに Workload Identity Federation を設定する
  2. GitLab API 操作用の認証情報を用意する: 既定では CI_JOB_TOKEN を使います。足りなければ api スコープの Project Access Token を作り、GITLAB_ACCESS_TOKEN(マスク)として保存します。
  3. ジョブを追加する: Claude API なら前節のジョブ、クラウドプロバイダなら次節の例を使います。
  4. (任意)メンションでの起動を有効にする: 「Comments (notes)」のプロジェクト Webhook を自前のイベントリスナーに向け、コメントに @claude が含まれていたらパイプライントリガー API を AI_FLOW_INPUTAI_FLOW_CONTEXT などの変数付きで呼ぶようにします。

つまり、@claude のメンションに反応させる部分は GitLab 標準の Webhook とパイプライントリガーを組み合わせて自分で用意する形です。設定後は、たとえば次のようなコメントで使います(公式の例を和訳)。

Amazon Bedrock と Google Cloud で動かす

エンタープライズ環境では、同じ使い勝手のまま自社のクラウド基盤上で Claude Code を動かせます。どちらも長期間有効なキーを保存せず、ジョブが発行する OIDC トークンを一時的な認証情報に交換する方式です。

Amazon Bedrock(OIDC)

前提は、目的の Claude モデルにアクセスできる Bedrock、AWS IAM に OIDC プロバイダとして登録した GitLab、そしてプロジェクトと保護された ref に絞った信頼ポリシーと最小権限を持つ IAM ロールです。CI/CD 変数として AWS_ROLE_TO_ASSUME(ロールの ARN)と AWS_REGION を用意します。

ジョブでは id_tokens: ブロックで GITLAB_OIDC_TOKEN を発行させ(aud は AWS 側に設定した audience と合わせる)、aws sts assume-role-with-web-identity で一時認証情報に交換してから、CLAUDE_CODE_USE_BEDROCK: "1" を設定して claude -p を実行します。公式の例から要点を抜き出すと次のとおりです。

claude-bedrock:
  stage: ai
  image: node:24-alpine3.21
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://gitlab.example.com
  before_script:
    - apk add --no-cache bash curl jq git aws-cli
    - curl -fsSL https://claude.ai/install.sh | bash
    - export PATH="$HOME/.local/bin:$PATH"
    - export AWS_WEB_IDENTITY_TOKEN_FILE="/tmp/oidc_token"
    - printf "%s" "$GITLAB_OIDC_TOKEN" > "$AWS_WEB_IDENTITY_TOKEN_FILE"
    - >
      aws sts assume-role-with-web-identity
      --role-arn "$AWS_ROLE_TO_ASSUME"
      --role-session-name "gitlab-claude-$(date +%s)"
      --web-identity-token "file://$AWS_WEB_IDENTITY_TOKEN_FILE"
      --duration-seconds 3600 > /tmp/aws_creds.json
    # AccessKeyId / SecretAccessKey / SessionToken を jq で取り出して export する
  variables:
    AWS_REGION: "us-west-2"
    CLAUDE_CODE_USE_BEDROCK: "1"

Bedrock のモデル ID には us.anthropic.claude-sonnet-4-6 のようにリージョンの接頭辞が付く点にも注意します。

Google Cloud の Agent Platform(Workload Identity Federation)

前提は、Agent Platform API を有効にしたプロジェクト、GitLab の OIDC を信頼する Workload Identity Federation、必要なロールだけを持つ専用サービスアカウントです。CI/CD 変数として GCP_WORKLOAD_IDENTITY_PROVIDER//iam.googleapis.com/ を除いたプロバイダのリソース名)、GCP_SERVICE_ACCOUNTGCP_PROJECT_IDCLOUD_ML_REGION(例: us-east5)を用意します。

ジョブは OIDC トークンをファイルに書き出し、それを credential_source として参照する external_account 形式の認証情報設定ファイルを生成します。そのファイルを GOOGLE_APPLICATION_CREDENTIALS に指定すると、Application Default Credentials 経由で Claude Code が認証情報を使えます。あわせて CLAUDE_CODE_USE_VERTEX: "1"ANTHROPIC_VERTEX_PROJECT_ID を設定します。サービスアカウントキーを保存する必要はありません。

いずれのプロバイダでも、Claude Code 側の設定は通常のクラウド利用と同じです。詳しくは Claude Code を Amazon Bedrock で使うClaude Code を Google Cloud の Agent Platform で動かすも参照してください。

運用のベストプラクティスとトラブルシューティング

設定とセキュリティ

コスト

費用は2種類かかります。Claude は自分の GitLab ランナー上で動くのでランナーの計算時間を消費し、各処理はプロンプトと応答の大きさに応じたトークンを消費します。公式の節約策は、具体的な @claude の指示で無駄なターンを減らす、--max-turns とジョブの timeout(例: timeout: 30m)を適切に設定する、並列実行数を制限する、の3つです。料金の考え方は コストを効果的に管理するも参考になります。

よくあるトラブル

症状確認すること
@claude に反応しないパイプラインが実際に起動しているか(手動・MR イベント・コメントの Webhook)。ANTHROPIC_API_KEY またはクラウドの変数があるか。コメントが /claude ではなく @claude になっているか。
コメントを書けない・MR を開けないCI_JOB_TOKEN の権限が足りているか(足りなければ api スコープの Project Access Token)。--allowedToolsmcp__gitlab が入っているか。ジョブが MR の文脈で動いているか、AI_FLOW_* 変数で十分な文脈を渡しているか。
認証エラーClaude API なら ANTHROPIC_API_KEY が有効か。Bedrock や Google Cloud なら OIDC/WIF の設定、ロールの引き受け、変数名、リージョンとモデルの提供状況。

使えるフラグや引数は Claude Code のバージョンで変わることがあるため、公式はジョブ内で claude --help を実行して確認するよう勧めています。ジョブごとに -p のプロンプトを変えれば、レビュー用・実装用・リファクタリング用といった使い分けもできます。

本記事は Anthropic 公式ドキュメント「Claude Code GitLab CI/CD」に基づく非公式の日本語解説です(確認日 2026-09-17)。この連携はベータ版で GitLab が保守しているため、最新の手順は公式ページで確認してください。