Claude Code Masterkurs – KI-gestuetztes Programmieren lernen mit Anthropics Coding-Agent

CI/CD & Headless Mode

Level 3 | 40 Minuten

Claude Code in GitHub Actions, GitLab CI und automatisierten Pipelines einsetzen

Lernziele

Headless Mode – Claude ohne Terminal

Der Headless Mode (auch Print Mode genannt) ist der Schlüssel zur Integration von Claude Code in automatisierte Workflows. Mit dem -p Flag wird Claude Code von einem interaktiven Chat-Tool zu einem programmierbaren Baustein den du in Skripte, Pipelines und Cron-Jobs einbinden kannst. Das Grundprinzip ist einfach: 'claude -p "Dein Prompt hier"' sendet den Prompt an Claude, wartet auf die Antwort, gibt sie auf stdout aus und beendet sich. Kein Dialog, keine Rückfragen, kein Warten auf Nutzer-Input. Reines Input-Output wie bei jedem anderen Unix-Tool. Der Headless Mode unterstützt alle Standard-Unix-Patterns: Piping ('cat file.js | claude -p "Erkläre diesen Code"'), Redirection ('claude -p "Generiere eine .gitignore" > .gitignore'), Command Substitution ('BUGS=$(claude -p "Finde Bugs in @src/app.ts")'). Für maschinelle Verarbeitung nutze --output-format json. Statt Freitext bekommst du ein JSON-Objekt mit Feldern wie: result (die eigentliche Antwort), usage (Token-Verbrauch), cost (Kosten in USD), model (verwendetes Modell) und duration_ms (Laufzeit). Das kannst du mit jq, Python oder JavaScript weiterverarbeiten. Kritische Flags für den automatisierten Betrieb: --max-turns begrenzt die Iterationen (verhindert Endlosschleifen und Kostenexplosion), --max-budget-usd setzt ein hartes Kosten-Limit, --allowedTools beschränkt die erlaubten Aktionen, und --model wählt das optimale Modell für die Aufgabe. Der Headless Mode ist die Brücke zwischen Claude Code und dem Rest deiner Automatisierungs-Infrastruktur: GitHub Actions, GitLab CI, Jenkins, Cron-Jobs, Monitoring-Skripte — alles was einen Shell-Befehl ausführen kann, kann Claude Code nutzen.

# Grundlagen: Der -p Flag
claude -p "Erkläre was dieser Code tut" < file.js
# → Claude analysiert die Datei und gibt Erklärung aus

# Mit Datei-Kontext:
claude -p "Finde Bugs in @src/api/auth.ts"
# → Claude liest die Datei und gibt Bugfixes aus

# Stdin pipen:
cat src/utils.ts | claude -p "Finde potenzielle Bugs"
git diff HEAD~1 | claude -p "Beschreibe diese Änderungen"
npm test 2>&1 | claude -p "Erkläre die fehlgeschlagenen Tests"

# Output-Formate:
claude -p "Analysiere package.json" --output-format text  # Standard
claude -p "Analysiere package.json" --output-format json  # Strukturiert
claude -p "Analysiere package.json" --output-format stream-json

# Iterationen begrenzen (wichtig für CI!):
claude -p "Fix lint errors" --max-turns 5
# → Claude stoppt nach maximal 5 Aktionsschritten
# → Verhindert Endlosschleifen in der Pipeline

# Tools einschränken (Sicherheit in CI):
claude -p "Review code" --allowedTools "Read,Bash(git diff)"
# → Claude kann NUR lesen und git diff ausführen
# → Kein Schreibzugriff in der Pipeline

JSON Output für maschinelle Verarbeitung

Im Headless Mode kann Claude die Ergebnisse als strukturiertes JSON ausgeben statt als Freitext. Das ist ideal für die Weiterverarbeitung in Skripten, Pipelines und Dashboards — du kannst Token-Verbrauch, Kosten und Ergebnisse programmatisch auswerten und in dein Monitoring integrieren. Die Aktivierung ist einfach: 'claude -p "Dein Prompt" --output-format json'. Statt einer lesbaren Textantwort bekommst du ein JSON-Objekt mit definierten Feldern: result (die eigentliche Antwort), usage (Input- und Output-Tokens), cost_usd (Kosten), model (verwendetes Modell), duration_ms (Laufzeit). Für Skripte ist das extrem wertvoll: Du kannst das JSON mit jq parsen, mit Python verarbeiten, oder in eine Datenbank schreiben. Zum Beispiel: 'claude -p "Review" --output-format json | jq .cost_usd' gibt dir nur die Kosten. Oder: Schreibe die Ergebnisse in eine CSV für monatliche Auswertung. In CI/CD-Pipelines nutzt du JSON Output für Conditional Logic: Wenn der Review Schweregrad 'critical' enthält → Pipeline fehlschlagen lassen. Wenn die Kosten über einem Threshold liegen → Warnung senden. Wenn keine Findings → Auto-Approve. Das JSON-Format ist stabil und versioniert — du kannst dich darauf verlassen dass die Feldnamen und Struktur über Updates hinweg konsistent bleiben. Das ist wichtig für langfristige Automatisierung. Ein Praxis-Tipp: Kombiniere --output-format json mit --output-format stream-json für Echtzeit-Verarbeitung. Statt auf die komplette Antwort zu warten, bekommst du JSON-Chunks die du progressiv verarbeiten kannst — ideal für Live-Dashboards und Progress-Anzeigen.

# JSON Output aktivieren:
claude -p "Finde alle TODO-Kommentare" --output-format json

# Output:
# {
#   "result": "Gefundene TODOs:
1. src/app.ts:42 - TODO: Error handling
...",
#   "cost": { "input_tokens": 5230, "output_tokens": 1450 },
#   "duration_ms": 3200,
#   "model": "claude-sonnet-4.5"
# }

# In Scripts verarbeiten:
RESULT=$(claude -p "Analysiere Code-Qualität" --output-format json)
SCORE=$(echo $RESULT | jq -r '.result' | grep -o 'Score: [0-9]*' | head -1)
if [ "$SCORE" -lt 70 ]; then
  echo "Code-Qualität zu niedrig: $SCORE"
  exit 1
fi

# Stream-JSON für Echtzeit-Verarbeitung:
claude -p "Generiere Tests" --output-format stream-json | while read line; do
  echo "Claude: $line"
done

GitHub Actions Integration

Die Integration von Claude Code in GitHub Actions ermöglicht automatisierte Code-Reviews, Test-Generierung und Quality-Checks bei jedem Pull Request. Es gibt zwei Wege: Die offizielle GitHub Action für schnellen Einstieg, oder Custom Workflows mit dem Headless Mode für maximale Flexibilität. Die offizielle Action (anthropics/claude-code-action) ist in 5 Minuten eingerichtet: YAML-Workflow-Datei erstellen, ANTHROPIC_API_KEY als Repository-Secret hinterlegen, und die Action im PR-Trigger konfigurieren. Bei jedem neuen PR analysiert Claude den Diff und postet ein detailliertes Review als Kommentar. Für Custom Workflows nutzt du den Headless Mode: Im YAML-Workflow installierst du Claude Code, setzt die Umgebungsvariablen und führst 'claude -p' mit deinem spezifischen Prompt aus. Das gibt dir volle Kontrolle: Welches Modell, welche Tools, welches Output-Format, welche Checks. Typische Workflow-Konfiguration: Trigger bei PR-Erstellung oder -Update. Checkout des Codes. Claude Code Installation. Ausführung mit --max-turns 5 und --model sonnet. JSON-Output in eine Variable. Parsing und Posting als PR-Kommentar oder Status-Check. Bewährte Praxis für Teams: Nutze separate Workflows für verschiedene Check-Typen: Ein Workflow für Code-Review, einer für Security-Audit, einer für Test-Coverage. So kannst du die Kosten und Laufzeiten pro Check optimieren. Kosten-Management: Nutze if-Conditions im Workflow um Claude nur bei relevanten Änderungen zu triggern: 'if: contains(github.event.pull_request.changed_files, 'src/') — nur bei Source-Änderungen. Docs-Updates brauchen kein Claude-Review. Ein Sicherheitshinweis: Nutze NIEMALS --dangerously-skip-permissions in öffentlichen Repositories. In privaten Repos: Nur in Kombination mit Container-Isolation und minimalen Tool-Berechtigungen.

# .github/workflows/claude-review.yml
name: Claude Code Review

on:
  pull_request:
    types: [opened, synchronize]

permissions:
  contents: read
  pull-requests: write

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Get changed files
        id: changes
        run: |
          echo "files=$(git diff --name-only origin/main...HEAD | tr '\n' ' ')" >> $GITHUB_OUTPUT

      - name: Claude Code Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          git diff origin/main...HEAD | claude -p \
            "Reviewe diese Code-Änderungen. Prüfe auf:
             1. Bugs und Sicherheitslücken
             2. Performance-Probleme
             3. Best Practice Verstöße
             4. Fehlende Error-Handling
             Gib eine Zusammenfassung als Markdown." \
            --output-format text \
            --max-turns 3 \
            --allowedTools "Read" \
            > review.md

      - name: Post Review Comment
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const review = fs.readFileSync('review.md', 'utf8');
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: '## 🤖 Claude Code Review\n\n' + review
            });

Weitere GitHub Actions Workflows

Neben dem Standard-Code-Review gibt es zahlreiche weitere Einsatzmöglichkeiten für Claude Code in GitHub Actions. Hier sind die nützlichsten Workflows die über ein einfaches Review hinausgehen und echten Mehrwert für dein Team liefern. Automatische Test-Generierung: Wenn neue Dateien in einem PR hinzugefügt werden, generiert Claude automatisch Test-Dateien. Der Workflow identifiziert neue .ts/.tsx Dateien im Diff, lässt Claude Tests generieren, und erstellt einen separaten Commit mit den Tests. Security-Audit: Ein regelmäßiger (z.B. wöchentlicher) Workflow der die gesamte Codebase auf Sicherheitsprobleme scannt. Claude analysiert den Code auf OWASP Top 10, prüft Dependencies auf bekannte Schwachstellen, und erstellt ein Issue mit den Findings. Release-Note-Generierung: Bei jedem Release-Tag analysiert Claude die Commits seit dem letzten Release, kategorisiert sie (Features, Bug Fixes, Verbesserungen) und generiert formatierte Release Notes. Dependency-Update-Review: Wenn Dependabot oder Renovate einen PR erstellt, analysiert Claude die Changelog-Einträge der aktualisierten Packages und bewertet das Risiko. Niedrig-Risiko-Updates können automatisch gemergt werden. Code-Dokumentation: Bei jedem PR prüft Claude ob neue oder geänderte Funktionen dokumentiert sind. Fehlende Dokumentation wird als PR-Kommentar angemahnt oder automatisch generiert. Für jeden dieser Workflows gilt: --max-turns begrenzen, --allowedTools einschränken, Kosten-Limit setzen. Ein unkontrollierter Agent in der Pipeline kann teuer werden.

# Auto-Fix Lint Errors
name: Claude Auto-Fix
on:
  push:
    branches: [develop]

jobs:
  auto-fix:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install -g @anthropic-ai/claude-code
      - name: Fix Lint Errors
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          npm run lint 2>&1 | claude -p \
            "Behebe alle Lint-Fehler in den betroffenen Dateien." \
            --max-turns 10 \
            --sandbox
      - name: Commit Fixes
        run: |
          git config user.name "Claude Code Bot"
          git config user.email "claude@bot.com"
          git add -A
          git diff --staged --quiet || git commit -m "fix: auto-fix lint errors via Claude Code"
          git push
# Automatische Issue-Bearbeitung
name: Claude Issue Handler
on:
  issues:
    types: [labeled]

jobs:
  implement:
    if: github.event.label.name == 'claude-implement'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install -g @anthropic-ai/claude-code
      - name: Implement Feature
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          ISSUE_BODY="${{ github.event.issue.body }}"
          claude -p "Implementiere folgendes Feature basierend
            auf dieser Issue-Beschreibung:
            $ISSUE_BODY
            
            Erstelle einen neuen Branch, implementiere das Feature,
            und erstelle einen Draft PR." \
            --max-turns 20 \
            --sandbox

GitLab CI/CD Integration

Claude Code lässt sich auch in GitLab CI/CD-Pipelines integrieren. Die Konfiguration erfolgt in der .gitlab-ci.yml und ist konzeptionell ähnlich zur GitHub Actions Integration — mit einigen GitLab-spezifischen Besonderheiten. Der grundlegende Aufbau: Du definierst einen Pipeline-Job der Claude Code installiert, authentifiziert und im Headless Mode ausführt. Die Ergebnisse kannst du als GitLab-Kommentar auf dem Merge Request posten oder als Pipeline-Artefakt speichern. Die Authentifizierung erfolgt über eine CI/CD-Variable: Speichere den ANTHROPIC_API_KEY als geschützte (protected) und maskierte (masked) Variable in den GitLab CI/CD Einstellungen. So ist der Key im Pipeline-Log nicht sichtbar. Für MR-Comments nutzt du die GitLab API: 'curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" --data "body=$REVIEW" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes"'. Das postet Claudes Review als Kommentar auf dem Merge Request. GitLab-spezifische Vorteile: GitLab CI/CD Runner laufen oft self-hosted — du hast volle Kontrolle über die Ausführungsumgebung. Das macht Sandboxing einfacher und gibt dir mehr Optionen für Netzwerk-Isolation. Für Teams die sowohl GitHub als auch GitLab nutzen: Erstelle ein wiederverwendbares Shell-Skript das die Claude Code Integration abstrahiert. Das Skript wird von beiden Plattformen aufgerufen und du musst die Logik nur einmal pflegen. Kosten-Kontrolle in GitLab: Nutze GitLab CI/CD Rules um Pipelines nur bei relevanten Änderungen zu triggern. Und: Setze Resource-Limits auf den Runner um zu verhindern dass ein hängengebliebener Agent unbegrenzt Tokens verbraucht.

# .gitlab-ci.yml
stages:
  - review
  - test
  - fix

claude-review:
  stage: review
  image: node:20
  only:
    - merge_requests
  before_script:
    - npm install -g @anthropic-ai/claude-code
  script:
    - |
      git diff origin/main...HEAD | claude -p \
        "Reviewe diese Änderungen für den Merge Request.
         Fokus: Sicherheit, Performance, Code-Qualität." \
        --output-format text \
        --max-turns 3 > review.md
    - cat review.md
  artifacts:
    paths:
      - review.md

claude-test-gen:
  stage: test
  image: node:20
  only:
    - merge_requests
  before_script:
    - npm install -g @anthropic-ai/claude-code
    - npm ci
  script:
    - |
      CHANGED=$(git diff --name-only origin/main...HEAD | grep '.ts
  

)
      claude -p "Generiere Unit Tests für: $CHANGED" \
        --max-turns 10 \
        --sandbox
    - npm test

Sichere Pipeline-Konfiguration

Sicherheit in CI/CD-Pipelines ist kritisch — Claude Code läuft hier oft mit erhöhten Berechtigungen und ohne menschliche Aufsicht. Ein falsch konfigurierter Pipeline-Job kann sensible Daten leaken, Code beschädigen oder hohe Kosten verursachen. Regel 1 — Minimale Berechtigungen: Gib Claude nur die Tools die es für den spezifischen Job braucht. Code-Review: --allowedTools Read,Grep,Glob (kein Write, kein Bash). Test-Generierung: zusätzlich Write. Security-Scan: Read,Grep,Bash(npm audit:*). Je weniger Tools, desto kleiner die Angriffsfläche. Regel 2 — Laufzeit-Limits: Setze --max-turns und --max-budget-usd für JEDEN Pipeline-Job. Ein typischer Code-Review braucht 3-5 Turns. Wenn ein Job 20 Turns braucht, stimmt etwas nicht. --max-budget-usd 0.50 ist ein sinnvolles Limit für Standard-Reviews. Regel 3 — Secrets-Management: Der ANTHROPIC_API_KEY gehört IMMER in die CI/CD-Secrets, NIE in den Workflow-Code. Rotiere den Key regelmäßig. Nutze verschiedene Keys für verschiedene Umgebungen (Produktion, Staging, Development). Regel 4 — Container-Isolation: Wenn du --dangerously-skip-permissions nutzen musst (für Automation), dann NUR in einem isolierten Docker-Container. Der Container hat: Begrenzten Filesystem-Zugriff, keine Netzwerk-Zugriff außer zur Claude API, und ein Timeout das den Container nach X Minuten killt. Regel 5 — Audit-Trail: Logge alle Claude Code Ausführungen: Wer hat den Job getriggert, welcher Prompt wurde verwendet, was war das Ergebnis, wie viel hat es gekostet. Das ist nicht nur für Security sondern auch für Kosten-Tracking wichtig. Regel 6 — Keine Produktionsdaten: Claude in der Pipeline sollte NIEMALS Zugriff auf Produktionsdatenbanken oder -secrets haben. Nutze Test-Daten und Mock-Services.

Kosten-Kontrolle in CI/CD

In CI/CD-Pipelines können Kosten schnell eskalieren wenn keine Limits gesetzt sind. Jeder Pipeline-Lauf verbraucht Tokens, und bei aktiven Repositories mit vielen PRs pro Tag summiert sich das. Ohne Kontrolle kann eine einzige Woche mehr kosten als ein Monat manueller Nutzung. Kostentreiber Nummer 1: Zu häufige Trigger. Jeder Push auf einen PR-Branch triggert die Pipeline — auch wenn nur eine Typo in der README gefixt wird. Lösung: Trigger nur bei relevanten Dateien (src/, lib/, etc.) und nur bei bestimmten Events (PR opened, synchronize, nicht bei Draft-PRs). Kostentreiber Nummer 2: Zu teure Modelle. Opus für einen einfachen Lint-Check ist Verschwendung. Lösung: Model-Routing — Haiku für einfache Checks, Sonnet für Standard-Reviews, Opus nur für tiefe Security-Audits. Kostentreiber Nummer 3: Fehlende Limits. Ein Agent der in einer Schleife steckt kann hunderte Turns verbrauchen. Lösung: --max-turns 5 für Standard-Jobs, --max-budget-usd 1.00 als hartes Limit. Lieber ein fehlgeschlagener Job als eine 50 USD Rechnung. Kostentreiber Nummer 4: Redundante Analysen. Der gleiche Code wird bei jedem Push erneut analysiert, auch wenn sich nichts geändert hat. Lösung: Ergebnis-Caching — speichere Review-Ergebnisse als Artefakte und überspringe die Analyse wenn der relevante Code unverändert ist. Kosten-Monitoring einrichten: Tracke die Kosten pro Workflow, pro Repository und pro Woche. Setze Alerts wenn die Kosten einen Threshold überschreiten. Erstelle ein monatliches Report das zeigt: Gesamtkosten, Kosten pro PR, durchschnittliche Kosten pro Job-Typ. Realistisches Budget: Ein Team mit 5 Entwicklern, 15 PRs/Tag, automatischer Review mit Sonnet: ~15-30 USD/Monat. Das ROI ist deutlich positiv wenn man die gesparte Review-Zeit einrechnet.

# Kosten pro Pipeline-Run überwachen:
RESULT=$(claude -p "Review code" --output-format json --max-turns 3)
COST=$(echo $RESULT | jq '.cost.total_usd')
echo "Pipeline Claude Cost: $COST"

# Budget-Guard:
if (( $(echo "$COST > 0.50" | bc -l) )); then
  echo "⚠️ Claude Code Kosten über Budget: $COST"
  # Slack/Teams Benachrichtigung senden
fi

# Kosten-sparende Strategien:
# → Nur bei PRs mit >10 geänderten Zeilen reviewen
# → Haiku-Modell für einfache Lint-Fixes
# → Sonnet für Code Reviews
# → Opus nur für komplexe Architektur-Reviews
claude -p "Review" --model haiku  # Günstigstes Modell
claude -p "Review" --model sonnet # Standard
claude -p "Review" --model opus   # Premium (komplexe Tasks)
🎓 CI/CD Best PracticesHeadless Mode: -p Flag für alle Automationen ✅ Output-Format: --output-format json für Scripts ✅ Grenzen setzen: --max-turns und --allowedTools ✅ Sandbox: Immer aktivieren in Pipelines ✅ Secrets: API Key nur als Environment Secret ✅ Budget: Kosten pro Run überwachen ✅ Review: Claude's Änderungen nie direkt mergen ✅ Modell: Passendes Modell pro Task wählen