CI/CD İş Akışları İçin Claude Code Nasıl Kullanılır

Ashley Goolam

Ashley Goolam

21 January 2026

CI/CD İş Akışları İçin Claude Code Nasıl Kullanılır

Her dağıtım hattı tekrarlayan görevler içerir: değişiklik günlüklerini doğrulamak, API'deki bozucu değişiklikleri kontrol etmek, sürüm notları oluşturmak ve çoklu hizmet geri alımlarını koordine etmek. Claude Code, bu manuel kontrol noktalarını doğrudan CI/CD ortamınızda çalışan otomatik, akıllı koruyuculara dönüştürür. Kırılgan bash betikleri yazmak yerine, kod tabanınızı, API sözleşmelerinizi ve dağıtım geçmişinizi anlayan bir akıl yürütme aracısı elde edersiniz.

Claude Code Neden CI/CD Hattınızda Olmalı?

Geleneksel CI/CD betikleri deterministiktir ancak akılsızdır. Sürüm artışları için grep, değişiklik tespiti için git diff ve API doğrulaması için statik regex çalıştırırlar. Ekibiniz bir monorepo'yu yeniden düzenlediğinde veya yeni bir mikro hizmet tanıttığında, bu betikler sessizce bozulur. Claude Code anlamsal anlayış getirir: bozucu bir değişikliğin ne olduğunu bilir, içe aktarma yollarından hizmet bağımlılıklarını çıkarabilir ve bağlamsal dağıtım planları oluşturur.

Entegrasyon deseni basittir: Claude Code'u hattınızda kapsayıcılı bir adım olarak çalıştırın, ortam değişkenleri aracılığıyla ona bağlam sağlayın ve doğrula, oluştur veya koordine et yeteneklerini yürütmesini sağlayın. Aracı, sonraki CI adımlarının üzerinde işlem yapabileceği yapılandırılmış JSON döndürür—derlemeyi başarısız kılma, bir canary dağıtımı tetikleme veya Slack'e bir uyarı gönderme gibi.

💡
Harika API Dokümantasyonu oluşturan mükemmel bir API Test aracı mı istiyorsunuz?

Geliştirici Ekibinizin maksimum üretkenlikle birlikte çalışması için entegre, Hepsi Bir Arada bir platform mu istiyorsunuz?

Apidog tüm taleplerinizi karşılar ve Postman'ı çok daha uygun bir fiyata değiştirir!
button

CI/CD Ortamlarında Claude Code Kurulumu

Kapsayıcı Yapılandırması

Claude Code'u minimum ek yük ile bir Docker kapsayıcısında çalıştırın:

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

Yerel olarak derleyin ve test edin:

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

GitHub Actions Entegrasyonu

Belirli doğrulama görevleri için Claude Code'u çağıran yeniden kullanılabilir bir iş akışı oluşturun:

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

Bu iş akışını ana CI hattınızdan çağırın:

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

GitLab’ın `script` blokları, Claude Code çağrısını kolaylaştırır:

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

`artifacts` bölümü, Claude'un çıktısını sonraki işler için yakalar ve koşullu dağıtım mantığını etkinleştirir.

gitlab

CI/CD'ye Özgü Bir Claude Code Yeteneği Oluşturma

Hat Görevleri için Yetenek Yapısı

Bir CI/CD yeteneği üç bileşene ihtiyaç duyar:

  1. Değişiklik tespiti: git diff, commit mesajları veya birleştirme isteği farklılıklarını analiz edin
  2. Doğrulama mantığı: İş kurallarını uygulayın (API sürümü oluşturma, test kapsamı, güvenlik taraması)
  3. Eylem oluşturma: Hat komutları veya başarısızlık nedenleri üretin

Yetenek tanımını oluşturun:

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

SKILL.md Tanımı

---
name: api-breaking-change-detector
description: OpenAPI belirtimlerinde ve TypeScript türlerinde bozucu API değişikliklerini algılar
version: 1.0.0
author: CI/CD Ekibi
mcp:
  transport: stdio
tools:
  detect-openapi-changes:
    description: İki OpenAPI belirtimini karşılaştırır ve bozucu değişiklikleri tanımlar
    parameters:
      baseSpec:
        type: string
        description: Temel OpenAPI YAML/JSON dosyası yolu
        required: true
      headSpec:
        type: string
        description: Başlangıç OpenAPI YAML/JSON dosyası yolu
        required: true
      strictMode:
        type: boolean
        description: İsteğe bağlıdan gerekliye dönüşen değişiklikleri bozucu olarak ele alın
        default: true
  detect-typescript-changes:
    description: Bozucu değişiklikler için TypeScript arayüzlerini karşılaştırır
    parameters:
      baseFiles:
        type: array
        items: { type: string }
        description: Temel TypeScript dosyaları için glob deseni
        required: true
      headFiles:
        type: array
        items: { type: string }
        description: Başlangıç TypeScript dosyaları için glob deseni
        required: true
---

# API Bozucu Değişiklik Dedektörü Yeteneği

Bu yetenek, tüketicileri bozabilecek değişiklikleri belirlemek için API sözleşmelerini ve tür tanımlarını analiz eder.

## Kullanım Örnekleri

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

TypeScript Karşılaştırması

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

Dönüş Biçimi

{
  "hasBreakingChanges": true,
  "details": [
    {
      "type": "field_removed",
      "location": "User.email",
      "severity": "breaking"
    }
  ],
  "recommendations": [
    "Alanın kaldırılmasını geri alın veya @deprecated işaretleyicisi ekleyin"
  ]
}

Uygulama Mantığı

`index.ts` oluşturun:

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 `Alan ${change.location} kaldırıldı. Önce @deprecated ekleyin, ardından sonraki ana sürümde kaldırın.`;
      case 'type_changed':
        return `${change.location} türü değiştirildi. Yeni türle yeni bir alan eklemeyi düşünün.`;
      default:
        return `Değişikliği inceleyin: ${JSON.stringify(change)}`;
    }
  });
}

Temel içgörü: Claude Code sadece metin döndürmez; CI sistemlerinin ayrıştırabileceği ve üzerinde işlem yapabileceği yapılandırılmış veri döndürür.

Claude Code ile Pratik CI/CD İş Akışları

İş Akışı 1: Akıllı Test Çalıştırıcı

Her commit'te tüm testleri çalıştırmak yerine, yalnızca değiştirilen dosyalardan etkilenen testleri çalıştırın.

# .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` yeteneği, içe aktarmaları eşlemek ve değiştirilen kodu hangi testlerin kapsadığını belirlemek için statik analiz kullanır.

İş Akışı 2: Otomatik Sürüm Notları Oluşturma

Standart commit mesajına dayalı değişiklik günlükleri bağlamı kaçırır. Claude Code, PR açıklamalarını, kod değişikliklerini ve sorun referanslarını analiz eder:

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

Yetenek, geçiş kılavuzlarıyla birlikte açıklayıcı sürüm notları üretmek için commit mesajlarını, farklılıkları ve bağlantılı sorunları okur.

İş Akışı 3: Güvenlik Taraması Orkestrasyonu

Birden fazla güvenlik aracını çalıştırın ve Claude Code'un bulguları önceliklendirmesini sağlayın:

# .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, bulguları ilişkilendirir, tekrarları ortadan kaldırır ve sömürülebilirlik durumuna göre önceliklendirir, böylece gürültüyü %80 azaltır.

İş Akışı 4: Kanarya Dağıtımı Koordinasyonu

Birden fazla hizmette kanarya dağıtımını koordine edin:

// skills/canary-deployment/index.ts
export const tools = {
  'plan-canary': async (params: unknown) => {
    const { services, trafficSplit } = params;
    
    // Mevcut durum için hizmet ağını sorgula
    const meshState = await $fetch('http://mesh-api.internal/state');
    
    // Dağıtım sırasını oluştur
    const plan = services.map(service => ({
      service,
      traffic: meshState[service].traffic * trafficSplit,
      healthChecks: [
        `/health/${service}`,
        `/metrics/${service}/error-rate`
      ],
      rollbackThreshold: 0.05 // %5 hata oranı geri almayı tetikler
    }));
    
    return { plan, estimatedDuration: `${services.length * 5} dakika` };
  },
  
  '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 }
      });
      
      // Sağlık kontrollerini bekle
      const healthy = await waitForHealth(step.healthChecks, 30);
      if (!healthy) {
        throw new Error(`Hizmet ${step.service} sağlık kontrollerinde başarısız oldu`);
      }
    }
    
    return { success: true, servicesUpdated: plan.length };
  }
};

CI hattı `plan-canary`'yi çağırır, planı inceler, ardından manuel onay kapılarıyla `execute-canary`'yi çağırır.

Gizli Bilgileri ve İzinleri Yönetme

Gizli Bilgi Yönetimi

API anahtarlarını yetenek koduna asla sabit kodlamayın. CI sistemi gizli bilgilerini kullanın:

# GitHub Actions
- name: Claude'u Gizli Bilgilerle Çalıştır
  run: claude --skill deploy-skill
  env:
    DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
    DATABASE_URL: ${{ secrets.DATABASE_URL }}

# Yetenekte
const deployToken = process.env.DEPLOY_TOKEN;
if (!deployToken) throw new Error('DEPLOY_TOKEN ayarlanmadı');

En Az Ayrıcalık

Claude Code'u minimum izinlerle çalıştırın. GitLab'da:

# .gitlab-ci.yml
claude-job:
  script: ...
  before_script:
    - export ANTHROPIC_API_KEY=${CI_JOB_TOKEN_LIMITED}
  variables:
    GIT_STRATEGY: fetch  # Push erişimi yok
    CLAUDE_CODE_READONLY: true

Bu, Claude'un yanlışlıkla commit'leri göndermesini veya dalları silmesini önler.

İzleme ve Gözlemlenebilirlik

Claude Code Kararlarını Günlüğe Kaydetme

Denetim izleri için akıl yürütmeyi yakalayın:

// Yetenek uygulamasında
export const tools = {
  'deploy-service': async (params) => {
    const reasoning = [];
    
    reasoning.push(`Commit ${params.commitHash} analiz ediliyor`);
    const risk = await assessRisk(params.commitHash);
    reasoning.push(`Risk seviyesi: ${risk.level}`);
    
    if (risk.level === 'high') {
      reasoning.push('Dağıtım engellendi: Yüksek risk tespit edildi');
      return { approved: false, reasoning };
    }
    
    reasoning.push('Dağıtım onaylandı: Tüm kontroller geçti');
    return { approved: true, reasoning };
  }
};

Günlükleri gözlemlenebilirlik platformunuzda saklayın:

# 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

İzlenecek Metrikler

CI/CD Entegrasyonu Sorun Giderme

Sorun: Claude Code Donuyor

Neden: Etkileşimli istemleri bekliyor.
Düzeltme: `--quiet` ve `--non-interactive` bayraklarını kullanın:

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

Sorun: MCP Sunucusu Kapsayıcıda Başlatılamıyor

Neden: Eksik bağımlılıklar veya yanlış Node sürümü.
Düzeltme: Özel bir imaj oluşturun:

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

Sorun: Anthropic Tarafından Hız Sınırlaması

Neden: Paralel işlerde çok fazla API çağrısı.
Düzeltme: İstek kuyruğu uygulayın:

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

Sorun: Yetenekler Bulunamadı

Neden: MCP yapılandırmasında göreli yollar.
Düzeltme: Mutlak yollar kullanın ve CI'da yetenekler deposunu çıkarın:

- 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

Sonuç

CI/CD hatlarındaki Claude Code, otomasyonu katı betiklerden kod tabanınızı, mimarilerinizi ve iş kurallarınızı anlayan akıllı aracılara kaydırır. Claude'u kapsayıcı hale getirerek, özel yetenekler tanımlayarak ve GitHub Actions veya GitLab CI ile entegre ederek, yeniden düzenlemeye uyum sağlayan, ince bozucu değişiklikleri yakalayan ve eyleme dönüştürülebilir içgörüler üreten hatlar oluşturursunuz. Tek bir yetenekle—API bozucu değişiklik tespiti—başlayın ve ekibiniz otomasyona güvendikçe genişletin. Yetenek geliştirmeye yapılan ön yatırım, azaltılmış manuel inceleme süresi ve daha az üretim olayı sayesinde kazanç sağlar.

Yetenekleriniz dahili API'lerle etkileşime girdiğinde, AI odaklı hatlarınızın kararsızlık kaynağı olmamasını sağlamak için bu sözleşmeleri Apidog ile doğrulayın.

button

API Tasarım-Öncelikli Yaklaşımı Apidog'da Uygulayın

API'leri oluşturmanın ve kullanmanın daha kolay yolunu keşfedin