В документации OpenAI codex exec выделен как отдельный режим запуска Codex CLI без интерактивного диалога (описание неинтерактивного режима). Это позволяет подключить Codex CLI к удалённому Mac CI, но безопасная схема начинается не с запуска команды: сначала нужно определить рабочую директорию, песочницу и политику подтверждений, затем проверить результат контролируемой задачей. Ответ агента и его изменения в коде не заменяют сборку и тесты Xcode; недоверенные изменения нельзя направлять на постоянный узел с доступом к секретам.
Подходит: разработчикам iOS и macOS, переходящим от интерактивной работы с Codex CLI к скриптам; инженерам CI, обслуживающим GitHub Actions и macOS Runner; руководителям платформенных команд, которым нужно определить доступ к узлам, секретам и результатам сборки.
Не подходит: командам, которые ожидают, что сообщение агента само по себе подтвердит успешность сборки или безопасность изменений.
Последняя проверка: 12 ноября 2026 года. Сведения о поведении команд сверены с документацией OpenAI Codex CLI и справочником CLI, ограничения Runner — с документацией GitHub по безопасности Actions, требования к Xcode — с официальными системными требованиями Apple и примечаниями к выпуску Xcode 27. Если изменятся параметры Codex CLI, правила GitHub для Runner или требования Apple к Xcode, команды и версии среды следует сверить повторно.
001. Разделите работу агента, сборку Mac и управление заданием
В CI участвуют три разных механизма. Задача Codex CLI получает инструкцию и работает с доступными ей файлами. Сборка и тестирование Xcode запускаются отдельной командой в macOS-среде. GitHub Actions выбирает Runner и управляет этапами workflow. Если объединить эти роли в одно понятие «Codex собрал приложение», станет трудно понять, какой именно шаг изменил файлы, какой запустил компилятор и где возникла ошибка.
codex exec подходит для скриптового и CI-запуска без интерактивного диалога; конкретные параметры команды нужно проверять по текущему справочнику Codex CLI. GitHub Actions может направить задание на self-hosted Runner, если Runner зарегистрирован и выбран в workflow подходящими метками. Описание этого механизма приведено в руководстве GitHub по использованию self-hosted Runner в workflow.
При этом «удалённый Mac CI» не всегда означает один и тот же вариант исполнения. Это может быть выделенный Mac Runner, временный macOS Runner или отдельно управляемый Mac, на котором запускается задание. Уточните, где находится рабочая копия репозитория, как выбирается исполнитель и кто сохраняет журналы. Не предполагайте, что слово «удалённый» автоматически означает временную машину, изоляцию между заданиями или отсутствие доступа к постоянным учётным данным.
Может ли Codex CLI работать внутри задания GitHub Actions на macOS? Да, если выбранный исполнитель — Mac, на нём установлен и доступен Codex CLI, а workflow передаёт ему ожидаемую рабочую директорию и нужные полномочия. Это возможность запустить команду в задании, а не гарантия, что весь процесс безопасен или что результат соответствует требованиям проекта.
До написания workflow зафиксируйте границу ответственности: агент предлагает или выполняет ограниченные изменения; CI отдельно проверяет исходное состояние, вызывает инструменты Apple и фиксирует результаты. Если задача требует подписи, доступа к учётной записи разработчика или публикации, вынесите эти действия в отдельный этап с отдельными правилами допуска.
012. Подготовьте репозиторий и однозначный вход задачи
Частая причина ложного успеха — Codex CLI запущен не в той копии проекта. На удалённом Mac могут сосуществовать рабочая копия CI, каталог ручной проверки и незаконченный checkout предыдущего задания. Сначала определите, откуда берётся исходный код и какой commit должен обрабатывать агент; затем проверьте текущий каталог непосредственно перед запуском.
Для каждого задания задайте явные значения вместо неоговорённых настроек оболочки. В примерах ниже <путь-к-репозиторию>, <идентификатор-commit> и <инструкция> — заменяемые обозначения, а не реальные пути или данные:
cd "<путь-к-репозиторию>"
pwd
git rev-parse --show-toplevel
git status --short
git rev-parse HEAD
Сверьте вывод с ожидаемым каталогом, источником checkout и commit. Если рабочая копия содержит изменения до начала задания, не позволяйте агенту молча продолжить: определите, должны ли эти изменения быть частью входных данных. Иначе после запуска нельзя надёжно установить, какие файлы были изменены заданием, а какие существовали ранее.
До первого запуска составьте входной набор задачи:
- источник кода и событие, запустившее workflow;
- рабочая директория, целевой commit и способ подготовки checkout;
- инструкция агенту и допустимый перечень изменяемых файлов;
- требуемые инструменты, в том числе Xcode и выбранные средства сборки;
- пути к журналам, тестовым отчётам и итоговым артефактам;
- разрешённые секреты, сетевые ресурсы и причины, по которым они действительно необходимы.
Инструкцию агенту формулируйте как ограниченное задание: указать область анализа, требуемый формат результата и запрет на действия вне проекта. Но текст инструкции — это не механизм защиты. Даже точная формулировка не заменяет песочницу, контроль доступа к Runner и отдельное управление секретами.
Чтобы избежать смешения этапов, сохраняйте в артефактах исходный commit и итоговый diff отдельно. Если Codex CLI меняет файлы, последующая сборка должна работать именно с этой проверяемой версией дерева, а не с другой копией репозитория или последним состоянием ветки, полученным позднее.
023. Выберите неинтерактивный режим и минимальные полномочия
Настройка прав зависит от доверия к исходному коду и от того, требуется ли задаче менять проект. Ориентируйтесь на параметры текущей версии CLI и проверяйте их смысл непосредственно перед использованием по официальной справке Codex CLI. Не переносите в постоянный workflow параметры, которые лишь позволяют задаче пройти тест, если команда не может объяснить их влияние на файловую систему и подтверждения.
Для анализа без записи начните с режима, ограничивающего изменения. Это подходит для ревью, объяснения ошибки или подготовки списка предложений. После выполнения сравните статус Git с исходным состоянием: задача, заявленная как только читающая, не должна незаметно оставлять изменённые файлы.
Для контролируемой записи разрешайте агенту работу только там, где находятся исходники задания. Проверяйте итоговый diff, исключайте из области записи каталоги с ключами, профилями подписи, конфигурацией Runner и долговременными журналами. Если для конкретного шага требуются дополнительные полномочия, определите их отдельно, обоснуйте и включайте только для этого шага.
Для повышенных полномочий нужна отдельная оценка угроз. Не делайте отключение подтверждений или снятие ограничений песочницы стандартным способом запуска ради удобства CI. Сначала выясните, поддерживает ли используемый вариант codex exec нужный неинтерактивный режим; затем сопоставьте выбранные параметры с текущей документацией и проверьте, какие операции и каталоги они разрешают.
Как задать рабочую область и права для удалённой задачи? Определите путь после checkout, затем выберите минимальный режим, подходящий для чтения или ограниченной записи. Для первого запуска полезно явно вызвать справку установленной версии и сверить доступные параметры, например:
codex exec --help
Если используется шаблон команды, оставляйте параметры явными и документированными, а инструкцию — отдельной строкой:
cd "<путь-к-репозиторию>"
codex exec [проверенные-параметры] "<инструкция>"
Не вставляйте в журнал токены, приватные ключи или содержимое секретов. При передаче учётных данных используйте механизм секретов CI, задавайте минимальную область и срок действия, а также проверьте, каким этапам workflow они доступны. Документация GitHub о безопасном использовании Actions рассматривает риски недоверенных входных данных и ограничения доступа к секретам; этого нельзя заменить только текстом инструкции для агента.
Параметры запуска, влияющие на подтверждения и песочницу, должны быть привязаны к конкретной версии CLI и проверены при обновлении. Зафиксируйте команду в репозитории и пересматривайте её вместе с изменением версии инструмента, а не полагайтесь на сохранённые значения пользовательской оболочки.
034. Проведите пробный запуск и проверьте фактические изменения
Первый прогон лучше разделить на две части: сначала проверить чтение и формирование результата без изменения исходников, затем разрешить небольшую ожидаемую правку в тестовой ветке. Это рекомендация для управляемого внедрения, а не гарантия, описанная OpenAI: её задача — обнаружить неправильный каталог, неожиданные записи и ошибочную интерпретацию задания до подключения постоянного Runner.
Перед запуском запишите commit и состояние рабочей копии. Выполните простую аналитическую инструкцию, которая не требует редактировать проект. Сохраните стандартный вывод, ошибки и код завершения процесса в журнале CI. После завершения снова получите git status --short и сравните состояние с исходным. Проверяйте фактические файлы, а не только итоговое текстовое сообщение Codex CLI.
Для контролируемой правки укажите один небольшой результат, который легко проверить: например, изменение конкретного тестового файла или исправление документации в заданном каталоге. После задачи просмотрите полный diff, проверьте новые и удалённые файлы, исключите изменения вне ожидаемой области и убедитесь, что job завершился с подходящим кодом возврата. При обнаружении лишних изменений остановите дальнейшие этапы и разберите источник: неверная инструкция, неправильный checkout, слишком широкая область записи или остатки предыдущего запуска.
Как не дать CI-задаче получить лишние секреты и сетевой доступ? Не передавайте агенту данные, которые не нужны для его работы, и не предоставляйте секрет на уровне всей задачи, если он требуется только последующему этапу. Ограничьте права токена, задайте конкретные условия запуска и проверьте, кто может менять workflow. Сетевой доступ тоже нужно обосновать: если задача не требует внешних ресурсов, не предоставляйте их просто потому, что Runner подключён к сети.
При работе с внешними pull request особенно опасно сочетание недоверенного кода и полномочий доверенного workflow. GitHub отдельно предупреждает о рисках неправильного применения pull_request_target; не запускайте код из недоверенного изменения в привилегированном контексте лишь ради доступа к секретам или записи в репозиторий.
045. Подтвердите сборку и тесты Xcode отдельно от ответа агента
После выполнения Codex CLI следующий этап должен проверить именно результат проекта. Запускайте заданные командой сборки и тестирования шаги в предусмотренной macOS-среде и сохраняйте их вывод. Успешное завершение агента говорит только о завершении процесса агента; оно не подтверждает, что проект компилируется, тесты проходят или артефакт создан в правильном месте.
Сначала определите требования самого проекта: схему сборки, назначение тестов, нужный симулятор или устройство, способ обработки подписи и ожидаемый каталог результата. Затем вызовите инструменты Xcode согласно процедуре, принятой в репозитории, и зафиксируйте команду вместе со статусом выполнения. Не подменяйте полный результат фрагментом лога, который выглядит успешным: сохраняйте отчёт или ссылку на артефакт, позволяющие проверить конкретный запуск.
Перед выбором версии среды сверьте установленный Xcode с системными требованиями Apple и сведениями в примечаниях к выпуску Xcode 27. Требования к macOS и доступным инструментам зависят от выбранного выпуска Xcode; не закрепляйте версию среды по старому примеру без проверки актуальной документации Apple.
Для удалённого Mac Xcode-сборки сохраняйте связку доказательств: идентификатор commit, версию CLI, выбранные средства Apple, команду сборки или теста, код завершения и местоположение отчёта либо артефакта. Такая запись позволяет отличить ошибку изменения кода от несовместимости среды, неправильного выбора схемы или сбоя самого этапа CI.
Как проверить Xcode после автоматического изменения кода? Сопоставьте состояние дерева и diff с ожидаемыми изменениями, а затем выполните отдельную команду сборки и тестовый этап. Зафиксируйте их результаты независимо от сообщения агента. Если тестирование не запускалось или артефакт не сохранился, помечайте результат как непроверенный, а не как успешную сборку.
Практическая проверка перед объединением изменений:
- [ ] В workflow указан ожидаемый источник кода и целевой commit.
- [ ] Рабочая директория подтверждена командами проверки каталога и состояния Git.
- [ ] Используемые параметры Codex CLI сверены с документацией установленной версии.
- [ ] Для задачи выбраны минимально необходимые права; причины расширения доступа записаны.
- [ ] Вывод, ошибки, код завершения и diff сохранены для последующего просмотра.
- [ ] Сборка и тесты Xcode выполнены отдельными шагами и связаны с тем же commit.
- [ ] Подтверждено, где находятся отчёты и собранные артефакты.
- [ ] Секреты не попали в журналы, diff или доступную недоверенному заданию область.
056. Решите, допускать ли задачу на постоянный Runner
Постоянный self-hosted Runner требует отдельного решения о доверии к исходному коду, доступе к сети и сохранности локального состояния. GitHub описывает ограничения self-hosted Runner и рекомендации по безопасности в документации о безопасном использовании GitHub Actions. Поэтому одной очистки рабочей директории после задания недостаточно, чтобы считать недоверенный код изолированным: доступ к другим процессам, локальным данным и полномочиям узла нужно оценивать отдельно.
Разделите запуск по источнику изменений. Доверенная внутренняя ветка может проходить проверку на выделенном Mac Runner при ограниченных полномочиях и контролируемом workflow. Внешний pull request следует обрабатывать в среде, где выполнение его кода не получает секреты или права постоянного узла. Если необходимая изоляция недоступна, не направляйте такие задания на Runner, который хранит учётные данные или используется другими доверенными задачами.
Перед допуском зафиксируйте, кто может регистрировать Runner, менять workflow и просматривать журналы; какие секреты доступны каждой стадии; как отделяются задания и что проверяется после их завершения. Удаление временного каталога полезно как эксплуатационный шаг, но не доказывает, что недоверенный код не получил доступ к другим ресурсам во время выполнения. При использовании pull_request_target учитывайте отдельные рекомендации GitHub по безопасной настройке этого события.
Примените решение по трём исходам:
- Допустить пробный запуск, если рабочий каталог проверяется, полномочия минимальны, изменения просматриваются, а Xcode-сборка и тесты подтверждаются отдельно.
- Ограничить применение доверенными ветками, если CI работает, но изоляция внешнего кода или контроль секретов ещё не подтверждены.
- Отложить запуск на постоянном узле, если задача получает широкие полномочия, происхождение checkout неоднозначно, результаты не сохраняются или отсутствует отдельная проверка инструментами Apple.
Если существующая схема опирается только на Linux-узел, она не сможет заменить этапы, требующие macOS и Xcode. Покупка собственного Mac оправдана, когда команде нужна постоянная машина с физическим доступом и предсказуемым локальным управлением, но она оставляет на команде обслуживание оборудования и узла. Для временного пилота или отдельного удалённого этапа можно сравнить это с арендой Mac: заранее проверьте доступные условия, способ подключения и пригодность среды именно для вашего workflow. В обзоре вариантов NUKCLOUD можно начать оценку удалённой Mac-среды, а актуальные коммерческие условия сверить на странице цен NUKCLOUD. Для постоянной нагрузки с особыми требованиями к оборудованию или физическим интерфейсам аренда может не подойти; для ограниченного CI-пилота она позволяет оценить удалённый Mac, не превращая покупку собственной машины в обязательный первый шаг.