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
claude -p "What does the auth module do?"-p (или --print) запускает Claude Code без интерактивного интерфейса. Режим читает stdin, поэтому данные можно передавать через пайп:
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:
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:
name: Claude Code review
on:
pull_request:
branches: [main]
permissions:
contents: read
pull-requests: write
jobs:
review:
runs-on: ubuntu-latest
timeout-minutes: 15Что здесь важно:
- Установщик кладёт
claudeв~/.local/bin. Строка сGITHUB_PATHделает команду доступной в следующих шагах. Можно ставить и черезnpm install -g @anthropic-ai/claude-code. - Ключ хранится в секрете репозитория: Settings → Secrets and variables → Actions → New repository secret, имя
ZUKKO_API_KEY. ANTHROPIC_BASE_URLуказывается без/v1. Ключ передаётся черезANTHROPIC_AUTH_TOKEN.- Агенту разрешено только чтение файлов (
--allowedTools "Read"), диф уже лежит в файле. Комментарий публикует отдельный шаг черезgh, а не сам агент. - Права 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.
Похожие статьи
- Перевод субтитров нейросетью: SRT без сбитых таймкодовГлавный риск при переводе SRT нейросетью — сломанная структура файла. Показываем схему, где таймкоды не попадают к модели, и скрипт на Python с проверкой.
- Редактирование текстов нейросетью: корректура, стиль и сокращениеРазные виды редактуры требуют разных промптов. Показываем формулировки для корректуры, стиля и сокращения, как получать правки с объяснением и не терять авторский голос.
- Нейросеть для написания скриптов: Bash, PowerShell и PythonМодель быстро пишет скрипты для рутины, но запускать их вслепую нельзя. Показываем, как ставить задачу, требовать безопасный режим dry-run и проверять результат до запуска.
- Dify в Docker: установка, первичная настройка и подключение моделейСтавим Dify через Docker Compose, создаём администратора и подключаем модели Claude, GPT и DeepSeek по одному ключу. Отдельно — что делать, если контейнеры не стартуют.