Симптом — существующий рабочий процесс собирает проект на прежнем macOS Runner, и вы хотите перейти на Xcode 27. Решение — сначала перенесите сборку в отдельную ветку, проверьте инструменты, подпись, IPA и откат, а только после этого меняйте официальный выпуск. GitHub объявил образ Xcode 27 Runner общедоступным 15 октября 2026 года; дату и статус подтверждает официальное объявление GitHub.
Это руководство пригодится независимым разработчикам iOS и небольшим командам, которые переводят существующие задания GitHub Actions на новый образ. Если у вас несколько приложений или веток выпуска, используйте проверки по отдельности для каждого рабочего процесса. Если локального Mac нет и сборка с публикацией зависят от CI, включите в приёмку также повторяемость удалённого процесса.
Последнее обновление — 19 октября 2026 года. Сверено с объявлением GitHub, актуальным описанием образа Runner и страницами Apple о требованиях Xcode и распространении приложений. Перед применением ещё раз проверьте эти источники: GitHub может обновить метки и состав образа, а Apple — требования к инструментам.
До переноса: зафиксируйте требования проекта и план возврата
Не начинайте с редактирования основной ветки. Сначала установите, какие части существующей сборки зависят именно от текущего образа, а какие относятся к приложению. Такая фиксация позволяет не спутать смену окружения с регрессией в проекте.
Соберите для последнего успешного релиза исходные данные:
- версию Xcode и доступные SDK, использованные заданием;
- команды сборки, схему, конфигурацию и цель, переданные
xcodebuild; - способ установки зависимостей и файлы, которые фиксируют их версии;
- переменные и Secrets, нужные для подписи и публикации;
- формат экспортируемого результата и место, откуда его забирают;
- текущую метку Runner, дополнительные инструменты и обращения сценариев к фиксированным путям.
Сверьте выбранный выпуск Xcode с текущими системными требованиями и перечнем версий Xcode от Apple. Описания Apple помогут установить требования к версии и SDK, но не докажут, что проект действительно собирается на новом Runner. Это подтверждает только прогон вашего проекта.
Отдельно проверьте, что метка Xcode 27 Runner и архитектура соответствуют вашему заданию. Для этого используйте актуальный README образа macOS с Xcode 27, а не старую запись в конфигурации или воспоминание о предварительной версии. Файл в репозитории образов — источник для состава и обозначений Runner; если нужной метки в нём нет или она изменилась, не подставляйте похожее имя по догадке.
| Что зафиксировать до перехода | Где сверить | Что записать для сравнения |
|---|---|---|
| Метку и архитектуру Runner | README образа Xcode 27 и документацию GitHub | Фактическое значение runs-on и архитектуру из документации |
| Версии Xcode и SDK | Журнал прежнего задания и страницу системных требований Apple | Вывод команд проверки на старом и новом окружении |
| Зависимости и сборочную команду | Файлы проекта и рабочий YAML | Команды, lock-файлы, схему и конфигурацию |
| Подпись и публикацию | Настройки проекта, Secrets и инструкции Apple | Ожидаемый способ экспорта и дальнейшей передачи сборки |
В рабочем процессе обычно есть скрытые зависимости. Сценарий может использовать установленный инструмент, не описанный в репозитории; обращаться к пути, который существовал на прежнем образе; предполагать определённую версию утилиты; или полагаться на переменную окружения, выставленную только в конкретном задании. При смене Runner эти расхождения проявляются как ошибки, но по одному сообщению об ошибке нельзя заключить, что виновата именно новая версия Xcode.
Зафиксируйте и недостатки текущего варианта. Старый образ может перестать соответствовать требованиям приложения, не содержать нужного SDK или затруднять поддержание повторяемого выпуска. С другой стороны, новый Runner не устраняет незафиксированные зависимости, ошибочную настройку подписи и недокументированные пути. Миграция оправдана, если вы готовы проверять эти предположения, а не только менять одну строку.
Не объединяйте обновление зависимостей, изменение сертификатов и переход на новый Runner в один коммит. Если сборка сломается, отдельные изменения позволят определить, какое именно условие изменило результат.
Перед первым запуском: меняйте только выбор Runner
Создайте ветку для миграции и сохраните прежний рабочий процесс так, чтобы его можно было восстановить без повторного конструирования по памяти. В первом изменении меняйте только значение runs-on. Синтаксис и допустимые контексты поля проверяйте по справочнику GitHub по синтаксису рабочих процессов.
Не вставляйте в YAML метку, найденную в обсуждении или скопированную из прежней документации. Сначала проверьте актуальный README образа, затем укажите точное значение, которое там документировано. Если метка задаётся через переменную репозитория, убедитесь, что переменная определена для нужного окружения и содержит именно проверенное значение. Само использование переменной не подтверждает, что Runner существует или поддерживает нужную архитектуру.
Пример ниже показывает принцип разделения конфигурации. Значение переменной XCODE_27_RUNNER вы должны заполнить меткой, сверенной с текущим описанием образа, а не использовать это имя как готовую метку Runner.
jobs:
build:
runs-on: ${{ vars.XCODE_27_RUNNER }}
steps:
- uses: actions/checkout@v4
# Оставьте прежние шаги без изменений на первом прогоне.
Проверьте, что ограничения проекта и политики организации разрешают выбранный тип GitHub-hosted Runner. Документация GitHub описывает платформы и архитектуры размещённых Runner, а актуальные значения и содержимое образа нужно сверять отдельно с README. Наличие поддерживаемой архитектуры ещё не означает, что установлены все инструменты, которые ваш сценарий раньше находил случайно.
В первом тестовом прогоне не меняйте одновременно кэширование, способ установки зависимостей или параметры xcodebuild. Если они требуют отдельной корректировки, оформите её следующим изменением после того, как станет ясно, что Runner выбран правильно. Так вы сохраните причинно-следственную связь между изменением конфигурации и результатом сборки.
При первом запуске: подтвердите реальный состав окружения
Успешное создание задания — не проверка Xcode. В начале тестового рабочего процесса выведите в журнал используемые версии Xcode и выбранные командные инструменты. Для диагностики подходят команды:
xcodebuild -version
xcodebuild -showsdks
xcode-select -p
Сравните фактический вывод с ожиданиями проекта и с исходными данными прежней сборки. Если активная версия отличается от той, для которой настроены зависимости или сценарии, сначала выясните, что именно выбрало инструментальную цепочку. Не продолжайте к тестированию публикации, пока версия и SDK не соответствуют плану.
Затем проверьте разрешение зависимостей из чистого состояния рабочего каталога. Если проект использует lock-файлы, убедитесь, что их версии не менялись в процессе миграции. Если зависимость загружается или устанавливается отдельным сценарием, сохраните его вывод: ошибка сети или разрешения пакета не является сама по себе свидетельством несовместимости Xcode 27.
Запустите ту же команду сборки, схему и конфигурацию, что использовались до переноса. Просмотрите полный журнал, включая этапы до xcodebuild: checkout, установку зависимостей, подготовку окружения и выбор инструментов. Когда сборка завершается ошибкой, классифицируйте наблюдение, а не угадывайте причину:
- Окружение: не найдена ожидаемая команда, отличается выбранный Xcode или недоступен нужный SDK.
- Зависимости: пакет не разрешается, не загружается или несовместим с используемой конфигурацией.
- Проект: ошибка компиляции или настройки цели воспроизводится на ожидаемых инструментах и относится к исходному коду либо параметрам сборки.
- Рабочий процесс: не задана переменная, не доступен секрет или условие задания пропускает обязательный шаг.
Это не универсальная таблица причин: она нужна, чтобы сузить проверку по журналу. Сохраните сведения о Runner, версии инструментов и первом сообщении об ошибке вместе с результатом задания. Для повторного сравнения важны не только итоговый статус, но и конфигурация, при которой он получен.
Перед выпуском: проверьте подпись, архив и результат экспорта
Сборка без ошибок не доказывает, что результат можно распространять. Проведите отдельный непубликующий прогон, в котором используются ожидаемые параметры архивирования и экспорта, но не запускается официальный выпуск. Если рабочий процесс выпускает приложение зарегистрированным устройствам, сверяйте шаги с инструкцией Apple по архивированию, экспорту и распространению приложения.
Проверьте доступ к сертификату и Provisioning Profile, тип распространения и ожидаемые параметры экспорта. Храните чувствительные значения в защищённых Secrets, не выводите их содержимое в журнал и не передавайте в командной строке способом, который оставляет значение в открытом логе. Правила управления такими значениями описаны в документации GitHub по Actions Secrets. Наличие секрета в настройках репозитория ещё не гарантирует, что конкретное задание имеет право его читать: это зависит от контекста запуска и конфигурации доступа.
После экспорта убедитесь, что файл IPA создан в ожидаемом месте и приложен к заданию как артефакт, который можно получить для проверки. Сопоставьте его с настройками ожидаемой сборки: проверьте идентификатор приложения, конфигурацию подписи и включённый профиль. Не подменяйте эту проверку фактом, что шаг архивации завершился с кодом успеха.
Загрузку в App Store Connect проверяйте отдельно от создания артефакта. Apple описывает загрузку и обработку сборок в справке App Store Connect. Успешная передача файла не означает, что обработка уже завершилась и сборка появилась в ожидаемом месте. Поэтому зафиксируйте отдельно результат экспорта, факт передачи и статус обработки.
| Проверка | Условие для приёмки | Если не выполнено |
|---|---|---|
| Версия Xcode и SDK | Фактический вывод соответствует требованиям проекта | Остановить тестирование публикации и выяснить выбор инструментов |
| Сборка | Тестовое задание собирает нужную схему и конфигурацию | Сохранить журнал и разделить ошибку проекта, зависимостей и окружения |
| Подпись и экспорт | Секреты доступны, настройки ожидаемы, IPA создан и проверен | Не переключать официальный выпуск |
| Передача и обработка | Загрузка и дальнейший статус подтверждены отдельно | Не считать передачу файла завершённым выпуском |
| Возврат | Прежний Runner можно восстановить изменением конфигурации | Отложить миграцию до восстановления проверенного пути |
При переключении: применяйте условия приёмки и отката
Выберите решение по условиям, а не по факту, что новая сборка «запустилась»:
- Если метка и архитектура подтверждены официальным описанием образа, версии инструментов соответствуют проекту, зависимости разрешились и сборка прошла — переходите к тесту подписи и экспорта.
- Если подпись, параметры архива и IPA проверены, а загрузка и её обработка подтверждены отдельно — переводите на новый Runner конкретную задачу выпуска.
- Если новый образ не воспроизводит ранее известный результат, отсутствует обязательный инструмент или не получается получить ожидаемый артефакт — возвращайте старую конфигурацию Runner.
- Если причина ошибки пока не установлена — не переключайте официальный выпуск; оставьте тестовую ветку отдельной и продолжите диагностику по журналу.
Перед изменением официального задания сохраните старое значение runs-on и связанные с ним настройки рядом с записью о миграции. Убедитесь, что возврат не зависит от ещё не проверенного шага публикации или вручную изменённого секрета. Когда тест пройден, переключайте выпуск отдельно от других приложений и веток: это упрощает наблюдение за первым рабочим запуском и позволяет вернуть только затронутый процесс.
Для команд с несколькими приложениями полезен журнал приёмки на каждое приложение: ветка, зафиксированная метка, вывод Xcode и SDK, результат зависимостей, статус сборки, проверки подписи и экспортированный формат. Это рабочие записи, а не постоянное подтверждение совместимости. При следующем обновлении образа их придётся пересмотреть.
Если отказ возник после переключения, не стирайте первый неуспешный журнал и не исправляйте все параметры сразу. Сохраните исходное состояние, сопоставьте его с последним успешным запуском и меняйте по одному проверяемому условию.
После миграции: поддерживайте воспроизводимость
Сохраните итоговую конфигурацию, вывод проверки инструментов и ссылку на успешное задание вместе с описанием изменения. Укажите, какое значение Runner было принято и откуда оно сверялось, какие параметры экспорта использовались и каким способом проверялся IPA. Такой след помогает восстановить решение, если образ позднее изменится или появится новая версия Xcode.
Повторная проверка нужна, когда GitHub меняет метки или содержимое образа, когда Apple выпускает новую стабильную версию Xcode или когда проект меняет цели, зависимости и настройки подписи. Не обновляйте Runner автоматически только потому, что изменился образ: сначала проверьте применимость версии Xcode к проекту и повторите приёмку критичных этапов.
Если CI должен быть доступен постоянно, сравните его не только по скорости, но и по тому, кто поддерживает окружение, где хранятся секреты и как восстанавливается выпуск после сбоя. Для разработки, которой нужен постоянный доступ к macOS, изучите варианты удалённого доступа к Mac через браузер и условия аренды Mac. В таком сценарии macworker может быть альтернативой поддержанию собственного постоянно включённого Mac: сначала сопоставьте рабочий процесс, требования к доступу и обязанности по обслуживанию. Для редких сборок или стабильной команды CI менять проверенный GitHub Actions Runner на удалённый Mac может быть лишним; для воспроизводимого долгоживущего окружения важно заранее оценить, какой вариант проще контролировать.
Частые вопросы
Как безопасно переключить рабочий процесс на Xcode 27 Runner?
Создайте отдельную ветку и измените только runs-on, сохранив прежнюю конфигурацию. Сверьте актуальную метку и архитектуру с README образа GitHub, затем изучите фактические версии Xcode и SDK в журнале. Переключайте выпуск лишь после проверки сборки, подписи, экспорта IPA и загрузки. Если любой обязательный этап не подтверждён, оставьте официальный процесс на прежнем Runner.
Можно ли заменить старый macOS Runner одной строкой?
Замена часто начинается со значения runs-on, но этим миграция не заканчивается. Сценарии могут зависеть от путей, предустановленных инструментов, переменных окружения или настроек, которые не описаны в YAML. Поэтому сначала сравните окружения и запустите прежнюю команду сборки без параллельного обновления зависимостей. Если поведение изменилось, восстановите старую метку и разберите журнал до переключения релиза.
Как подтвердить подпись и IPA после перехода?
Проведите тест без официальной публикации: проверьте доступ к сертификату и профилю, выполните архивирование и экспорт, затем убедитесь, что IPA создан и соответствует ожидаемым настройкам. Не раскрывайте секреты в журнале. После этого отдельно проверьте передачу сборки в App Store Connect и её обработку: созданный IPA и завершённая публикация — разные результаты, их нельзя считать одним условием приёмки.
Как вернуться на прежнее окружение при ошибке сборки?
Сохраните прежнее значение runs-on до переноса и проверьте, что его можно восстановить независимо от новых изменений. Если новая конфигурация не собирает проект или не создаёт проверяемый результат, верните старую метку, сохраните журнал неудачи и зафиксируйте различия версий инструментов. Не исправляйте одновременно Runner, зависимости и шаги публикации: иначе при повторной попытке причина сбоя останется неопределённой.
Если вы прошли проверки, переключайте выпуск на Xcode 27 Runner поэтапно, оставив подтверждённую конфигурацию возврата. Если же проекту нужен постоянно доступный macOS-узел, сравните текущую схему GitHub Actions с удалённым Mac по обслуживанию, доступу и контролю над окружением; при временной потребности изучите условия аренды macworker, а не покупайте отдельный компьютер только ради непроверенного сценария.
Часто задаваемые вопросы
Как безопасно переключить рабочий процесс GitHub Actions на Xcode 27 Runner?
Сначала создайте отдельную ветку и измените только выбор Runner, не объединяя миграцию со сменой зависимостей или схемы публикации. Сверьте точную метку и архитектуру с актуальным описанием образа GitHub, затем проверьте версии Xcode и SDK в журнале. Переключайте основной выпуск, только когда сборка, подпись, экспорт IPA и путь возврата подтверждены.
Можно ли заменить старый macOS Runner на Xcode 27 Runner одной строкой?
Технически изменение часто начинается с поля runs-on, но это не доказывает совместимость рабочего процесса. Старый образ мог предоставлять инструменты, пути или настройки, на которые неявно опираются сценарии. После замены проверьте зависимости, командную строку Xcode, цели сборки и публикацию. До прохождения этих проверок сохраняйте прежнюю конфигурацию доступной для быстрого возврата.
Как после миграции проверить подпись приложения и IPA?
Запустите отдельный тестовый процесс, который выполняет архивирование и экспорт с теми же типом распространения и настройками подписи, что и выпуск. Убедитесь, что сертификат и профиль доступны из Secrets, экспортированный файл соответствует ожидаемой конфигурации, а артефакт можно получить из задания. Успешная сборка не подтверждает успешную загрузку: проверяйте обработку сборки отдельно в App Store Connect.
Что делать, если Xcode 27 Runner не собирает проект?
Не меняйте одновременно Runner, зависимости и сценарии: иначе причина отказа останется неясной. Сохраните журнал, выясните, какой Xcode, SDK и набор командных инструментов реально использовались, а затем разделите проблему на несовместимость окружения, разрешение зависимостей и ошибку проекта. Если новый образ не воспроизводит проверенную сборку или недоступна нужная зависимость, верните сохранённую конфигурацию Runner.
Подготовьте выделенный Mac для сборок Xcode
С macworker вы получите физический Mac с удалённым доступом по SSH — основу для размещения собственного узла сборки.
