Comment utiliser Claude Code pour les flux de travail CI/CD

Ashley Goolam

Ashley Goolam

21 January 2026

Comment utiliser Claude Code pour les flux de travail CI/CD

Chaque pipeline de déploiement contient des tâches répétitives : valider les journaux de modifications (changelogs), vérifier les changements d'API cassants, générer les notes de version et coordonner les retours en arrière de services multiples. Claude Code transforme ces points de contrôle manuels en garde-fous automatisés et intelligents qui s'exécutent directement dans votre environnement CI/CD. Au lieu d'écrire des scripts bash fragiles, vous obtenez un agent de raisonnement qui comprend votre base de code, vos contrats d'API et votre historique de déploiement.

Pourquoi Claude Code a-t-il sa place dans votre pipeline CI/CD ?

Les scripts CI/CD traditionnels sont déterministes mais stupides. Ils exécutent grep pour les incréments de version, git diff pour la détection de changements et des expressions régulières statiques pour la validation d'API. Lorsque votre équipe refactorise un monorepo ou introduit un nouveau microservice, ces scripts échouent silencieusement. Claude Code apporte une compréhension sémantique : il sait ce qui constitue un changement cassant, peut déduire les dépendances de service à partir des chemins d'importation, et génère des plans de déploiement contextuels.

Le modèle d'intégration est simple : exécutez Claude Code comme une étape conteneurisée dans votre pipeline, fournissez-lui du contexte via des variables d'environnement, et faites-lui exécuter des compétences qui valident, génèrent ou coordonnent. L'agent retourne un JSON structuré que les étapes CI suivantes peuvent utiliser – faire échouer la build, déclencher un déploiement canary, ou publier un avertissement sur Slack.

💡
Vous voulez un excellent outil de test d'API qui génère une belle documentation d'API ?

Vous voulez une plateforme intégrée tout-en-un pour que votre équipe de développeurs travaille avec une productivité maximale ?

Apidog répond à toutes vos exigences et remplace Postman à un prix bien plus abordable !
button

Configuration de Claude Code dans les environnements CI/CD

Configuration du conteneur

Exécutez Claude Code dans un conteneur Docker avec un minimum de frais généraux :

# Dockerfile.claude-cicd
FROM node:20-alpine

# Install Claude Code CLI
RUN npm install -g @anthropic-ai/claude-code

# Set working directory
WORKDIR /workspace

# Copy project files
COPY . .

# Set environment variables for non-interactive mode
ENV ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY}"
ENV CLAUDE_CODE_CI_MODE=true
ENV CLAUDE_CODE_QUIET=true

# Default command runs a skill
ENTRYPOINT ["claude"]

Construisez et testez localement :

docker build -f Dockerfile.claude-cicd -t claude-cicd .
docker run -e ANTHROPIC_API_KEY=sk-ant-... claude-cicd --help
docker desktop

Intégration GitHub Actions

Créez un workflow réutilisable qui invoque Claude Code pour des tâches de validation spécifiques :

# .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  # Full history for change analysis

      - 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 "Breaking changes detected: ${{ fromJson(steps.parse.outputs.claude_result).details }}"
          exit 1

Appelez ce workflow depuis votre pipeline CI principal :

# .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 }}"}'

Intégration GitLab CI

Les blocs script de GitLab facilitent l'invocation de 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 "Breaking API changes detected: $(jq -r '.details' claude-output.json)"
        exit 1
      fi
  artifacts:
    reports:
      dotenv: claude-output.env
    paths:
      - claude-output.json

La section artifacts capture la sortie de Claude pour les tâches suivantes, permettant une logique de déploiement conditionnelle.

gitlab

Création d'une compétence Claude Code spécifique au CI/CD

Structure des compétences pour les tâches de pipeline

Une compétence CI/CD nécessite trois composants :

  1. Détection des changements : Analyser le diff git, les messages de commit ou les diffs de requêtes de fusion.
  2. Logique de validation : Appliquer les règles métier (gestion de version d'API, couverture de tests, analyse de sécurité).
  3. Génération d'actions : Produire des commandes de pipeline ou des raisons d'échec.

Créez la définition de la compétence :

mkdir -p ~/claude-skills/api-breaking-change-detector
cd ~/claude-skills/api-breaking-change-detector

Définition SKILL.md

---
name: api-breaking-change-detector
description: Detects breaking API changes in OpenAPI specs and TypeScript types
version: 1.0.0
author: CI/CD Team
mcp:
  transport: stdio
tools:
  detect-openapi-changes:
    description: Compare two OpenAPI specs and identify breaking changes
    parameters:
      baseSpec:
        type: string
        description: Path to base OpenAPI YAML/JSON file
        required: true
      headSpec:
        type: string
        description: Path to head OpenAPI YAML/JSON file
        required: true
      strictMode:
        type: boolean
        description: Treat optional-to-required changes as breaking
        default: true
  detect-typescript-changes:
    description: Compare TypeScript interfaces for breaking changes
    parameters:
      baseFiles:
        type: array
        items: { type: string }
        description: Glob pattern for base TypeScript files
        required: true
      headFiles:
        type: array
        items: { type: string }
        description: Glob pattern for head TypeScript files
        required: true
---

# API Breaking Change Detector Skill

This skill analyzes API contracts and type definitions to identify changes that could break consumers.

## Usage Examples

### OpenAPI Comparison
```bash
# In CI pipeline
claude --skill api-breaking-change-detector 
  --tool detect-openapi-changes 
  --params '{"baseSpec": "openapi/base.yaml", "headSpec": "openapi/head.yaml"}'

Comparaison TypeScript

claude --skill api-breaking-change-detector 
  --tool detect-typescript-changes 
  --params '{"baseFiles": ["src/types/v1/*.ts"], "headFiles": ["src/types/v2/*.ts"]}'

Format de retour

{
  "hasBreakingChanges": true,
  "details": [
    {
      "type": "field_removed",
      "location": "User.email",
      "severity": "breaking"
    }
  ],
  "recommendations": [
    "Revert field removal or add @deprecated marker"
  ]
}

Logique d'implémentation

Créez 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 `Field ${change.location} was removed. Add @deprecated first, then remove in next major version.`;
      case 'type_changed':
        return `Type of ${change.location} changed. Consider adding a new field with the new type.`;
      default:
        return `Review change: ${JSON.stringify(change)}`;
    }
  });
}

L'idée clé : Claude Code ne renvoie pas seulement du texte ; il renvoie des données structurées que les systèmes CI peuvent analyser et sur lesquelles ils peuvent agir.

Workflows CI/CD pratiques avec Claude Code

Workflow 1 : Exécuteur de tests intelligent

Au lieu d'exécuter tous les tests à chaque commit, exécutez uniquement les tests impactés par les fichiers modifiés.

# .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 }}

La compétence test-selector utilise l'analyse statique pour mapper les importations et déterminer quels tests couvrent le code modifié.

Workflow 2 : Génération automatisée de notes de version

Les changelogs basés sur les messages de commit standard manquent de contexte. Claude Code analyse les descriptions de PR, les changements de code et les références d'incidents :

# .github/workflows/release.yml
jobs:
  generate-notes:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      
      - name: Generate Release Notes
        run: |
          claude --skill release-notes-generator \
            --params "{\"fromTag\": \"${{ github.event.inputs.fromTag }}\", \"toTag\": \"${{ github.event.inputs.toTag }}\"}" \
            --output release-notes.md
      
      - name: Create GitHub Release
        uses: softprops/action-gh-release@v1
        with:
          body_path: release-notes.md
          tag_name: ${{ github.event.inputs.toTag }}

La compétence lit les messages de commit, les diffs et les problèmes liés pour produire des notes de version narratives avec des guides de migration.

Workflow 3 : Orchestration de l'analyse de sécurité

Exécutez plusieurs outils de sécurité et laissez Claude Code trier les résultats :

# .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 "Critical security issues found"
        exit 1
      fi
  artifacts:
    reports:
      security: triage-result.json

Claude Code corrèle les résultats, élimine les doublons et hiérarchise par exploitabilité, réduisant le bruit de 80 %.

Workflow 4 : Coordination du déploiement Canary

Coordonner une release canary sur plusieurs services :

// skills/canary-deployment/index.ts
export const tools = {
  'plan-canary': async (params: unknown) => {
    const { services, trafficSplit } = params;
    
    // Query service mesh for current state
    const meshState = await $fetch('http://mesh-api.internal/state');
    
    // Generate deployment sequence
    const plan = services.map(service => ({
      service,
      traffic: meshState[service].traffic * trafficSplit,
      healthChecks: [
        `/health/${service}`,
        `/metrics/${service}/error-rate`
      ],
      rollbackThreshold: 0.05 // 5% error rate triggers rollback
    }));
    
    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 }
      });
      
      // Wait for health checks
      const healthy = await waitForHealth(step.healthChecks, 30);
      if (!healthy) {
        throw new Error(`Service ${step.service} failed health checks`);
      }
    }
    
    return { success: true, servicesUpdated: plan.length };
  }
};

Le pipeline CI appelle plan-canary, examine le plan, puis appelle execute-canary avec des portes d'approbation manuelles.

Gestion des secrets et des permissions

Gestion des secrets

Ne codez jamais en dur les clés API dans le code des compétences. Utilisez les secrets du système CI :

# GitHub Actions
- name: Run Claude with Secrets
  run: claude --skill deploy-skill
  env:
    DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
    DATABASE_URL: ${{ secrets.DATABASE_URL }}

# In the skill
const deployToken = process.env.DEPLOY_TOKEN;
if (!deployToken) throw new Error('DEPLOY_TOKEN not set');

Moindre privilège

Exécutez Claude Code avec des permissions minimales. Dans GitLab :

# .gitlab-ci.yml
claude-job:
  script: ...
  before_script:
    - export ANTHROPIC_API_KEY=${CI_JOB_TOKEN_LIMITED}
  variables:
    GIT_STRATEGY: fetch  # No push access
    CLAUDE_CODE_READONLY: true

Cela empêche Claude de commettre accidentellement des commits ou de supprimer des branches.

Surveillance et observabilité

Enregistrer les décisions de Claude Code

Capturez le raisonnement pour les pistes d'audit :

// In skill implementation
export const tools = {
  'deploy-service': async (params) => {
    const reasoning = [];
    
    reasoning.push(`Analyzing commit ${params.commitHash}`);
    const risk = await assessRisk(params.commitHash);
    reasoning.push(`Risk level: ${risk.level}`);
    
    if (risk.level === 'high') {
      reasoning.push('Deployment blocked: High risk detected');
      return { approved: false, reasoning };
    }
    
    reasoning.push('Deployment approved: All checks passed');
    return { approved: true, reasoning };
  }
};

Stockez les journaux dans votre plateforme d'observabilité :

# Log to 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

Métriques à suivre

Dépannage de l'intégration CI/CD

Problème : Claude Code se bloque

Cause : En attente d'invites interactives.
Correction : Utilisez les drapeaux --quiet et --non-interactive :

claude --quiet --non-interactive --skill your-skill --params '{}'

Problème : Le serveur MCP ne démarre pas dans le conteneur

Cause : Dépendances manquantes ou mauvaise version de Node.
Correction : Construisez une image dédiée :

FROM node:20-alpine
WORKDIR /skill
COPY package*.json ./
RUN npm ci --only=production
COPY dist ./dist
CMD ["node", "dist/server.js"]

Problème : Limitation de débit par Anthropic

Cause : Trop d'appels API en parallèle.
Correction : Implémentez une file d'attente de requêtes :

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);
    });
  }
};

Problème : Compétences introuvables

Cause : Chemins relatifs dans la configuration MCP.
Correction : Utilisez des chemins absolus et clonez le dépôt des compétences en 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

Conclusion

Claude Code dans les pipelines CI/CD fait passer l'automatisation de scripts rigides à des agents intelligents qui comprennent votre base de code, vos architectures et vos règles métier. En conteneurisant Claude, en définissant des compétences spécialisées et en l'intégrant à GitHub Actions ou GitLab CI, vous créez des pipelines qui s'adaptent aux refactorisations, détectent les changements cassants subtils et génèrent des informations exploitables. Commencez par une seule compétence – la détection des changements d'API cassants – et développez-vous à mesure que votre équipe fait confiance à l'automatisation. L'investissement initial dans le développement de compétences est rentabilisé par une réduction du temps de révision manuelle et moins d'incidents de production.

Lorsque vos compétences interagissent avec des API internes, validez ces contrats avec Apidog pour vous assurer que vos pipelines pilotés par l'IA ne deviennent pas une source d'instabilité.

button

Pratiquez le Design-first d'API dans Apidog

Découvrez une manière plus simple de créer et utiliser des API