すべてのデプロイメントパイプラインには、チェンジログの検証、APIの破壊的変更の確認、リリースノートの生成、複数のサービスにわたるロールバックの調整など、反復的なタスクが含まれています。Claude Codeは、これらの手動のチェックポイントを、CI/CD環境で直接実行される自動化されたインテリジェントなガードレールに変換します。脆弱なbashスクリプトを書く代わりに、コードベース、APIコントラクト、デプロイメント履歴を理解する推論エージェントが得られます。
なぜClaude CodeはCI/CDパイプラインに不可欠なのか?
従来のCI/CDスクリプトは決定的ですが、賢くありません。バージョンアップのためにgrepを実行し、変更検出のためにgit diffを実行し、API検証のために静的な正規表現を使用します。チームがモノレポをリファクタリングしたり、新しいマイクロサービスを導入したりすると、これらのスクリプトはサイレントに破損します。Claude Codeはセマンティックな理解をもたらします。破壊的変更が何であるかを知っており、インポートパスからサービス依存関係を推測し、状況に応じたデプロイメント計画を生成できます。
統合パターンは簡単です。Claude Codeをパイプラインのコンテナ化されたステップとして実行し、環境変数を通じてコンテキストを与え、検証、生成、または調整するスキルを実行させます。エージェントは、後続のCIステップが操作できる構造化されたJSONを返します。これにより、ビルドを失敗させたり、カナリアデプロイメントをトリガーしたり、Slackに警告を投稿したりできます。
開発チームが最大限の生産性で協業できる、統合されたオールインワンのプラットフォームをお探しですか?
Apidogは、お客様のすべての要求に応え、Postmanをはるかに手頃な価格で置き換えます!
CI/CD環境でのClaude Codeのセットアップ
コンテナ構成
最小限のオーバーヘッドでClaude CodeをDockerコンテナで実行します。
# Dockerfile.claude-cicd
FROM node:20-alpine
# Claude Code CLIをインストール
RUN npm install -g @anthropic-ai/claude-code
# 作業ディレクトリを設定
WORKDIR /workspace
# プロジェクトファイルをコピー
COPY . .
# 非インタラクティブモード用の環境変数を設定
ENV ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY}"
ENV CLAUDE_CODE_CI_MODE=true
ENV CLAUDE_CODE_QUIET=true
# デフォルトコマンドでスキルを実行
ENTRYPOINT ["claude"]
ローカルでビルドしてテストします。
docker build -f Dockerfile.claude-cicd -t claude-cicd .
docker run -e ANTHROPIC_API_KEY=sk-ant-... claude-cicd --help

GitHub Actions統合
特定の検証タスクのためにClaude Codeを呼び出す再利用可能なワークフローを作成します。
# .github/workflows/claude-validation.yml
name: Claude Code Validation
on:
workflow_call:
inputs:
skill_name:
required: true
type: string
parameters:
required: false
type: string
default: '{}'
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 変更分析のための全履歴
- name: Run Claude Code Skill
uses: docker://claude-cicd:latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
args: |
--skill "${{ inputs.skill_name }}" \
--params '${{ inputs.parameters }}' \
--output /workspace/claude-output.json
- name: Parse Claude Output
id: parse
run: |
echo "claude_result=$(cat /workspace/claude-output.json)" >> $GITHUB_OUTPUT
- name: Fail on Breaking Changes
if: fromJson(steps.parse.outputs.claude_result).hasBreakingChanges
run: |
echo "破壊的変更が検出されました: ${{ fromJson(steps.parse.outputs.claude_result).details }}"
exit 1
このワークフローをメインのCIパイプラインから呼び出します。
# .github/workflows/ci.yml
jobs:
check-breaking-changes:
uses: ./.github/workflows/claude-validation.yml
with:
skill_name: "api-breaking-change-detector"
parameters: '{"baseBranch": "main", "changedFiles": "${{ needs.changes.outputs.changed_files }}"}'
GitLab CI統合
GitLabの scriptブロックにより、Claude Codeの呼び出しが簡単になります。
# .gitlab-ci.yml
stages:
- validate
- test
- deploy
claude:validate:api:
stage: validate
image: claude-cicd:latest
variables:
ANTHROPIC_API_KEY: $ANTHROPIC_API_KEY
script:
- claude --skill api-breaking-change-detector
--params "{\"baseBranch\": \"$CI_DEFAULT_BRANCH\", \"changedFiles\": \"$CI_COMMIT_CHANGED_FILES\"}"
--output claude-output.json
- |
if jq -e '.hasBreakingChanges' claude-output.json > /dev/null; then
echo "APIの破壊的変更が検出されました: $(jq -r '.details' claude-output.json)"
exit 1
fi
artifacts:
reports:
dotenv: claude-output.env
paths:
- claude-output.json
artifactsセクションは、後続のジョブのためにClaudeの出力をキャプチャし、条件付きデプロイメントロジックを可能にします。

CI/CD固有のClaude Codeスキルの構築
パイプラインタスクのスキル構造
CI/CDスキルには、3つのコンポーネントが必要です。
- 変更検出: git diff、コミットメッセージ、またはマージリクエストの差分を分析します。
- 検証ロジック: ビジネスルール(APIバージョン管理、テストカバレッジ、セキュリティスキャン)を適用します。
- アクション生成: パイプラインコマンドまたは失敗理由を生成します。
スキル定義を作成します。
mkdir -p ~/claude-skills/api-breaking-change-detector
cd ~/claude-skills/api-breaking-change-detector
SKILL.md定義
---
name: api-breaking-change-detector
description: OpenAPIスペックとTypeScript型における破壊的API変更を検出します
version: 1.0.0
author: CI/CD Team
mcp:
transport: stdio
tools:
detect-openapi-changes:
description: 2つのOpenAPIスペックを比較し、破壊的変更を特定します
parameters:
baseSpec:
type: string
description: ベースとなるOpenAPI YAML/JSONファイルへのパス
required: true
headSpec:
type: string
description: ヘッダーとなるOpenAPI YAML/JSONファイルへのパス
required: true
strictMode:
type: boolean
description: オプションから必須への変更を破壊的として扱います
default: true
detect-typescript-changes:
description: TypeScriptインターフェースの破壊的変更を比較します
parameters:
baseFiles:
type: array
items: { type: string }
description: ベースとなるTypeScriptファイルのグロブパターン
required: true
headFiles:
type: array
items: { type: string }
description: ヘッダーとなるTypeScriptファイルのグロブパターン
required: true
---
# API破壊的変更検出スキル
このスキルは、APIコントラクトと型定義を分析し、コンシューマを破壊する可能性のある変更を特定します。
## 使用例
### OpenAPI比較
```bash
# CIパイプラインで
claude --skill api-breaking-change-detector
--tool detect-openapi-changes
--params '{"baseSpec": "openapi/base.yaml", "headSpec": "openapi/head.yaml"}'
TypeScript比較
claude --skill api-breaking-change-detector
--tool detect-typescript-changes
--params '{"baseFiles": ["src/types/v1/*.ts"], "headFiles": ["src/types/v2/*.ts"]}'
戻り値のフォーマット
{
"hasBreakingChanges": true,
"details": [
{
"type": "field_removed",
"location": "User.email",
"severity": "breaking"
}
],
"recommendations": [
"フィールドの削除を元に戻すか、@deprecatedマーカーを追加する"
]
}
実装ロジック
index.tsを作成します。
import { z } from 'zod';
import { parseOpenAPI } from './openapi-parser';
import { parseTypeScript } from './typescript-parser';
import { diffSchemas } from './diff-engine';
const OpenAPIParams = z.object({
baseSpec: z.string(),
headSpec: z.string(),
strictMode: z.boolean().default(true)
});
const TypeScriptParams = z.object({
baseFiles: z.array(z.string()),
headFiles: z.array(z.string())
});
export const tools = {
'detect-openapi-changes': async (params: unknown) => {
const { baseSpec, headSpec, strictMode } = OpenAPIParams.parse(params);
const base = await parseOpenAPI(baseSpec);
const head = await parseOpenAPI(headSpec);
const changes = diffSchemas(base, head, { strict: strictMode });
return {
hasBreakingChanges: changes.breaking.length > 0,
details: changes.breaking,
recommendations: generateRecommendations(changes)
};
},
'detect-typescript-changes': async (params: unknown) => {
const { baseFiles, headFiles } = TypeScriptParams.parse(params);
const base = await parseTypeScript(baseFiles);
const head = await parseTypeScript(headFiles);
const changes = diffSchemas(base, head);
return {
hasBreakingChanges: changes.breaking.length > 0,
details: changes.breaking,
recommendations: generateRecommendations(changes)
};
}
};
function generateRecommendations(changes: any) {
return changes.breaking.map((change: any) => {
switch (change.type) {
case 'field_removed':
return `フィールド ${change.location} が削除されました。まず@deprecatedマーカーを追加し、次のメジャーバージョンで削除してください。`;
case 'type_changed':
return `フィールド ${change.location} の型が変更されました。新しい型で新しいフィールドを追加することを検討してください。`;
default:
return `変更を確認してください: ${JSON.stringify(change)}`;
}
});
}
重要な洞察:Claude Codeはテキストを返すだけでなく、CIシステムが解析して操作できる構造化されたデータを返します。
Claude Codeによる実用的なCI/CDワークフロー
ワークフロー1:インテリジェントなテストランナー
すべてのコミットですべてのテストを実行する代わりに、変更されたファイルによって影響を受けるテストのみを実行します。
# .github/workflows/intelligent-tests.yml
jobs:
determine-tests:
runs-on: ubuntu-latest
outputs:
test-matrix: ${{ steps.claude.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- id: claude
run: |
CHANGED_FILES=$(git diff --name-only HEAD~1)
echo "changed_files=$CHANGED_FILES" >> $GITHUB_OUTPUT
MATRIX=$(claude --skill test-selector \
--params "{\"changedFiles\": \"$CHANGED_FILES\", \"testPattern\": \"**/*.test.ts\"}" \
--output - | jq -c '.testMatrix')
echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
run-tests:
needs: determine-tests
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJson(needs.determine-tests.outputs.test-matrix) }}
steps:
- uses: actions/checkout@v4
- run: npm test ${{ matrix.testFile }}
test-selectorスキルは、静的分析を使用してインポートをマッピングし、変更されたコードをカバーするテストを決定します。
ワークフロー2:自動化されたリリースノート生成
標準のコミットメッセージベースのチェンジログではコンテキストが不足します。Claude CodeはPRの説明、コード変更、問題参照を分析します。
# .github/workflows/release.yml
jobs:
generate-notes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: リリースノートを生成
run: |
claude --skill release-notes-generator \
--params "{\"fromTag\": \"${{ github.event.inputs.fromTag }}\", \"toTag\": \"${{ github.event.inputs.toTag }}\"}" \
--output release-notes.md
- name: GitHubリリースを作成
uses: softprops/action-gh-release@v1
with:
body_path: release-notes.md
tag_name: ${{ github.event.inputs.toTag }}
このスキルは、コミットメッセージ、差分、リンクされた問題を読み取り、移行ガイドを含む記述的なリリースノートを生成します。
ワークフロー3:セキュリティスキャンオーケストレーション
複数のセキュリティツールを実行し、Claude Codeに検出結果をトリアージさせます。
# .gitlab-ci.yml
security-scan:
stage: validate
script:
- trivy image --format json $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA > trivy.json
- sonar-scanner -Dsonar.analysis.mode=preview > sonar.json
- claude --skill security-triage \
--params "{\"trivyReport\": \"trivy.json\", \"sonarReport\": \"sonar.json\"}" \
--output triage-result.json
- |
if jq -e '.criticalIssues > 0' triage-result.json; then
echo "重大なセキュリティ問題が検出されました"
exit 1
fi
artifacts:
reports:
security: triage-result.json
Claude Codeは、検出結果を関連付け、重複を排除し、悪用可能性によって優先順位を付け、ノイズを80%削減します。
ワークフロー4:カナリアデプロイメント調整
複数のサービスにわたるカナリアリリースを調整します。
// skills/canary-deployment/index.ts
export const tools = {
'plan-canary': async (params: unknown) => {
const { services, trafficSplit } = params;
// 現在の状況についてサービスメッシュに問い合わせる
const meshState = await $fetch('http://mesh-api.internal/state');
// デプロイメントシーケンスを生成
const plan = services.map(service => ({
service,
traffic: meshState[service].traffic * trafficSplit,
healthChecks: [
`/health/${service}`,
`/metrics/${service}/error-rate`
],
rollbackThreshold: 0.05 // 5%のエラー率でロールバックをトリガー
}));
return { plan, estimatedDuration: `${services.length * 5} minutes` };
},
'execute-canary': async (params: unknown) => {
const { plan } = params;
for (const step of plan) {
await $fetch(`http://mesh-api.internal/traffic/${step.service}`, {
method: 'POST',
body: { traffic: step.traffic }
});
// ヘルスチェックを待機
const healthy = await waitForHealth(step.healthChecks, 30);
if (!healthy) {
throw new Error(`サービス ${step.service} がヘルスチェックに失敗しました`);
}
}
return { success: true, servicesUpdated: plan.length };
}
};
CIパイプラインはplan-canaryを呼び出し、計画を確認した後、手動承認ゲートとともにexecute-canaryを呼び出します。
シークレットと権限の管理
シークレット管理
APIキーをスキルコードにハードコードしないでください。CIシステムのシークレットを使用します。
# GitHub Actions
- name: シークレットを使用してClaudeを実行
run: claude --skill deploy-skill
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
# スキル内
const deployToken = process.env.DEPLOY_TOKEN;
if (!deployToken) throw new Error('DEPLOY_TOKENが設定されていません');
最小権限
最小限の権限でClaude Codeを実行します。GitLabの場合:
# .gitlab-ci.yml
claude-job:
script: ...
before_script:
- export ANTHROPIC_API_KEY=${CI_JOB_TOKEN_LIMITED}
variables:
GIT_STRATEGY: fetch # プッシュアクセスなし
CLAUDE_CODE_READONLY: true
これにより、Claudeが誤ってコミットをプッシュしたり、ブランチを削除したりするのを防ぎます。
モニタリングと可観測性
Claude Codeの決定をログに記録する
監査証跡のために推論をキャプチャします。
// スキル実装内
export const tools = {
'deploy-service': async (params) => {
const reasoning = [];
reasoning.push(`コミット ${params.commitHash} を分析中`);
const risk = await assessRisk(params.commitHash);
reasoning.push(`リスクレベル: ${risk.level}`);
if (risk.level === 'high') {
reasoning.push('デプロイメントがブロックされました: 高リスクが検出されました');
return { approved: false, reasoning };
}
reasoning.push('デプロイメントが承認されました: すべてのチェックが合格しました');
return { approved: true, reasoning };
}
};
ログを可観測性プラットフォームに保存します。
# Loki/Elasticsearchにログを記録
- run: |
claude --skill deploy-service ... | \
jq -c '{level: "info", message: "Claude decision", data: .}' | \
promtail --client.url=http://loki:3100/loki/api/v1/push
追跡するメトリック
- 呼び出し回数: 各スキルがどれだけ頻繁に実行されるか
- 成功率: 成功した実行の割合
- トークン使用量: CIジョブあたりのコスト
- 決定分布: ブロックされたビルドと承認されたビルドの数
CI/CD統合のトラブルシューティング
問題:Claude Codeがハングする
原因: 対話型プロンプトを待機している。
修正: --quietと--non-interactiveフラグを使用する。
claude --quiet --non-interactive --skill your-skill --params '{}'
問題:MCPサーバーがコンテナで起動に失敗する
原因: 依存関係の欠如または間違ったNodeバージョン。
修正: 専用のイメージをビルドする。
FROM node:20-alpine
WORKDIR /skill
COPY package*.json ./
RUN npm ci --only=production
COPY dist ./dist
CMD ["node", "dist/server.js"]
問題:Anthropicによるレート制限
原因: 並行ジョブでAPI呼び出しが多すぎる。
修正: リクエストキューを実装する。
import PQueue from 'p-queue';
const queue = new PQueue({ concurrency: 1 });
export const tools = {
'safe-api-call': async (params) => {
return queue.add(async () => {
return await callAnthropicAPI(params);
});
}
};
問題:スキルが見つからない
原因: MCP設定内の相対パス。
修正: 絶対パスを使用し、CIでスキルリポジトリをチェックアウトする。
- uses: actions/checkout@v4
with:
repository: your-org/claude-skills
path: .claude-skills
- run: |
echo "{
\"mcpServers\": {
\"api-validator\": {
\"command\": \"node\",
\"args\": [\"$PWD/.claude-skills/api-validator/dist/index.js\"]
}
}
}" > ~/.config/claude-code/config.json
結論
CI/CDパイプラインにおけるClaude Codeは、自動化を厳格なスクリプトから、コードベース、アーキテクチャ、ビジネスルールを理解するインテリジェントエージェントへと移行させます。Claudeをコンテナ化し、専門的なスキルを定義し、GitHub ActionsまたはGitLab CIと統合することで、リファクタリングに適応し、微妙な破壊的変更を検出し、実用的な洞察を生成するパイプラインを作成できます。まず1つのスキル(API破壊的変更検出など)から始め、チームが自動化を信頼するにつれて拡張してください。スキル開発への初期投資は、手動レビュー時間の短縮と本番環境でのインシデントの減少という形で報われます。
スキルが内部APIと対話する場合、Apidogでそれらのコントラクトを検証し、AI駆動のパイプラインが不安定さの原因にならないようにしてください。
