Claude Code in CI/CD Pipelines: GitHub Actions und GitLab CI
Claude Code in CI/CD integrieren: Headless Mode, GitHub Actions, GitLab CI, Pre-Commit Hooks. Praktische Beispiele mit Code-Snippets.
TL;DR: Claude Code läuft nicht nur im Terminal. Im Headless Mode (claude -p "prompt") integriert er sich in jede CI/CD-Pipeline. GitHub Actions reagiert auf @claude-Mentions in PRs. GitLab CI nutzt den Headless Mode für automatisierte Reviews und Tests. Pre-Commit Hooks fangen Probleme ab, bevor Code das Repository erreicht. Alles mit konkreten Code-Snippets zum Kopieren.
Headless Mode: Die Grundlage
Claude Code hat zwei Modi. Den interaktiven Modus -- du tippst, Claude antwortet. Und den Headless Mode -- Claude Code führt einen Prompt aus und liefert das Ergebnis, ohne menschliche Interaktion.
Grundsyntax
claude -p "Analysiere die Datei src/auth.ts auf Sicherheitslücken"
Der -p Flag steht für "print". Claude Code liest den Prompt, analysiert den Kontext und gibt das Ergebnis auf stdout aus. Kein interaktives Terminal. Kein menschliches Eingreifen nötig. Falls du noch nicht mit Claude Code vertraut bist: Was ist Claude Code? liefert den Einstieg.
Output-Formate
# Plaintext (Standard)
claude -p "Beschreibe die Architektur"
# JSON (strukturiert, für Weiterverarbeitung)
claude -p "Liste alle TODO-Kommentare" --output-format json
# Stream JSON (für Echtzeit-Verarbeitung)
claude -p "Refactore die utils.ts" --output-format stream-json
Das JSON-Format ist für CI/CD entscheidend. Du kannst die Ausgabe parsen, Entscheidungen darauf basieren und nachfolgende Pipeline-Schritte steuern.
Beispiel: JSON-Output verarbeiten
# Claude analysiert Code und gibt strukturiertes Ergebnis zurück
RESULT=$(claude -p "Prüfe src/api/ auf Breaking Changes.
Antworte im Format: {\"breaking\": true/false, \"changes\": [...]}" \
--output-format json)
# Ergebnis in der Pipeline nutzen
if echo "$RESULT" | jq -r '.result' | jq -r '.breaking' | grep -q "true"; then
echo "Breaking Changes gefunden!"
exit 1
fi
GitHub Actions: @claude in Pull Requests
Die GitHub Actions Integration ist der am häufigsten genutzte CI/CD-Einsatz von Claude Code. Ein Entwickler erwähnt @claude in einer PR, und Claude Code reagiert.
Setup
# .github/workflows/claude-review.yml
name: Claude Code Review
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
pull_request:
types: [opened, synchronize]
jobs:
claude-review:
if: |
github.event_name == 'pull_request' ||
contains(github.event.comment.body, '@claude')
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Claude Code Review
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
model: claude-sonnet-4-20250514
Was dieser Workflow tut
- Trigger: Jede neue PR und jeder Kommentar mit @claude
- Checkout: Das Repository wird ausgecheckt (mit History für Diff-Analyse)
- Claude Code: Analysiert den Diff und postet eine Review als Kommentar
Automatische Reviews bei jeder PR
# .github/workflows/auto-review.yml
name: Automatic Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get diff
id: diff
run: |
DIFF=$(git diff origin/main...HEAD)
echo "diff<<EOF" >> $GITHUB_OUTPUT
echo "$DIFF" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Claude Review
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
Prüfe diese PR auf:
1. Sicherheitsprobleme
2. Performance-Probleme
3. Code-Style-Verstöße
4. Fehlende Tests
Sei konkret. Nenne Datei und Zeile.
Jede PR bekommt automatisch eine Claude-Review. Der menschliche Reviewer sieht Claudes Kommentare und kann sich auf die Punkte konzentrieren, die eine menschliche Einschätzung brauchen.
Features implementieren lassen
@claude Füge einen Rate Limiter für die /api/users Route hinzu.
Nutze express-rate-limit. Maximum 100 Requests pro Minute pro IP.
Schreibe Tests dazu.
Claude Code liest den Kommentar, analysiert die Codebasis, implementiert das Feature und erstellt einen Commit in der PR. Der Entwickler reviewed den Code und mergt.
Teams mit dieser Integration berichten von 30 % schnelleren PR Turnaround-Zeiten. Der Engpass verschiebt sich von "Code schreiben" zu "Code reviewen" -- und Claude hilft bei beidem. Wie du Claude Code im gesamten Team ausrollst, beschreibt unser Artikel Claude Code für Teams.
GitLab CI Integration
GitLab hat keine native Claude-Code-Action wie GitHub. Die Integration läuft über den Headless Mode.
Basis-Setup
# .gitlab-ci.yml
claude-review:
stage: review
image: node:22
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
before_script:
- npm install -g @anthropic-ai/claude-code
script:
- |
DIFF=$(git diff origin/main...HEAD)
claude -p "Prüfe diesen Diff auf Probleme:
$DIFF
Antworte mit:
1. Kritische Probleme (müssen gefixt werden)
2. Warnungen (sollten gefixt werden)
3. Verbesserungsvorschläge (nice to have)" \
--output-format json > review.json
- cat review.json
artifacts:
paths:
- review.json
variables:
ANTHROPIC_API_KEY: $ANTHROPIC_API_KEY
Review-Ergebnis als Merge-Request-Kommentar
claude-comment:
stage: report
needs: [claude-review]
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- |
REVIEW=$(cat review.json | jq -r '.result')
curl --request POST \
--header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
--header "Content-Type: application/json" \
--data "{\"body\": \"## Claude Code Review\n\n${REVIEW}\"}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/notes"
Das Ergebnis: Jede Merge Request bekommt automatisch einen Claude-Code-Review als Kommentar.
Pre-Commit Hooks
Pre-Commit Hooks laufen lokal, bevor ein Commit erstellt wird. Claude Code kann hier Probleme abfangen, bevor sie das Repository erreichen.
Setup mit Husky
npm install --save-dev husky
npx husky init
Pre-Commit Hook
#!/bin/sh
# .husky/pre-commit
# Staged Dateien holen
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
if [ -z "$STAGED_FILES" ]; then
exit 0
fi
# Claude Code prüft die staged Dateien
RESULT=$(claude -p "Prüfe diese Dateien auf offensichtliche Fehler:
$STAGED_FILES
Antworte NUR mit 'OK' wenn alles in Ordnung ist.
Wenn es Probleme gibt, liste sie auf." 2>&1)
if echo "$RESULT" | grep -q "OK"; then
exit 0
else
echo "Claude Code hat Probleme gefunden:"
echo "$RESULT"
echo ""
echo "Commit abgebrochen. Behebe die Probleme oder nutze --no-verify."
exit 1
fi
Was der Hook prüft
Der Hook läuft bei jedem git commit. Claude Code analysiert die staged Dateien und blockiert den Commit, wenn er Probleme findet.
Typische Funde:
- API Keys im Code
- console.log/print-Statements in Production Code
- Fehlende Error Handling
- Offensichtliche Logikfehler
Der Overhead: 5-15 Sekunden pro Commit, abhängig von der Größe der Änderungen. Bei großen Commits (50+ Dateien) kann es länger dauern. In dem Fall: den Hook auf die wichtigsten Dateien beschränken.
Async Hooks: Hintergrund-Aufgaben
Nicht jede Claude-Code-Aufgabe muss den Build blockieren. Async Hooks laufen parallel im Hintergrund.
Beispiel: Automatische Dokumentation
# .github/workflows/auto-docs.yml
name: Auto Documentation
on:
push:
branches: [main]
paths:
- 'src/api/**'
jobs:
update-docs:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Update API Docs
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
Die API-Dateien in src/api/ wurden geändert.
Aktualisiere die API-Dokumentation in docs/api.md.
Erstelle einen Commit mit der aktualisierten Dokumentation.
Jeder Push auf main, der API-Dateien ändert, löst eine automatische Dokumentations-Aktualisierung aus. Kein Entwickler muss daran denken.
Beispiel: Automatische Changelog-Generierung
# .github/workflows/changelog.yml
name: Generate Changelog
on:
release:
types: [created]
jobs:
changelog:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate Changelog
run: |
LAST_TAG=$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo "")
if [ -n "$LAST_TAG" ]; then
COMMITS=$(git log ${LAST_TAG}..HEAD --oneline)
else
COMMITS=$(git log --oneline -20)
fi
claude -p "Erstelle einen Changelog aus diesen Commits:
$COMMITS
Format:
## Neue Features
## Bug Fixes
## Verbesserungen
Gruppiere die Commits sinnvoll. Schreibe auf Deutsch." \
> CHANGELOG_ENTRY.md
cat CHANGELOG_ENTRY.md
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Sicherheit in CI/CD
Claude Code in der Pipeline bedeutet: Ein AI-Agent hat Zugriff auf euren Code und kann Befehle ausführen. Das erfordert Vorsicht.
Prinzip 1: Minimale Berechtigungen
permissions:
contents: read # Nur lesen, nicht schreiben
pull-requests: write # Kommentare posten
# NICHT: contents: write (außer wenn Claude committen soll)
Gebt Claude Code nur die Berechtigungen, die er braucht. Für Reviews: read + PR-Kommentare. Für Implementierungen: read + write. Niemals admin. Mehr Sicherheits- und Qualitätstipps findest du in unseren Claude Code Best Practices.
Prinzip 2: Sandbox
In CI läuft Claude Code bereits in einer isolierten Umgebung (Container). Zusätzliche Absicherung:
steps:
- name: Claude in Sandbox
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
allowed_tools: "read,write,grep,glob" # Keine Shell-Befehle
Beschränkt die Tools, die Claude Code nutzen darf. Für Reviews reichen Lese-Tools. Für Implementierungen brauchst du zusätzlich write.
Prinzip 3: Secrets schützen
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
# NICHT: DATABASE_URL, AWS_SECRET_KEY, etc.
Gebt Claude Code nur den API Key. Keine anderen Secrets. Claude Code braucht keinen Datenbankzugang in der Review-Pipeline.
Prinzip 4: Output prüfen
Claude Code kann in CI Befehle vorschlagen oder ausführen. Bei Implementierungen (Claude erstellt Commits) sollte immer ein menschlicher Review folgen. Automatisch gemergt werden sollte nichts.
Praktisches Beispiel: Komplette Pipeline
Eine Pipeline, die alle Elemente kombiniert:
# .github/workflows/complete-pipeline.yml
name: Complete CI with Claude
on:
pull_request:
types: [opened, synchronize]
jobs:
# Schritt 1: Standard-Tests
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
# Schritt 2: Claude Code Review (parallel zu Tests)
claude-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
Review diese PR. Fokus auf:
1. Sicherheit
2. Performance
3. Wartbarkeit
# Schritt 3: Claude prüft Test-Coverage
coverage-check:
needs: [test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run test:coverage -- --reporter=json > coverage.json
- name: Claude Coverage Analysis
run: |
claude -p "Analysiere die Test-Coverage in coverage.json.
Welche kritischen Pfade sind nicht getestet?
Nenne konkrete Dateien und Funktionen."
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Tests und Claude-Review laufen parallel. Die Coverage-Analyse läuft nach den Tests. Der Entwickler bekommt drei Ergebnisse: Testergebnis, Code-Review und Coverage-Analyse.
Häufig gestellte Fragen
Wie hoch sind die API-Kosten für Claude Code in CI/CD?
Abhängig vom Volumen. Eine einzelne Code-Review kostet ca. $0,05-$0,50 in API-Tokens (mit Sonnet). Bei 50 PRs pro Woche sind das $10-$100/Monat. Mit dem Teams oder Enterprise Plan sind die Kosten im Seat-Preis enthalten.
Verlangsamt Claude Code die Pipeline?
Eine Claude-Code-Analyse dauert 10-60 Sekunden, abhängig von der Größe des Diffs. Wenn der Review-Job parallel zu Tests läuft (wie im Beispiel oben), verlängert er die Pipeline nicht.
Kann Claude Code direkt auf main pushen?
Technisch ja. Praktisch sollte er das nie tun. Claude Code sollte PRs erstellen oder Commits in bestehende PRs pushen. Der Merge auf main bleibt menschliche Entscheidung.
Funktioniert das auch mit Bitbucket oder Azure DevOps?
Ja, über den Headless Mode. claude -p "prompt" funktioniert in jeder CI-Umgebung, die Node.js installieren kann. Die native GitHub Action gibt es nur für GitHub. Für andere Plattformen nutzt du den Headless Mode wie im GitLab-Beispiel.
Wie gehe ich mit Rate Limits um?
Im Teams Plan sind die Rate Limits höher als im Pro Plan. Für CI/CD-Pipelines mit vielen PRs pro Tag empfiehlt sich der Enterprise Plan mit Custom Rate Limits. Alternativ: Reviews nur bei bestimmten Labels oder Pfaden triggern.
Soll ich Sonnet oder Opus für CI/CD nutzen?
Sonnet für Reviews und Analysen. Schneller und günstiger. Opus für komplexe Implementierungen, wo Qualität wichtiger ist als Geschwindigkeit. Die meisten Teams nutzen Sonnet für 90 % der CI/CD-Aufgaben.
Wie debugge ich Probleme in der Claude-Code-Pipeline?
Nutze --output-format json und logge den Output. Das JSON enthält das Ergebnis, die genutzten Tools und eventuelle Fehler. Für tieferes Debugging: --output-format stream-json gibt dir den gesamten Denkprozess. Alle verfügbaren Flags und Befehle findest du im Claude Code Befehle Cheatsheet.
Brauche ich eine CLAUDE.md für CI/CD?
Ja. Die CLAUDE.md liegt im Repository und wird auch in CI gelesen. Ohne CLAUDE.md fehlt Claude Code der Projektkontext. Die Review-Qualität sinkt messbar. Wie du eine effektive CLAUDE.md erstellst, zeigt unser Guide CLAUDE.md schreiben.
OpenClaw Setup ohne Aufwand
Clawdify liefert einen vorkonfigurierten OpenClaw-Agenten auf dedizierter M4 Hardware. Wir installieren, du nutzt.
Setup anfragen