GitHub Action для Codex
Запускайте действия Codex по событиям GitHub
Используйте GitHub Action для Codex (openai/codex-action@v1), чтобы запускать Codex в заданиях CI/CD, применять исправления или публиковать результаты проверки из рабочего процесса GitHub Actions.
Это действие устанавливает Codex CLI, запускает прокси Responses API при предоставлении API key и выполняет codex exec с указанными вами разрешениями.
Используйте это действие, если хотите:
- Автоматизировать обратную связь от Codex по запросам на включение изменений или выпускам, не управляя CLI самостоятельно.
- Разрешать изменения только после прохождения проверок качества на основе Codex в рамках конвейера CI.
- Запускать повторяемые задачи Codex (проверку кода, подготовку выпуска, миграции) из файла рабочего процесса.
Пример для CI приведён в разделе Неинтерактивный режим, а исходный код доступен в репозитории openai/codex-action.
Предварительные требования
- Сохраните свой ключ OpenAI как секрет GitHub (например,
OPENAI_API_KEY) и укажите ссылку на него в рабочем процессе. - Запускайте задание на исполнителе Linux или macOS. Для Windows задайте
safety-strategy: unsafe. - Получите код из репозитория перед вызовом действия, чтобы Codex мог прочитать его содержимое.
- Определите, какие запросы нужно выполнять. Можно передать текст напрямую через
promptили указать с помощьюprompt-fileфайл, зафиксированный в репозитории.
Пример рабочего процесса
Приведённый ниже пример рабочего процесса проверяет новые запросы на включение изменений, сохраняет ответ Codex и публикует его в соответствующем PR.
name: Codex pull request review
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
codex:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
final_message: ${{ steps.run_codex.outputs.final-message }}
steps:
- uses: actions/checkout@v5
with:
ref: refs/pull/${{ github.event.pull_request.number }}/merge
fetch-depth: 0
persist-credentials: false
- name: Run Codex
id: run_codex
uses: openai/codex-action@v1
with:
openai-api-key: ${{ secrets.OPENAI_API_KEY }}
prompt-file: .github/codex/prompts/review.md
output-file: codex-output.md
post_feedback:
runs-on: ubuntu-latest
needs: codex
if: needs.codex.outputs.final_message != ''
permissions:
issues: write
pull-requests: write
steps:
- name: Post Codex feedback
uses: actions/github-script@v7
with:
github-token: ${{ github.token }}
script: |
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: process.env.CODEX_FINAL_MESSAGE,
});
env:
CODEX_FINAL_MESSAGE: ${{ needs.codex.outputs.final_message }}Замените .github/codex/prompts/review.md собственным файлом запроса или используйте входной параметр prompt, чтобы передать текст напрямую. В этом примере итоговое сообщение Codex также записывается в codex-output.md для последующей проверки или загрузки в качестве артефакта.
Настройка codex exec
Точно настройте работу Codex с помощью входных параметров действия, соответствующих параметрам codex exec:
promptилиprompt-file(выберите один): инструкции, передаваемые напрямую, либо путь в репозитории к файлу Markdown или текстовому файлу с вашей задачей. Рекомендуется хранить запросы в.github/codex/prompts/.codex-args: дополнительные флаги CLI. Передайте массив JSON (например,["--ephemeral"]) или строку командной оболочки (--profile ci), чтобы настроить сеансы, профили или параметры MCP.modelиeffort: выберите нужную конфигурацию агента Codex; оставьте пустыми, чтобы использовать значения по умолчанию.sandbox: выберите режим песочницы (workspace-write,read-only,danger-full-access) в соответствии с разрешениями, необходимыми Codex во время выполнения.output-file: сохраните итоговое сообщение Codex на диск, чтобы на последующих шагах его можно было загрузить или сравнить.codex-version: закрепите определённый выпуск CLI. Оставьте пустым, чтобы использовать последнюю опубликованную версию.codex-home: укажите общую домашнюю папку Codex, если хотите повторно использовать файлы конфигурации или настройки MCP на разных шагах.
Управление привилегиями
На исполнителях, размещённых на GitHub, Codex по умолчанию имеет широкие права доступа. Используйте следующие входные параметры, чтобы ограничить доступ:
safety-strategy(по умолчаниюdrop-sudo) удаляетsudoперед запуском Codex. Это необратимое для задания действие защищает секреты в памяти. В Windows необходимо задатьsafety-strategy: unsafe.unprivileged-userобъединяетsafety-strategy: unprivileged-userсcodex-user, чтобы запускать Codex от имени определённой учётной записи. Убедитесь, что пользователь может читать и изменять полученную копию репозитория (исправление прав владения показано в примереunprivileged-user).read-onlyзапрещает Codex изменять файлы и использовать сеть, однако Codex всё равно выполняется с повышенными привилегиями. Не полагайтесь только наread-onlyдля защиты секретов.sandboxограничивает доступ к файловой системе и сети внутри самого Codex. Выберите наиболее строгий вариант, при котором задачу всё ещё можно выполнить.allow-usersиallow-botsограничивают круг пользователей, которые могут запускать рабочий процесс. По умолчанию действие могут запускать только пользователи с правами на запись; явно перечислите дополнительные доверенные учётные записи либо оставьте поле пустым, чтобы сохранить поведение по умолчанию.
Получение выходных данных
Действие возвращает последнее сообщение Codex через выходной параметр final-message. Сопоставьте его с выходным параметром задания (как показано выше) или обработайте непосредственно на последующих шагах. Если хотите получить с исполнителя полную расшифровку сеанса, используйте output-file вместе с функцией загрузки артефактов. Если нужны структурированные данные, передайте --output-schema через codex-args, чтобы обеспечить соответствие заданной структуре JSON.
Контрольный список безопасности
- Ограничьте круг пользователей, которые могут запускать рабочий процесс. Отдавайте предпочтение доверенным событиям или явным подтверждениям, а не разрешайте всем запускать Codex для вашего репозитория.
- Очищайте входные данные запросов из запросов на включение изменений, сообщений коммитов и описаний задач, чтобы избежать внедрения инструкций. Проверяйте комментарии HTML и скрытый текст перед передачей в Codex.
- Защитите свой
OPENAI_API_KEY: оставьтеsafety-strategyв значенииdrop-sudoили запускайте Codex от имени непривилегированного пользователя. Никогда не оставляйте действие в режимеunsafeна исполнителях с несколькими арендаторами. - Запускайте Codex на последнем шаге задания, чтобы последующие шаги не унаследовали непредвиденные изменения состояния.
- Немедленно смените ключи, если подозреваете, что журналы прокси или выходные данные действия раскрыли секретные сведения.
Устранение неполадок
- Одновременно заданы prompt и prompt-file: удалите дублирующий входной параметр, чтобы остался ровно один источник.
- responses-api-proxy не записал сведения о сервере: убедитесь, что API key указан и действителен; прокси запускается только при передаче
openai-api-key. - Ожидалось удаление
sudo, но командаsudoвыполнилась успешно: убедитесь, что на предыдущих шагахsudoне был восстановлен, а ОС исполнителя — Linux или macOS. Перезапустите новое задание. - Ошибки разрешений после
drop-sudo: предоставьте права на запись до запуска действия (например, с помощьюchmod -R g+rwX "$GITHUB_WORKSPACE"или применив схему с непривилегированным пользователем). - Несанкционированный запуск заблокирован: измените входные параметры
allow-usersилиallow-bots, если необходимо разрешить запуск учётным записям служб помимо участников с правами на запись, которым это разрешено по умолчанию.