Codex в CI полезен ровно настолько, насколько узко ему выданы права, и OpenAI это учитывает в самом инструменте. Для GitHub Actions рекомендуется официальный openai/codex-action вместо ручной установки CLI и передачи API-ключа на весь job. Разница не косметическая: action запускает proxy и даёт отдельную стратегию безопасности, тогда как ручная установка с job-wide ключом открывает секрет всему, что выполняется в job. Правильный инструмент здесь - часть правильной границы.
Главное в CI - не то, что агент умеет, а то, что ему разрешено. Least privilege здесь не рекомендация, а условие безопасности: каждое лишнее право повторяется на каждом прогоне и умножает цену ошибки. Полезно один раз увидеть цельный минимальный workflow. Ниже - обзор pull request с permissions в объёме contents: read, checkout с persist-credentials: false, вызовом openai/codex-action и ключом только из GitHub Secrets. Он делает ровно то, что нужно для review, и ничего сверх.
Изоляция секретов - первый принцип CI-конфигурации. Ключ хранят только в GitHub Secrets и отдают его через action, а не задают на уровне всего job. Причина конкретна: если job запускает скрипты, управляемые репозиторием - dependency-хуки, build-шаги, - то секрет, доступный всему job, сможет прочитать недоверенный или скомпрометированный код. Proxy, который поднимает action, как раз и служит тому, чтобы агент работал с моделью, не раздавая ключ всему окружению прогона.
Permissions выдают строго под требуемое поведение, а не с запасом. Обзору достаточно contents: read - ему не нужно писать. Комментировать pull request потребует pull-requests: write; коммитить и пушить - contents: write. Выдавать write "на всякий случай" нельзя: это открывает агенту возможность изменить защищённое там, где задача этого не требует. Каждое право в workflow отвечает конкретной нужде, и если нужды нет - права нет, потому что в CI лишнее право дорого.
Отдельная осторожность - fork-PR и недоверенный код. У GitHub своя модель секретов для форков, и запускать привилегированный workflow на pull request из форка без отдельного дизайна опасно: недоверенный код не должен получать доступ к вашим секретам. Триггер настраивают так, чтобы код из форка не оказался с привилегированными правами. Это не паранойя, а прямое следствие того, что PR из форка - это код, написанный кем-то посторонним, и относиться к нему нужно соответственно.
Патчи и вывод - ещё одна граница, о которой легко забыть. Результат прогона - будь то патч, отчёт или комментарий - не должен содержать секретов и должен иметь понятный путь ревью человеком до применения. Автоматически сгенерированный патч ревьюят как любой другой код: CI генерирует предложение, а решение о merge остаётся за человеком. Least privilege касается и того, что прогон производит наружу, а не только того, что он может прочитать.
Смысл CI-дисциплины - в том, что ошибка в правах здесь дороже, чем где-либо, потому что повторяется автоматически. Один раз выданное лишнее право срабатывает на каждом прогоне, а не единожды. Поэтому CI-конфигурацию ревьюят как код на каждом изменении: не расширились ли permissions, откуда берётся action и его версия, изолирован ли секрет, есть ли лимиты. Официальный action, минимальные права и человек на merge - это не перестраховка, а базовая гигиена автоматизации.
Типичные провалы CI предсказуемы и дороги. Поставить CLI вручную и задать API-ключ на весь job вместо action с изоляцией. Выдать contents: write "на всякий случай" и позволить пушить в защищённую ветку. Запустить привилегированный workflow на fork-PR без отдельной модели безопасности. И применить сгенерированный патч без ревью человеком. Используйте официальный action, давайте минимальные permissions, изолируйте секрет, осторожно обращайтесь с форками и держите человека на merge.
name: Codex review
on:
pull_request:
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read # минимум под review
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: openai/codex-action@v1
with:
openai-api-key: ${{ secrets.OPENAI_API_KEY }}
prompt: |
Review this pull request for correctness risks. Do not modify files.