Подключили автоматическое код-ревью (Anthropic Claude) на каждый PR в
develop. Ниже — рецепт и нюансы, чтобы вы не потратили на это полдня, как мы 🙂Что нужно один раз
Поставить GitHub App Claude на репо (
/install-github-app из Claude Code или вручную).Сгенерить долгоживущий OAuth-токен:
claude setup-token (логин аккаунтом с активной подпиской Claude) → положить в секрет репо CLAUDE_CODE_OAUTH_TOKEN: gh secret set CLAUDE_CODE_OAUTH_TOKEN --repo <org>/<repo>(при таком подходе - action будет использовать лимиты вашей подписки, альтернатива сделать через API ключ - тогда использование будет оплачиваться по токенам)
Добавить workflow
.github/workflows/claude-review.yml.Рабочий конфиг (в тексте промта есть плейсхолдер для добавления вводных по архитектуре вашего проекта)
name: Claude PR Review
on:
pull_request:
types: [opened, synchronize, ready_for_review, reopened]
permissions:
contents: read
pull-requests: write
issues: write
id-token: write # ← без этого не пройдёт OIDC-обмен токена
concurrency:
group: claude-review-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
review:
if: ${{ github.event.pull_request.head.repo.fork != true }}
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
track_progress: true # ← сводный комментарий
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
<инструкции ревью + что пропускать>
Для построчных замечаний используй mcp__github_inline_comment__create_inline_comment (confirmed: true).
Для сводки — gh pr comment. Публикуй только через GitHub-комментарии.
claude_args: |
--model claude-opus-4-8
--max-turns 50
--allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)"
Грабли, на которые наступили (главное)
Workflow validation failed на каждом PR. Экшен требует, чтобы файл workflow был идентичен версии на default-ветке репо. У нас default = master, а файл лежал только на develop → падало всегда. Фикс: workflow должен быть на default-ветке.Нет
id-token: write → OIDC-обмен токена не проходит. Это разрешение обязательно.401 Invalid bearer token. Токен в секрете был невалиден - скопирован с переносом строки. Проще всего просто перевыпустить токен claude setup-token и скопировать аккуратно.Быстрая проверка токена вручную:
curl -s -o /dev/null -w "%{http_code}" https://api.anthropic.com/v1/messages \
-H "authorization: Bearer $TOKEN" -H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: oauth-2025-04-20" -H "content-type: application/json" \
-d '{"model":"claude-haiku-4-5-20251001","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'200 = живой, 401 = бракованный.Ошибка скрыта в логах. По умолчанию экшен маскирует вывод SDK («full output hidden for security») — настоящей ошибки не видно. На время отладки добавить
show_full_output: true (репо приватный — в логи видит только команда), потом убрать.error_max_turns. Дефолт --max-turns 10 мал: на большом PR Claude сжигает ходы на чтении сгенерённого/iOS-кода и не успевает написать ревью. Подняли до 50 + в промпте велели пропускать сгенерённые/платформенные файлы (tvolkova_client, **/generated/**, *.g.dart, *.pbxproj, локфайлы и т.п.).Ревью отрабатывало, но не попадало в PR — результат лежал только в логе прогона.
Чтобы публиковалось:
track_progress: true → сводный комментарий;в
--allowedTools добавить mcp__github_inline_comment__create_inline_comment → построчные комментарии;в промпте: «постить только через GitHub-комментарии, не выводить ревью текстом».
--allowedTools — это allow-list, так что туда же Bash(gh pr comm
