Claude Code в CI/CD: неинтерактивный режим -p и GitHub Actions

Claude Code умеет работать без интерфейса: принимает задачу в -p, выполняет и завершается. Разбираем флаги из документации и рабочий workflow для ревью pull request.

5 мин · · разработка · автоматизация

Claude Code в CI полезен там, где задача повторяется на каждом коммите: ревью диффа, разбор упавшего билда, черновик описания PR. Для этого есть неинтерактивный режим -p: Claude Code получает промпт, выполняет работу, печатает результат и завершается. Ниже — флаги из официальной документации (страницы Run Claude Code programmatically и CLI reference) и рабочий workflow для GitHub Actions с ключом Zukko.

Неинтерактивный режим: флаг -p

bash
claude -p "What does the auth module do?"

-p (или --print) запускает Claude Code без интерактивного интерфейса. Режим читает stdin, поэтому данные можно передавать через пайп:

bash
cat build-error.txt | claude -p "concisely explain the root cause of this build error" > output.txt

Объём stdin ограничен 10 МБ. Большие данные лучше записать в файл и указать путь в промпте.

Формат вывода

--output-format принимает три значения:

  • text — обычный текст (по умолчанию);
  • json — JSON с полями result (текст ответа), session_id, данными об использовании и total_cost_usd;
  • stream-json — построчный JSON-поток событий (вместе с --verbose).

Формата markdown нет. Если нужен Markdown-отчёт, попросите его в промпте и достаньте текст из result:

bash
claude -p "Summarize this project" --output-format json | jq -r '.result'

Для строгой структуры есть --json-schema: ответ по схеме придёт в поле structured_output.

Поле total_cost_usd — оценка на стороне клиента по ценам, которые знает Claude Code. При работе через шлюз она не совпадает с реальным списанием. Фактический расход смотрите в кабинете Zukko в разделе «Использование».

Разрешения: без человека никто не нажмёт «Да»

В CI отвечать на запросы разрешений некому, поэтому их нужно задать заранее:

  • --allowedTools "Read,Edit,Bash" — инструменты без запроса. Поддерживается синтаксис правил, например "Bash(git diff *)" разрешает только команды, начинающиеся с git diff;
  • --permission-mode acceptEdits — правки файлов и типовые файловые команды без запроса;
  • --permission-mode dontAsk — запрещает всё, что потребовало бы подтверждения, кроме явно разрешённого. Подходит для «запертых» прогонов;
  • --max-turns 10 — ограничивает число шагов агента;
  • --max-budget-usd 1 — останавливает работу по достижении суммы (считается по той же клиентской оценке).

Флаг --bare пропускает автозагрузку хуков, навыков, субагентов, MCP-серверов и CLAUDE.md. Документация рекомендует его для скриптов, чтобы результат не зависел от настроек машины. Перед включением в CI проверьте локально, что запуск с --bare авторизуется через ваш шлюз.

Без --bare режим -p выполняет хуки из .claude/settings.json проекта и подключает серверы из .mcp.json без вопросов. Для PR из форков это повод не давать workflow лишних прав.

Workflow GitHub Actions: ревью pull request

Файл .github/workflows/claude-review.yml:

bash
name: Claude Code review

on:
  pull_request:
    branches: [main]

permissions:
  contents: read
  pull-requests: write

jobs:
  review:
    runs-on: ubuntu-latest
    timeout-minutes: 15

Что здесь важно:

  1. Установщик кладёт claude в ~/.local/bin. Строка с GITHUB_PATH делает команду доступной в следующих шагах. Можно ставить и через npm install -g @anthropic-ai/claude-code.
  2. Ключ хранится в секрете репозитория: Settings → Secrets and variables → Actions → New repository secret, имя ZUKKO_API_KEY.
  3. ANTHROPIC_BASE_URL указывается без /v1. Ключ передаётся через ANTHROPIC_AUTH_TOKEN.
  4. Агенту разрешено только чтение файлов (--allowedTools "Read"), диф уже лежит в файле. Комментарий публикует отдельный шаг через gh, а не сам агент.
  5. Права workflow ограничены блоком permissions: чтение кода и запись комментариев к PR.

GitHub по умолчанию не передаёт секреты в workflow, запущенные из PR форков. Для публичных репозиториев это нормальное поведение, а не ошибка настройки.

У Anthropic есть и готовый action anthropics/claude-code-action@v1, ему CLI-флаги передаются через параметр claude_args. В его документации описана авторизация ключом Anthropic или токеном подписки. Если хотите использовать его со шлюзом, сначала сверьтесь с README action. Workflow выше от action не зависит.

Отдельный ключ Zukko для CI

Создайте в кабинете отдельный ключ только для CI:

  • понятное имя, например ci-claude-review;
  • дневной и месячный лимит в долларах;
  • список разрешённых моделей (allowed_models), например только claude-sonnet-5.

Если workflow запросит другую модель, шлюз вернёт 403 model_not_allowed_for_key. При нехватке баланса будет 402, при слишком частых запросах — 429. Отдельный ключ легко отозвать, и он не смешивает расходы CI с вашими.

Оценка стоимости по формуле. Допустим, один прогон ревью отправляет 150 000 входных токенов (диф, прочитанные файлы, системный промпт) и получает 5 000 выходных. На claude-sonnet-5 ($0.3 за 1M на вход и на выход): (150 000 + 5 000) × $0.3 / 1 000 000 ≈ $0.047. При 20 PR в день это около $0.93. Реальные цифры зависят от размера дифа и числа шагов, смотрите их в разделе «Использование». Оговорка про кэш: у вендора чтение из кэша промптов стоит около 10% входной цены, а в Zukko кэшированные токены оплачиваются по обычной входной цене. Для агентных прогонов с большим повторяющимся контекстом реальная разница с официальным прайсом меньше, чем при прямом сравнении цен.

Актуальный список моделей — GET https://api.zukko.pro/v1/models или страница «Модели» в кабинете. Базовая настройка Claude Code описана в документации Zukko, коды ошибок и лимиты ключей — на странице Key limits and cache.

Частые проблемы

Агент «завис» или ничего не изменил

Скорее всего, нужный инструмент не разрешён: в -p запрос разрешения без хоста отклоняется. Добавьте инструмент в --allowedTools или задайте --permission-mode.

Ошибка 401

Проверьте, что секрет называется так же, как в workflow, и ключ записан без пробелов. Убедитесь, что используется ANTHROPIC_AUTH_TOKEN.

Прогон завершился по лимиту шагов

--max-turns завершает работу с ошибкой при достижении лимита. Увеличьте значение или сузьте задачу.

Частые вопросы

Можно ли продолжить сессию из предыдущего шага?

Да: claude -p --continue "..." продолжает последнюю беседу в текущей папке. Для конкретной сессии используйте --resume <session_id>, session_id берётся из JSON-ответа.

Как задать модель в CI?

Переменной ANTHROPIC_MODEL в блоке env или флагом --model claude-sonnet-5. Флаг имеет приоритет.

Может ли агент сам закоммитить исправления?

Может, если разрешить ему нужные команды, например --allowedTools "Bash(git diff *),Bash(git commit *)", и дать workflow право contents: write. Для ревью безопаснее оставлять агенту только чтение.

Работают ли субагенты и MCP в режиме -p?

Да, если не указан --bare. Серверы можно передать явно флагом --mcp-config, субагентов — флагом --agents.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.