Claude Code в CI полезен ровно настолько, насколько узко ему выданы права. Официальная GitHub Action - anthropics/claude-code-action@v1; она сама выбирает режим интерактивного упоминания или немедленной автоматизации по триггеру и конфигу. Основные входы - prompt, ключ anthropic_api_key или облачная аутентификация и claude_args для флагов. Но главное в CI - не то, что агент умеет, а то, что ему разрешено: least privilege здесь не рекомендация, а условие безопасности.
Разумный workflow начинается с минимальных permissions. Полезно один раз увидеть цельный пример: триггер на pull_request, permissions в объёме contents read и pull-requests write, concurrency с отменой предыдущих прогонов, checkout с persist-credentials false и вызов action с prompt и узким claude_args. Ключ хранится только в GitHub Secrets, а claude_args ограничивает max-turns и allowedTools чтением. Такой workflow делает ровно то, что нужно для review, и ничего сверх.
Permissions выдают строго под требуемое поведение. Комментировать issue может потребовать issues write, а commit и push - contents write; выдавать write "на всякий случай" нельзя. Отдельная осторожность - fork-PR: у GitHub своя secret-модель для форков, и запускать привилегированный недоверенный код без отдельного дизайна опасно. Быстрая установка есть через /install-github-app, но production-workflow всё равно ревьюят как код, а для Bedrock и Google Cloud предпочитают OIDC вместо долгоживущих ключей.
GitLab интегрируют похоже, но своими средствами. Официальная интеграция использует CI-job, Claude Code и GitLab MCP-сервер, и для production документация рекомендует ручную настройку. Переменные хранят API- или облачные credentials и доступ к GitLab, а job rules ограничивают источники и ветки pipeline. Полезно один раз увидеть минимальный read-only пример: job на merge-request, установка Claude Code, bare-прогон с dontAsk и узким allowlist, результат в артефакт.
Важно понимать границы такого минимального примера. Read-only job сам по себе не публикует комментарий - он лишь готовит результат. Для полноценного взаимодействия с GitLab следуют официальной настройке MCP-сервера и выдают только необходимые API-scopes; write-инструменты вроде mcp__gitlab не добавляют, пока job действительно не должен комментировать или создавать merge request. Это тот же принцип least privilege: сначала read-only и артефакт, а право записи - только под доказанную потребность.
Общий security-чек-лист CI собирает всё в одну проверку. Источник action, образа и установки закреплён или контролируемо обновляется; секреты только в CI secret store; OIDC вместо долгоживущего облачного ключа, где возможно; триггер не даёт недоверенному fork-коду доступ к привилегированным секретам; permissions на contents, issues и PR минимальны; allowedTools, режим, sandbox и сеть ограничены; заданы лимиты ходов, бюджета, таймаута и concurrency; вывод и артефакт не содержат секретов и имеют retention; перед merge и deploy - человеческий review.
Полезно один раз оформить этот чек-лист явно и проходить его при каждом изменении CI-конфигурации; ниже он и приведён. Каждый пункт закрывает свой класс риска: закреплённый источник - подмену зависимости, минимальные permissions - лишний доступ, OIDC - утечку ключа, лимиты - неконтролируемый расход, human review - слепое доверие к прогону. CI - место, где ошибка в правах дорога, потому что повторяется на каждом прогоне.
# Security checklist CI
[ ] action/image/install source закреплён или контролируемо обновляется
[ ] secrets только в CI secret store; OIDC вместо long-lived ключа
[ ] триггер не даёт untrusted fork-коду привилегированный secret
[ ] contents/issues/PR permissions минимальны
[ ] allowedTools, mode, sandbox и network ограничены
[ ] max turns, budget, timeout, concurrency заданы
[ ] output/artifact без secret и с retention
[ ] human review перед merge/deployТипичные провалы CI предсказуемы и дороги. Выдать contents write "на всякий случай" и позволить агенту пушить в защищённую ветку. Запустить привилегированный workflow на fork-PR без отдельной модели безопасности. Захардкодить ключ вместо GitHub Secrets или OIDC. Добавить write-инструменты MCP до того, как они реально нужны. И не поставить лимиты ходов, бюджета и таймаута, отпустив расход. Давайте минимально необходимые права, храните секреты в CI-store и держите человека на merge - в CI цена ошибки умножается на число прогонов.
name: Claude review
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read # минимум под review
pull-requests: write
concurrency:
group: claude-review-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
review:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
with: { persist-credentials: false }
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: "Review this pull request. Do not modify files."
claude_args: "--max-turns 8 --allowedTools Read,Grep,Glob"