Como Usar Claude Code para CI/CD: Automatize Seus Workflows

Ashley Goolam

Ashley Goolam

21 janeiro 2026

Como Usar Claude Code para CI/CD: Automatize Seus Workflows

Todo pipeline de deploy contém tarefas repetitivas: validar changelogs, verificar mudanças de API que quebram a compatibilidade, gerar notas de lançamento e coordenar rollbacks de múltiplos serviços. O Claude Code transforma esses pontos de verificação manuais em proteções automatizadas e inteligentes que são executadas diretamente no seu ambiente de CI/CD. Em vez de escrever scripts bash frágeis, você obtém um agente de raciocínio que entende sua base de código, contratos de API e histórico de deploy.

Por que o Claude Code Deve Estar no Seu Pipeline de CI/CD?

Scripts de CI/CD tradicionais são determinísticos, mas ingênuos. Eles executam grep para aumentos de versão, git diff para detecção de mudanças e regex estático para validação de API. Quando sua equipe refatora um monorepo ou introduz um novo microsserviço, esses scripts falham silenciosamente. O Claude Code traz compreensão semântica: ele sabe o que constitui uma mudança que quebra a compatibilidade, pode inferir dependências de serviço a partir de caminhos de importação e gera planos de deploy contextuais.

O padrão de integração é simples: execute o Claude Code como uma etapa containerizada no seu pipeline, forneça contexto através de variáveis de ambiente e faça com que ele execute habilidades que validam, geram ou coordenam. O agente retorna JSON estruturado sobre o qual as etapas subsequentes do CI podem atuar — falhar a build, acionar um deploy canary ou postar um aviso no Slack.

💡
Quer uma excelente ferramenta de Teste de API que gera documentação de API bonita?

Quer uma plataforma integrada e completa para sua Equipe de Desenvolvedores trabalharem juntos com máxima produtividade?

O Apidog entrega todas as suas demandas e substitui o Postman por um preço muito mais acessível!
botão

Configurando o Claude Code em Ambientes de CI/CD

Configuração do Contêiner

Execute o Claude Code em um contêiner Docker com sobrecarga mínima:

# 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"]

Compile e teste localmente:

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

Integração com GitHub Actions

Crie um workflow reutilizável que invoca o Claude Code para tarefas de validação específicas:

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

Chame este workflow a partir do seu 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 }}"}'

Integração com GitLab CI

Os blocos `script` do GitLab tornam a invocação do Claude Code direta:

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

A seção `artifacts` captura a saída do Claude para trabalhos subsequentes, permitindo lógica de deploy condicional.

gitlab

Construindo uma Skill de Claude Code Específica para CI/CD

Estrutura da Skill para Tarefas de Pipeline

Uma skill de CI/CD precisa de três componentes:

  1. Detecção de mudanças: Analisar git diff, mensagens de commit ou diffs de merge request
  2. Lógica de validação: Aplicar regras de negócio (versionamento de API, cobertura de teste, varredura de segurança)
  3. Geração de ações: Produzir comandos de pipeline ou razões de falha

Crie a definição da skill:

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

Definição do SKILL.md

---
name: api-breaking-change-detector
description: Detecta mudanças de API que quebram a compatibilidade em especificações OpenAPI e tipos TypeScript
version: 1.0.0
author: Equipe de CI/CD
mcp:
  transport: stdio
tools:
  detect-openapi-changes:
    description: Compara duas especificações OpenAPI e identifica mudanças que quebram a compatibilidade
    parameters:
      baseSpec:
        type: string
        description: Caminho para o arquivo base OpenAPI YAML/JSON
        required: true
      headSpec:
        type: string
        description: Caminho para o arquivo OpenAPI YAML/JSON mais recente
        required: true
      strictMode:
        type: boolean
        description: Trata mudanças de opcional para obrigatório como quebra de compatibilidade
        default: true
  detect-typescript-changes:
    description: Compara interfaces TypeScript para mudanças que quebram a compatibilidade
    parameters:
      baseFiles:
        type: array
        items: { type: string }
        description: Padrão glob para arquivos TypeScript base
        required: true
      headFiles:
        type: array
        items: { type: string }
        description: Padrão glob para arquivos TypeScript mais recentes
        required: true
---

# Skill de Detecção de Mudanças de API que Quebram a Compatibilidade

Esta skill analisa contratos de API e definições de tipo para identificar mudanças que poderiam quebrar consumidores.

## Exemplos de Uso

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

Comparação TypeScript

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

Formato de Retorno

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

Lógica de Implementação

Crie 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 `O campo ${change.location} foi removido. Adicione @deprecated primeiro, depois remova na próxima versão principal.`;
      case 'type_changed':
        return `O tipo de ${change.location} mudou. Considere adicionar um novo campo com o novo tipo.`;
      default:
        return `Revisar mudança: ${JSON.stringify(change)}`;
    }
  });
}

A principal sacada: o Claude Code não apenas retorna texto; ele retorna dados estruturados que os sistemas de CI podem analisar e sobre os quais podem atuar.

Workflows Práticos de CI/CD com Claude Code

Workflow 1: Executor de Testes Inteligente

Em vez de executar todos os testes em cada commit, execute apenas os testes afetados pelos arquivos modificados.

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

A skill `test-selector` usa análise estática para mapear imports e determinar quais testes cobrem o código modificado.

Workflow 2: Geração Automatizada de Notas de Lançamento

Changelogs baseados em mensagens de commit padrão perdem o contexto. O Claude Code analisa descrições de PR, mudanças de código e referências de issues:

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

A skill lê mensagens de commit, diffs e issues vinculadas para produzir notas de lançamento narrativas com guias de migração.

Workflow 3: Orquestração de Verificação de Segurança

Execute múltiplas ferramentas de segurança e faça com que o Claude Code categorize as descobertas:

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

O Claude Code correlaciona descobertas, elimina duplicatas e prioriza por explorabilidade, reduzindo o ruído em 80%.

Workflow 4: Coordenação de Deploy Canary

// skills/canary-deployment/index.ts
export const tools = {
  'plan-canary': async (params: unknown) => {
    const { services, trafficSplit } = params;
    
    // Consulta a service mesh para o estado atual
    const meshState = await $fetch('http://mesh-api.internal/state');
    
    // Gera a sequência de deploy
    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 }
      });
      
      // Aguarda as verificações de saúde
      const healthy = await waitForHealth(step.healthChecks, 30);
      if (!healthy) {
        throw new Error(`Service ${step.service} failed health checks`);
      }
    }
    
    return { success: true, servicesUpdated: plan.length };
  }
};

O pipeline de CI chama `plan-canary`, revisa o plano e, em seguida, chama `execute-canary` com aprovações manuais.

Gerenciando Segredos e Permissões

Gerenciamento de Segredos

Nunca codifique chaves de API diretamente no código da skill. Use os segredos do sistema 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 não definido');

Menor Privilégio

Execute o Claude Code com o mínimo de permissões. No 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

Isso impede que o Claude faça commits acidentalmente ou delete branches.

Monitoramento e Observabilidade

Registrar Decisões do Claude Code

Capture o raciocínio para trilhas de auditoria:

// In skill implementation
export const tools = {
  'deploy-service': async (params) => {
    const reasoning = [];
    
    reasoning.push(`Analisando commit ${params.commitHash}`);
    const risk = await assessRisk(params.commitHash);
    reasoning.push(`Nível de risco: ${risk.level}`);
    
    if (risk.level === 'high') {
      reasoning.push('Deploy bloqueado: Alto risco detectado');
      return { approved: false, reasoning };
    }
    
    reasoning.push('Deploy aprovado: Todas as verificações passaram');
    return { approved: true, reasoning };
  }
};

Armazene os logs em sua plataforma de observabilidade:

# 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étricas para Rastrear

Solução de Problemas na Integração CI/CD

Problema: Claude Code Trava

Causa: Esperando por prompts interativos.
Correção: Use os flags --quiet e --non-interactive:

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

Problema: Servidor MCP Falha ao Iniciar no Contêiner

Causa: Dependências ausentes ou versão errada do Node.
Correção: Construa uma imagem dedicada:

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

Problema: Limitação de Taxa (Rate Limiting) pela Anthropic

Causa: Muitas chamadas de API em jobs paralelos.
Correção: Implemente enfileiramento de requisições:

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

Problema: Skills Não Encontradas

Causa: Caminhos relativos na configuração MCP.
Correção: Use caminhos absolutos e faça checkout do repositório de skills no 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

Conclusão

O Claude Code em pipelines de CI/CD move a automação de scripts rígidos para agentes inteligentes que entendem sua base de código, arquiteturas e regras de negócio. Ao containerizar o Claude, definir skills especializadas e integrar com GitHub Actions ou GitLab CI, você cria pipelines que se adaptam a refatorações, capturam mudanças sutis que quebram a compatibilidade e geram insights acionáveis. Comece com uma única skill — detecção de mudanças de API que quebram a compatibilidade — e expanda à medida que sua equipe confia na automação. O investimento inicial no desenvolvimento de skills rende dividendos na redução do tempo de revisão manual e em menos incidentes de produção.

Quando suas skills interagem com APIs internas, valide esses contratos com o Apidog para garantir que seus pipelines baseados em IA não se tornem uma fonte de instabilidade.

botão

Pratique o design de API no Apidog

Descubra uma forma mais fácil de construir e usar APIs