Русский

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, если необходимо разрешить запуск учётным записям служб помимо участников с правами на запись, которым это разрешено по умолчанию.