04 / 06 · Эксперт

🚀 CI/CD интеграция

Как встроить Claude Code в автоматизированные пайплайны: headless-режим, GitHub Actions, GitLab CI/CD, безопасность API-ключей, контроль расходов и защита от злоупотреблений.

🤖
CC — не только интерактивный инструмент. Флаг --no-interactive и формат вывода --output-format json превращают Claude Code в программируемый компонент пайплайна. Он может делать code review каждого PR, генерировать тесты при открытии pull request, обновлять документацию после изменений — всё это без участия человека. На этой странице — реальные рабочие workflow с полным кодом.

Общая схема пайплайна

📝
Push / PR
Событие в Git
⚙️
CI триггер
GitHub / GitLab
🤖
Claude Code
headless режим
📤
Вывод
JSON / Markdown
💬
Действие
Комментарий / Commit
1

Claude Code поддерживает полностью неинтерактивный режим через флаг --no-interactive. В этом режиме CC выполняет задачу и завершает работу — никаких подсказок, никаких ожиданий ввода. Это единственный режим пригодный для CI/CD.

Базовые команды headless режима
bash headless-examples.sh
# Простая задача без диалога, вывод в stdout claude -p "Проверь все PHP файлы на PSR-12 совместимость и сообщи об ошибках" \ --no-interactive # С JSON-выводом — удобно для парсинга в скриптах claude -p "Найди все SQL-инъекции в директории app/" \ --output-format json \ --no-interactive # С указанием рабочей директории claude -p "Задача" \ --cwd /path/to/project \ --no-interactive # Ограничить количество токенов (контроль расходов в CI) claude -p "Review this PR diff" \ --max-tokens 4096 \ --no-interactive # Указать модель (дешевле для простых задач) ANTHROPIC_MODEL=claude-haiku-4-5 \ claude -p "Простая проверка стиля" \ --no-interactive # Сохранить вывод в файл для последующей публикации claude -p "Сгенерируй release notes для этого diff: $(cat /tmp/diff.txt)" \ --no-interactive > /tmp/release-notes.md

Флаги для CI/CD

ФлагОписаниеКогда использовать
--no-interactive Выход по завершении, без ожидания ввода Всегда в CI
-p "текст" Промпт как аргумент командной строки Для коротких задач
--output-format json Структурированный вывод для парсинга Когда результат нужно обработать скриптом
--max-tokens N Ограничение токенов ответа Контроль расходов
--cwd /path Рабочая директория проекта Когда CI-runner не в корне проекта
💡
Флаг -p (prompt) означает «выполни эту задачу». Без него CC запускает интерактивный REPL. Всегда используйте -p + --no-interactive вместе в CI — это гарантирует что процесс завершится.
2
ПеременнаяЗначение / ПримерНазначение
ANTHROPIC_API_KEY sk-ant-api03-... Обязательна — аутентификация в API
ANTHROPIC_MODEL claude-sonnet-5 Переопределить модель без флага
ANTHROPIC_BASE_URL https://api.anthropic.com Для корпоративных прокси
CLAUDE_CODE_MAX_OUTPUT_TOKENS 4096 Глобальный лимит токенов
NO_COLOR 1 Отключить ANSI-цвета в логах CI
Настройка secrets в GitHub Actions
yaml .github/workflows/claude.yml — env секция
env: # Из GitHub Secrets (Settings → Secrets → Actions) ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} # Модель — в переменной репозитория (не секрет) ANTHROPIC_MODEL: claude-sonnet-5 # Без ANSI-цветов для читабельных логов NO_COLOR: "1"
⚠️
ANTHROPIC_API_KEY должен быть только в GitHub/GitLab Secrets — никогда в коде, никогда в .env файлах которые попадают в репозиторий. При утечке ключа — немедленно деактивируйте его в console.anthropic.com.
3

Workflow запускается при открытии PR или добавлении новых коммитов. CC анализирует diff, проверяет безопасность, качество кода и логические ошибки, затем публикует комментарий прямо в PR через GitHub API.

1
Checkout с полной историейfetch-depth: 0 чтобы получить разницу между ветками.
2
Установка CCnpm install -g @anthropic-ai/claude-code. Кешировать через actions/cache для ускорения.
3
Генерация diffgit diff origin/main...HEAD ограничивает анализ только изменёнными файлами.
4
Публикация через github-script — читает Markdown-вывод CC и создаёт комментарий в PR.
Полный workflow
yaml .github/workflows/claude-review.yml
name: Claude Code Review on: pull_request: types: [opened, synchronize] jobs: claude-review: runs-on: ubuntu-latest permissions: contents: read pull-requests: write # нужно для создания комментария steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # полная история для git diff - name: Cache node modules uses: actions/cache@v4 with: path: ~/.npm key: claude-code-${{ runner.os }} - name: Install Claude Code run: npm install -g @anthropic-ai/claude-code - name: Generate PR diff run: | git diff origin/${{ github.base_ref }}...HEAD \ -- '*.php' '*.ts' '*.vue' '*.py' \ > /tmp/pr_diff.txt # Проверить что diff не пустой if [ ! -s /tmp/pr_diff.txt ]; then echo "No code changes detected, skipping review" echo "SKIP_REVIEW=true" >> $GITHUB_ENV fi - name: Run Claude Review if: env.SKIP_REVIEW != 'true' env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} NO_COLOR: "1" run: | claude -p "Ты — senior code reviewer. Проанализируй этот PR diff. Проверь: 1. **Безопасность** — SQL-инъекции, XSS, незащищённые endpoint-ы 2. **Ошибки** — логические баги, null pointer, race conditions 3. **Качество** — дублирование кода, нарушение SOLID, сложность 4. **Производительность** — N+1 запросы, неоптимальные алгоритмы Формат вывода — GitHub Markdown с ### заголовками. Если проблем нет — напиши что всё хорошо, не выдумывай. Максимально конкретно: файл, строка, что исправить. Diff: $(cat /tmp/pr_diff.txt)" \ --no-interactive \ --max-tokens 4096 \ > /tmp/review.md - name: Post Review Comment if: env.SKIP_REVIEW != 'true' uses: actions/github-script@v7 with: script: | const fs = require('fs'); const review = fs.readFileSync('/tmp/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}\n\n---\n_Автоматический анализ Claude Code_` });
🎯
Фильтр -- '*.php' '*.ts' '*.vue' '*.py' в git diff критически важен. Без него в промпт попадут изменения lock-файлов, изображений, миграций — и вы потратите токены впустую. Адаптируйте расширения под свой проект.

Официальный GitHub Action от Anthropic

Начиная с мая 2026, Anthropic выпустил официальный action anthropics/claude-code-action@v1, который берёт на себя установку, аутентификацию и запуск CC — без необходимости вручную писать npm install -g @anthropic-ai/claude-code. Action реагирует на review-комментарии в PR и поддерживает явное ограничение инструментов через allowedTools.

Workflow с официальным action
yaml .github/workflows/claude-action.yml
name: Claude Code Review on: pull_request_review_comment: types: [created] jobs: claude: runs-on: ubuntu-latest steps: - uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} prompt: "Review for correctness and security. Comment on specific lines. Do not modify files." claude_args: "--max-turns 12 --model sonnet --allowedTools 'Read,Grep,Glob'"
💡
Параметр allowedTools ограничивает набор инструментов которые CC может использовать в данном job. Для review достаточно Read,Grep,Glob — CC не сможет случайно изменить файлы или вызвать внешние API.

Continuation — продолжение сессии между стадиями пайплайна

Флаг --resume <session_id> позволяет продолжить работу CC в следующем job с тем же контекстом, что накопил предыдущий. Это особенно полезно в многостадийных пайплайнах: первая стадия находит проблемы, вторая — пишет тесты для найденного, не теряя контекст.

Continuation между стадиями
bash multi-stage-pipeline.sh
# Первая стадия — review с сохранением session_id session_id=$(claude -p "Start review of auth module." \ --output-format json | jq -r '.session_id') # Передать session_id как output в следующий job echo "session_id=${session_id}" >> $GITHUB_OUTPUT # Вторая стадия — с тем же контекстом claude -p "Now write missing tests for what you found." \ --resume "$session_id"

Новые флаги headless-режима Новое · июнь 2026

ФлагНазначение
--max-budget-usd X Денежный потолок на один запуск — CC останавливается при достижении лимита
--max-turns N Жёсткий лимит итераций — предотвращает бесконечные циклы в CI
--output-format json JSON-вывод для машинного парсинга (содержит session_id, total_cost_usd)
--resume <session_id> Продолжение существующей сессии с сохранённым контекстом

5 рычагов контроля расходов в CI

Флаг / методНазначение
--max-turns NЖёсткий лимит итераций
--max-budget-usd XДенежный потолок на запуск
--model sonnetSonnet для рутины, Opus для сложного анализа
concurrency groupsЛимит параллельных jobs в GitHub Actions
pipeline timeoutОбщий таймаут workflow

OpenTelemetry — наблюдаемость CI-агентов Новое · июнь 2026

CC поддерживает экспорт телеметрии через OTLP — трейсы и метрики можно отправлять в любой совместимый коллектор (Grafana, Jaeger, Datadog и др.).

bash Включение OpenTelemetry
export CLAUDE_CODE_ENABLE_TELEMETRY=1 export OTEL_METRICS_EXPORTER=otlp export OTEL_EXPORTER_OTLP_ENDPOINT=http://collector.internal:4317

Ночные задачи по расписанию

yaml .github/workflows/nightly-docs.yml
on: schedule: - cron: "0 3 * * *" # каждую ночь в 03:00 UTC jobs: refresh: runs-on: ubuntu-latest steps: - uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} prompt: "Update API reference docs. Open a PR." claude_args: "--max-turns 20 --model sonnet"
🛡️
Принцип безопасного CI/CD (июль 2026): Non-interactive jobs НЕ пушат напрямую в main. Только PR с тестами и evidence для human review. Автоматические коммиты в main без ревью — антипаттерн независимо от уровня уверенности модели.
4

Workflow запускается при пуше в main только если изменились файлы в app/ или src/. CC обновляет документацию на основе изменённых файлов и автоматически делает commit.

Workflow обновления документации
yaml .github/workflows/auto-docs.yml
name: Auto-update Documentation on: push: paths: - 'app/**/*.php' - 'src/**/*.ts' branches: [main] jobs: update-docs: runs-on: ubuntu-latest permissions: contents: write # нужно для git push steps: - uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - name: Install Claude Code run: npm install -g @anthropic-ai/claude-code - name: Get changed files id: changes run: | CHANGED=$(git diff HEAD~1 --name-only | \ grep -E '\.(php|ts)$' | \ tr '\n' ' ') echo "files=${CHANGED}" >> $GITHUB_OUTPUT - name: Update API documentation env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} NO_COLOR: "1" run: | claude -p "Обнови документацию в docs/api.md. Изменённые файлы в этом коммите: ${{ steps.changes.outputs.files }} Правила: - Не меняй существующую структуру документа - Обновляй только разделы связанные с изменёнными файлами - Если появились новые публичные методы — добавь их описание - Удалённые методы — удали из документации - Сохраняй стиль и язык существующей документации" \ --no-interactive \ --max-tokens 3000 - name: Commit if changed run: | git config user.name "Claude Bot" git config user.email "claude-bot@noreply.github.com" git add docs/ # exit 0 если нечего коммитить git commit -m "docs: auto-update API docs [skip ci]" || exit 0 git push
💡
Тег [skip ci] в сообщении коммита предотвращает рекурсивный запуск workflow. Без него каждый авто-коммит документации снова запускал бы этот же job.
5
Workflow генерации PHPUnit тестов
yaml .github/workflows/claude-test-gen.yml
name: Claude Test Generator on: pull_request: types: [opened] # только при открытии, не при каждом push jobs: generate-tests: runs-on: ubuntu-latest permissions: contents: write pull-requests: write steps: - uses: actions/checkout@v4 with: ref: ${{ github.head_ref }} # checkout ветки PR token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 - name: Install dependencies run: | npm install -g @anthropic-ai/claude-code composer install --no-interaction - name: Generate missing tests env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} NO_COLOR: "1" run: | # Берём только PHP-файлы из app/ (максимум 5 чтобы не превысить лимит) CHANGED=$(git diff origin/main --name-only | \ grep '^app/.*\.php$' | \ head -5) for file in $CHANGED; do # Предполагаемый путь теста TEST_FILE="${file/app\//tests\/Unit\/}" TEST_FILE="${TEST_FILE%.php}Test.php" if [ ! -f "$TEST_FILE" ]; then echo "Generating test for: $file → $TEST_FILE" mkdir -p "$(dirname "$TEST_FILE")" claude -p "Напиши PHPUnit тест для класса в файле $file. Требования: - Сохрани результат в $TEST_FILE - Используй Mockery для зависимостей - Тестируй публичные методы класса - Покрой граничные случаи (null, пустые массивы, исключения) - Namespace теста: App\\Tests\\Unit соответствующий пути файла - Читай исходный файл чтобы понять логику Содержимое $file: $(cat $file)" \ --no-interactive \ --max-tokens 3000 else echo "Test already exists: $TEST_FILE" fi done - name: Run generated tests run: | php artisan test --filter Unit 2>&1 | tail -20 - name: Commit generated tests run: | git config user.name "Claude Bot" git config user.email "claude-bot@noreply.github.com" git add tests/ git commit -m "test: add auto-generated unit tests" || exit 0 git push
🧪
Генерация тестов только при types: [opened] — не на каждый push. Это предотвращает дублирование тестов при последующих коммитах в PR и снижает расходы на API.
6
Полный .gitlab-ci.yml с CC
yaml .gitlab-ci.yml
stages: - review - test - docs # Общие переменные для всех job-ов с CC .claude-defaults: &claude-defaults image: node:20-alpine before_script: - npm install -g @anthropic-ai/claude-code - apk add --no-cache git variables: NO_COLOR: "1" # ── Code Review для Merge Requests ────────────────────────────── claude-review: <<: *claude-defaults stage: review script: - | git fetch origin "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" git diff origin/"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME"...HEAD \ -- '*.php' '*.ts' '*.py' > /tmp/diff.txt if [ ! -s /tmp/diff.txt ]; then echo "No code changes, skipping."; exit 0 fi claude -p "Review this MR diff. Check: security, bugs, code quality. Format: GitLab Markdown. Be specific (file + line). Diff: $(cat /tmp/diff.txt)" \ --no-interactive \ --max-tokens 4096 > review.md artifacts: paths: [review.md] expose_as: "Claude Review" when: always rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # ── Security scan для любого push ─────────────────────────────── claude-security: <<: *claude-defaults stage: review script: - | CHANGED=$(git diff HEAD~1 --name-only | grep '\.\(php\|py\|ts\)$') if [ -z "$CHANGED" ]; then exit 0; fi claude -p "Security scan. Files: $CHANGED. Find: SQLi, XSS, hardcoded secrets, path traversal, SSRF. Output JSON: {issues:[{file,line,severity,description}]}" \ --output-format json \ --no-interactive > security.json # Провалить job если найдены Critical уязвимости if jq -e '.issues[] | select(.severity=="critical")' security.json; then echo "CRITICAL security issues found!"; exit 1 fi artifacts: paths: [security.json] when: always rules: - if: '$CI_COMMIT_BRANCH == "main"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
🔗
Артефакт expose_as: "Claude Review" добавляет ссылку прямо в MR UI GitLab — разработчик видит кнопку «Claude Review» без необходимости искать артефакты вручную.
7
⚠️
Частая ошибка новичков — форки и secrets: в GitHub Actions, workflow, запущенные из форкнутого PR, по умолчанию не получают доступ к secrets репозитория. Если вы настраиваете CC review через pull_request триггер — убедитесь что он использует pull_request_target для форков, а не просто pull_request. Иначе workflow будет падать с ошибкой авторизации, а в логах появится частичный промпт без ANTHROPIC_API_KEY.
🔒
Обязательные правила безопасности
  • НИКОГДА не хардкодить API key — только через Secrets/Variables в CI-платформе
  • Ротировать ключи при любом подозрении на утечку (логи, коммит, форк репозитория)
  • Использовать отдельный API ключ для CI, не личный ключ разработчика
  • Настроить budget alerts в console.anthropic.com чтобы не получить сюрпризный счёт
  • Никогда не публиковать вывод CC в открытые artifacts если diff содержал секреты

Защита от злоупотреблений

Фильтры перед запуском CC
yaml Защитные проверки перед запуском CC
- name: Check if Claude Code should run id: should-run run: | # 1. Не запускать для PR от ботов (Dependabot, Renovate) if [[ "${{ github.actor }}" == *"[bot]"* ]]; then echo "Skipping CC for bot PRs" echo "run=false" >> $GITHUB_OUTPUT exit 0 fi # 2. Не запускать если изменились только docs/конфиги CHANGED=$(git diff origin/${{ github.base_ref }} --name-only) if echo "$CHANGED" | grep -qvE '\.(md|txt|yml|yaml|json|lock)$'; then echo "Code changes detected, will run CC" echo "run=true" >> $GITHUB_OUTPUT else echo "Only non-code files changed, skipping CC" echo "run=false" >> $GITHUB_OUTPUT fi - name: Run Claude Review if: steps.should-run.outputs.run == 'true' run: | # Rate limit: один review на PR (проверить нет ли уже комментария) EXISTING=$(gh pr view ${{ github.event.number }} \ --json comments \ --jq '.comments[] | select(.body | startswith("## 🤖 Claude")) | .id') if [ -n "$EXISTING" ]; then echo "Review already exists, skipping"; exit 0 fi # ... основной review ...

Ограничение прав CC в CI

yaml Минимальные permissions для CI job
jobs: claude-review: permissions: # Только необходимые права — принцип минимальных привилегий contents: read # читать файлы репозитория pull-requests: write # писать комментарии в PR # НЕ нужно: issues, deployments, packages, etc. steps: - name: Run Claude (read-only task) run: | # CC запускается только для анализа, не для изменения файлов claude -p "Проанализируй diff и дай рекомендации. НЕ МЕНЯЙ файлы." \ --no-interactive
Аудит использования CC в CI
  • Логировать все CC-вызовы с timestamp, PR-номером, актором
  • Хранить логи минимум 90 дней для расследования инцидентов
  • Настроить alert при резком росте числа API-вызовов (возможная атака)
  • При fork PR — проверять что runner не даёт доступ к secrets (в GitHub это по умолчанию)
8

Pre-commit hooks запускаются на машине разработчика до коммита — это самый ранний рубеж защиты. CC-интеграция здесь дополняет, не заменяет, инструменты вроде gitleaks или truffleHog.

Конфигурация pre-commit с CC
yaml .pre-commit-config.yaml
repos: # Стандартные инструменты (быстрые, без API) - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.6.0 hooks: - id: detect-private-key - id: check-added-large-files args: [--maxkb=500] # Claude Code — только для security check - repo: local hooks: - id: claude-security-check name: Claude Security Check language: system pass_filenames: false stages: [commit] entry: bash -c | DIFF=$(git diff --cached -- '*.php' '*.py' '*.ts') if [ -z "$DIFF" ]; then exit 0; fi RESULT=$(claude -p "Security check. Find ONLY critical issues: SQL injection, hardcoded API keys/passwords, command injection. Output: SAFE или list of issues. Be brief. Diff: $DIFF" \ --no-interactive \ --max-tokens 500 2>&1) echo "$RESULT" if echo "$RESULT" | grep -qi "SAFE"; then exit 0; fi exit 1
CC-хук в pre-commit добавляет ~3–5 секунд задержки перед каждым коммитом из-за API-вызова. Используйте --max-tokens 500 и краткий промпт чтобы минимизировать время. Команда может отключить хук через SKIP=claude-security-check git commit.
9
💰
Правильная модель
Для простых задач (стиль кода, lint) — claude-haiku. Для security review — claude-sonnet. Экономия 10–20x.
✂️
Фильтрация diff
Передавайте только изменённые файлы нужных расширений. Lock-файлы, images — исключать всегда.
🔢
Лимит токенов
--max-tokens 4096 для review, 500 для быстрых проверок. Устанавливайте всегда.
🎯
Один раз на PR
Review только на opened, не на synchronize. Или проверять наличие предыдущего комментария.
🔔
Budget alerts
console.anthropic.com → Billing → Alerts. Порог $50/день для предупреждения.
📊
Мониторинг usage
Логируйте число токенов каждого CC-вызова. Аномальный рост = что-то пошло не так.
Конфигурация модели для разных задач CI
yaml Выбор модели по задаче
env: # Дешёвая модель для простых задач (lint, style) CLAUDE_LINT_MODEL: claude-haiku-4-5 # Основная модель для review и анализа CLAUDE_REVIEW_MODEL: claude-sonnet-5 steps: - name: Style check (cheap) run: | ANTHROPIC_MODEL=$CLAUDE_LINT_MODEL \ claude -p "Check PSR-12 compliance in changed files. Report violations only." \ --max-tokens 1000 \ --no-interactive - name: Security review (quality) run: | ANTHROPIC_MODEL=$CLAUDE_REVIEW_MODEL \ claude -p "Deep security analysis of this diff..." \ --max-tokens 4096 \ --no-interactive
10
Задача В CI? Почему / Почему нет Рекомендуемый триггер
Code review PR Да Быстрая обратная связь без ожидания разработчика pull_request: opened
Security scan Да Ранняя защита, автоматизируется чётко push + pull_request
Генерация тестов Да Экономит время, тесты требуют review как обычный код pull_request: opened
Обновление docs Да Документация актуальна без ручной работы push: main
Release notes Да Хорошо поддаётся автоматизации по git log release: published
Рефакторинг Нет Требует понимания контекста и human review изменений Интерактивно, с проверкой
DB миграции Нет Необратимые операции — слишком высокий риск Только вручную с approvals
Deploy в production Нет Критическая операция, всегда нужен human approval Ручной триггер + approvals
Изменение config prod Нет Высокий риск, невозможно автоматически проверить корректность Только вручную
Правило: CC в CI = только read + suggest, не execute + deploy Human review обязателен для рефакторинга

С чего начать: минимальная интеграция за 15 минут

1
Добавьте ANTHROPIC_API_KEY в GitHub Secrets — Settings → Secrets → Actions → New repository secret.
2
Создайте файл .github/workflows/claude-review.yml с кодом из секции 3. Адаптируйте расширения файлов под ваш стек.
3
Откройте тестовый PR с любым изменением кода и проверьте что workflow запустился и создал комментарий.
4
Настройте budget alert в console.anthropic.com чтобы получить email при превышении порога расходов.
5
Добавьте фильтры из секции 7 (пропуск bot PRs, только code changes) чтобы не тратить токены на шум.
🔗
Смотрите также: Оптимизация токенов — как снизить расходы при частом использовании CC в CI. Паттерны экспертов — Verification First как культура ревью. Мульти-агентность — параллельные CC-агенты для больших пайплайнов.