【Claude Code 連載 第38回】Claude Code GitLab CI/CD(gitlab-ci-cd)

スポンサーリンク
【Claude Code 連載 第38回】Claude Code GitLab CI/CD(gitlab-ci-cd) 用語解説
【Claude Code 連載 第38回】Claude Code GitLab CI/CD(gitlab-ci-cd)
この記事は約10分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

スポンサーリンク

背景

この連載では、Claude Codeの公式ドキュメントを1ページずつ読み解いていきます。公式ドキュメントは情報が網羅されている分、「結局どの機能を、どんな場面で使えばいいのか」は自分で考える必要があり、読むのに意外と時間がかかります。そこで、私が実務で使うために読み込んだ内容を「使う場面→実例コード」の順に整理して残していくことにしました。専門家の解説というより、一次情報を読んだ記録です。推測や動作を確認していない部分には、その都度そう書きます。

一言でいうと何か

Claude Code を GitLab の CI/CD パイプラインに組み込む統合です。第36回の GitHub Actions と対になるもので、issue・MR・レビュースレッドで @claude をメンションすると、GitLab CI/CD が分離ジョブで Claude Code を実行し、コンテキストを集めてプロンプトを組み立て、結果を MR 経由でコミットバックします。プロバイダーは Claude API・Amazon Bedrock・Google Cloud の Agent Platform から選べ、変更はすべて MR を通るためレビューと承認・ブランチ保護がそのまま効きます。なおこの統合はベータ版で、GitLab によって保守されており、サポートは GitLab 側の issue で受け付けられています。

どういう場面で役立つか

GitLab の issue や MR コメントから、実装・修正・MR 作成を任せたいとき。「この issue の説明どおり機能を実装して」「このダッシュボードの TypeError を直して」のように @claude に頼めば、コードベースを分析してブランチに書き込み、レビュー用の MR を開きます。

自前の GitLab パイプライン(GitLab ランナー)で Claude を回したいとき。.gitlab-ci.yml に1ジョブとマスク済み変数を足すだけで始められ、ブランチ保護と承認が AI 生成コードにも適用されます。管理サービスではなく自分の CI インフラで動かしたい場合の選択肢で、成果を MR に集約しつつ既存のパイプラインの中に組み込めます。

Bedrock や GCP を使い、データレジデンシーや調達要件を満たしつつ動かしたいとき。地域エンドポイントを選んでレイテンシ削減とデータ主権要件の両立ができます。

不要・向かないケース:GitHub 側なら GitHub Actions や自動 PR レビューの Code Review が対応します。この統合はベータで GitLab 保守のため、機能は変化しうる点に留意します。コストは GitLab ランナーのコンピュート分と API トークンの両面で発生するため、無制限に走らせる用途には注意が要ります。全体として、GitHub 版と同じ発想を GitLab のパイプラインに移した統合と捉えると分かりやすいです。

セットアップとジョブの実例

前提と仕組み

Claude Code は GitLab CI/CD で AI タスクを分離ジョブとして実行します。GitLab が選んだトリガー(例:@claude を含むコメント)をリッスンし、ジョブがスレッドとリポジトリからコンテキストを集め、プロンプトを構築して Claude Code を実行し、変更を MR に流します。プロバイダーは Claude API(SaaS)・Amazon Bedrock(IAM ベース、クロスリージョン可)・Google Cloud の Agent Platform(GCP ネイティブ、Workload Identity Federation)を抽象化して扱えます。各インタラクションは、厳格なネットワーク/ファイルシステムルールを持つコンテナで動き、Claude Code はワークスペーススコープの権限で書き込みを制限します。

クイックセットアップ(Claude API)

最速の方法は、ANTHROPIC_API_KEYSettings → CI/CD → Variables にマスク変数(必要に応じて保護)として追加し、.gitlab-ci.yml に最小ジョブを足すことです。

stages:
  - ai
claude:
  stage: ai
  image: node:24-alpine3.21
  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
  script:
    - /bin/gitlab-mcp-server || true
    - 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

rules はトリガー方法(手動実行・MR イベント・@claude コメントでの web/API トリガー)に合わせて調整します。before_scriptcurl -fsSL https://claude.ai/install.sh | bash により Claude Code を入れ、script では任意で GitLab MCP サーバーを起動し、claude -p にプロンプト(web/API トリガー時はコンテキストペイロードの AI_FLOW_INPUT)を渡します。ジョブと変数を足したら、CI/CD → Pipelines から手動実行するか MR からトリガーしてテストします。

手動セットアップとメンション駆動トリガー

本番向けのより制御されたセットアップでは、まずプロバイダーアクセスを設定します(Claude API なら ANTHROPIC_API_KEY をマスク変数に、Bedrock なら AWS OIDC と IAM ロール、GCP なら Workload Identity Federation)。次に GitLab API 操作用の認証として既定の CI_JOB_TOKEN を使うか、api スコープの Project Access Token を作って GITLAB_ACCESS_TOKEN(マスク)に保存します。そのうえで .gitlab-ci.yml にジョブを追加し、必要ならメンション駆動トリガーを有効化します(プロジェクト webhook に「Comments(notes)」を追加し、コメントに @claude が含まれるときにリスナーがパイプライントリガー API を AI_FLOW_INPUT/AI_FLOW_CONTEXT などの変数付きで呼ぶ構成)。

@claude の使い方

issue コメントや MR ディスカッションで、先頭に指示を書きます。

@claude implement this feature based on the issue description
@claude suggest a concrete approach to cache the results of this API call
@claude fix the TypeError in the user dashboard component

Claude は issue とコードベースを分析して MR を開いたり、キャッシュ実装を提案して MR を更新したり、バグを特定して修正しブランチ更新や新規 MR を行ったりします。このほか、パフォーマンス低下を分析して最適化を提案する、ブランチに直接機能を実装して MR を開く、フォローアップコメントに応答して要求された変更を反復する、といった使い方も想定されています。いずれも成果は MR という形にまとまるため、通常のレビュー手順にそのまま乗せられます。

Amazon Bedrock / Google Cloud での実行

エンタープライズでは同じ開発者体験のまま Bedrock/GCP で動かせます。Bedrock は、Claude モデルへのアクセスを持つ AWS アカウント、AWS IAM に OIDC ID プロバイダーとして構成した GitLab、Bedrock 権限と GitLab プロジェクト/refs に絞った信頼ポリシーを持つ IAM ロール、そして AWS_ROLE_TO_ASSUME/AWS_REGION の CI/CD 変数が必要です。GCP は、Agent Platform API を有効にした GCP プロジェクト、GitLab OIDC を信頼する Workload Identity Federation、必要ロールのみの専用サービスアカウント、GCP_WORKLOAD_IDENTITY_PROVIDER/GCP_SERVICE_ACCOUNT/CLOUD_ML_REGION の変数が必要です。いずれも静的キーを保存せず OIDC/WIF でジョブトークンを一時認証情報と交換する構成で、ジョブ内で aws sts assume-role-with-web-identitygcloud auth login --cred-file を使います(Bedrock のモデル ID は us.anthropic.claude-sonnet-4-6 のようにリージョンプレフィックス付き)。これらの完全なジョブ YAML は長いため、公式ページの構成例を参照してください。

セキュリティ・コスト・パラメータの要点

API キーやクラウド認証情報はリポジトリにコミットせず、必ず GitLab CI/CD 変数を使い、可能な限りプロバイダー固有の OIDC(長期キーなし)にし、ジョブ権限とネットワーク出力を絞り、Claude の MR も他の貢献者と同じようにレビューします。各ジョブはネットワーク制限された分離コンテナで動き、変更は MR を通るのでレビュアーが全 diff を確認でき、承認・ブランチ保護が AI 生成コードにも適用されます。コストは GitLab ランナー時間と API トークンの両面で、@claude を具体的にする・max_turns やジョブタイムアウトを適切に設定する・並列実行を制限する、といった最適化が推奨されます。よく使う入力は prompt/prompt_file(-p かファイルで指示)、max_turnstimeout_minutesANTHROPIC_API_KEY(Claude API 必須、Bedrock/GCP では未使用)などで、正確なフラグはバージョンにより異なるためジョブで claude --help を確認します。@claude に応答しないときは、パイプラインがトリガーされているか・CI/CD 変数が存在しマスク解除されているか・コメントが /claude でなく @claude か、を確認します。

まとめ

GitLab CI/CD 統合は、@claude メンションから実装・修正・MR 作成までを GitLab のパイプラインで回せる、GitHub Actions の GitLab 版です(ベータ、GitLab 保守)。導入は Claude API なら ANTHROPIC_API_KEY をマスク変数に入れて .gitlab-ci.yml に1ジョブ追加が最速で、curl ...install.sh | bash で Claude Code を入れ、claude -p ... --permission-mode acceptEdits --allowedTools "... mcp__gitlab" を実行します。Bedrock/GCP では OIDC/WIF で静的キーなしに認証し、変更は MR を通るためレビューと承認・ブランチ保護がそのまま効きます。コストは GitLab ランナー時間と API トークンの両面、という点を押さえておくとよいでしょう。

次回は、残る連携ページ(GitHub Enterprise Server など)や Channels・/goal・Agent SDK などの未執筆ページ、あるいは長く保留している引き継ぎ課題(第5回欠番の補完・第1/2回の照合)に着手する予定です。


この記事は執筆時点の公式ドキュメントに基づいています。最新の情報は必ず公式ドキュメントをご確認ください。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました