От локальной сборки к облачной доставке

Запустите ночные сборки,
а рабочие компьютеры выключайте вовремя.

Создайте ферму сборки iOS на нескольких выделенных физических Mac. Распределяйте разные scheme между macOS runner, чтобы параллельно выполнять архивацию, подпись и загрузку в TestFlight, а не перегружать задачами один рабочий компьютер.

ArmRDP предоставляет целый Mac mini, а не виртуальную машину. Три конфигурации, 5 узлов, от $21.1 в день. Для начала перенесите один конвейер, а затем масштабируйте ресурсы по фактической очереди.

Чтобы собирать приложения ночью, заранее настройте runner, подпись и загрузку. Время доставки зависит от проекта, зависимостей и очереди задач.

Ночная доставка · схема распределения задач

Один релизный конвейер — три параллельные сборки.

Разделяйте задачи по scheme, а результаты собирайте на узлах.

  1. A
    Основное приложение · Releaserunner-app → archive → codesign
    .ipa
  2. B
    Расширения и связанные целиrunner-extension → build → test
    .xcresult
  3. C
    Проверка кандидата на релизrunner-check → simulator → report
    Отчёт о тестах
Принцип запуска
Сначала один узел
Масштабирование
Добавляйте runner
Пример процесса, не данные в реальном времени. Очерёдность задач зависит от зависимостей проекта. Загружайте сборку в TestFlight после успешной проверки.
Команды CI/CD

Стабильная цепочка инструментов лучше постоянной отладки окружения.

Зарегистрируйте облачный Mac как macOS self-hosted runner для GitLab или GitHub Actions. Управляйте репозиторием привычным для команды способом, направляя на этот физический узел только задачи, которым нужна macOS.

Сначала добейтесь воспроизводимой сборки

Запишите полную версию Xcode, SDK, путь к инструментам командной строки и lock-файлы зависимостей. Управляйте несколькими версиями Xcode с помощью xcodes, а для каждого job задавайте DEVELOPER_DIR, чтобы проекты не зависели от одной глобальной настройки.

В метках runner указывайте как минимум систему, цепочку инструментов и назначение — например, macos, xcode-pinned, ios-release. Релизные задачи должны запускаться только на доверенных runner. Не допускайте непроверенные ветки в окружение с ключами подписи.

На старте запускайте на каждой машине только одну ресурсоёмкую сборку. Оцените сборку без кэша, попадания в кэш, нагрузку на память и рост занятого места на диске, а затем решите, повышать ли параллельность или добавлять узлы. Очередь зависит не только от числа машин, но и от кэширования и разбиения задач.

Сначала проверьте окружение, затем создайте архив
xcodebuild -version
xcode-select -p
xcrun --sdk iphoneos --show-sdk-version

xcodebuild \
  -workspace App.xcworkspace \
  -scheme App \
  -configuration Release \
  -archivePath artifacts/App.xcarchive \
  archive

Замените App и scheme на названия из своего проекта. Храните архивы, логи сборки и результаты тестов отдельно для каждого job. Не направляйте две задачи в один каталог вывода.

Релиз приложения

Архивация, подпись и загрузка — в единой отслеживаемой цепочке.

Для публикации в App Store связывайте артефакты сборки с соответствующим коммитом, цепочкой инструментов и настройками подписи. Облачный Mac служит средой выполнения, а права на публикацию и материалы для проверки остаются под контролем команды.

Архивация и экспорт

Сохраняйте .xcarchive, настройки экспорта и dSYM. Перед экспортом проверьте конфигурацию Release, версию и номер сборки. Не оставляйте только итоговый .ipa: без файлов символов будет сложнее разбирать сбои.

Критерий приёмки: артефакт связан с конкретным коммитом и номером сборки.

Подпись и учётные данные

Импортируйте сертификат распространения и профиль подготовки контролируемым способом, а для задач сборки используйте отдельный Keychain. При работе с fastlane match ограничьте доступ к репозиторию и храните данные для расшифровки в хранилище секретов CI, а не в скрипте.

Критерий приёмки: codesign работает без участия пользователя.

Загрузка и материалы для проверки

Загружайте артефакты с помощью учётных данных, разрешённых командой. Проверьте скриншоты симулятора в графическом интерфейсе и подготовьте материалы для проверки, сверив целевые устройства, язык и версию. Успешная загрузка и одобрение — разные этапы.

Критерий приёмки: результат загрузки, материалы и логи сохранены вместе.

Ограничьте релизные job по веткам и пользователям, которым разрешён запуск. Просроченный сертификат, несовпадающий профиль подготовки и недостаточные права на загрузку требуют разных решений по логам. Более мощная машина эти проблемы не устранит.

Разработка приложений для macOS

Запускайте задачи из командной строки, а детали проверяйте в графическом интерфейсе.

macOS работает на выделенном физическом узле нативно; Metal и симулятор подходят для соответствующих задач разработки. Используйте SSH для скриптов и логов, а общий экран VNC — для Xcode, симулятора и проверки интерфейса. У каждого способа подключения своя задача.

Задачи для удалённого запуска

Сборку с фиксированной версией инструментов, автоматические тесты, снимки экрана симулятора и установку зависимостей можно выполнять без локального рабочего компьютера. Если нужно разобраться с интерактивной проблемой, сначала воспроизведите её в графическом интерфейсе, а затем перенесите повторяемые шаги в скрипт.

Убедитесь, что целевая система, runtime симулятора и версия Xcode совместимы.

Что нужно проверить отдельно

Отзывчивость удалённого экрана зависит от маршрута сети, разрешения и настроек кодирования и не равна работе с локальным монитором. Если нужны внешние устройства, конкретная периферия или частое интерактивное управление, сначала запустите реальные задачи на день и только потом решайте, стоит ли переносить процесс.

Эксперименты с ИИ

Проверьте, впишется ли модель в ваш процесс, используя 64 ГБ объединённой памяти.

ArmRDP M4 Pro оснащён чипом M4 Pro, 64 ГБ объединённой памяти и SSD на 2 ТБ. В выделенной среде можно загружать локальные модели, сравнивать варианты квантования и проверять интерфейсы инференса, прежде чем принимать решение о дальнейших вложениях.

Сначала оцените объём памяти, затем скорость

Размер файла модели не равен объёму памяти, необходимому для работы. Помимо весов учитывайте KV-кэш, длину контекста, фреймворк и другие процессы. Начните с небольшого контекста для целевой модели, зафиксируйте пиковое потребление и нагрузку на память, а затем постепенно увеличивайте число запросов.

Используйте фреймворк инференса с поддержкой Apple Silicon и проверьте совместимость конкретных операций и формата модели. Объединённая память не гарантирует запуск любой модели и сама по себе ничего не говорит о скорости генерации. Проверяйте результат на собственных промптах, контексте и длине ответа.

Зафиксируйте как минимум четыре параметра эксперимента

  • Название и версия модели, формат квантования.
  • Длина контекста, размер пакета и пиковое потребление памяти.
  • Время первой загрузки и отклик при стабильной работе.
  • Примеры запросов, качество ответов и логи ошибок.

По возможности запускайте эксперименты с инференсом отдельно от релизных сборок, чтобы конкуренция за память не искажала результаты. Защитите удалённый интерфейс аутентификацией и ограничьте доступ; не открывайте порт для всех.

Начните миграцию с одного конвейера

Сначала перенесите данные, затем выровняйте окружение и переключите запуск.

Не переносите сразу всю систему публикации. Выберите scheme с понятными зависимостями, которая стабильно собирается локально. Сравните облачный результат с локальным и последовательно пройдите три этапа проверки.

  1. 01 · Данные

    Перенесите репозиторий и материалы для подписи

    Получайте репозиторий по учётным данным только для чтения или с минимальными правами. Проверьте подмодули, приватные зависимости и крупные файлы. Отдельно храните сертификаты, профили подготовки и ключи расшифровки; не добавляйте конфиденциальные файлы в репозиторий.

    • Проверьте, что фиксированный коммит полностью клонируется.
    • Убедитесь, что необходимые для сборки ключи доступны контролируемым образом.
    • Храните артефакты и резервные копии за пределами узла.

    Условие прохождения: все данные и зависимости для выбранного коммита доступны.

  2. 02 · Инструменты

    Зафиксируйте всё, что нужно для сборки

    Установите и закрепите нужную проекту версию Xcode с помощью xcodes. Сохраните список зависимостей Homebrew и lock-файлы менеджеров пакетов, установите runtime нужного симулятора и запишите переменные среды и пути запуска.

    • Сверьте версии Xcode и SDK.
    • Запустите сборку без кэша.
    • Изолируйте DerivedData и кэш для каждого проекта.

    Условие прохождения: ручной запуск даёт ожидаемые артефакты.

  3. 03 · Подключение CI

    Зарегистрируйте runner и переключите один релизный конвейер

    Зарегистрируйте runner, настройте метки и права доступа к репозиторию, а затем направьте первый конвейер на облачный Mac. После успешного запуска добавьте подпись и загрузку, а затем подключайте остальные scheme и отдельные узлы.

    • Для первого запуска установите параллельность в одну задачу.
    • Сохраняйте логи, отчёты о тестах и файлы символов.
    • При сбое сохраняйте возможность вернуться к прежней среде запуска.

    Условие прохождения: задачи выполняются повторяемо без участия пользователя.

На время миграции оставьте прежний runner, пока не проверите сборку без кэша, подпись, загрузку и повторный запуск после сбоя. До окончания аренды экспортируйте нужные данные и не используйте диск узла как единственное место хранения архивов.

Выбор из трёх конфигураций

Ориентируйтесь на частоту сборок, а конфигурацию выбирайте по своему проекту.

Ниже приведены рекомендации для старта с учётом числа задач в день, а не результаты тестов производительности и не гарантия скорости сборки. Полная сборка крупного проекта может быть тяжелее нескольких инкрементальных. Фиксируйте время каждой сборки, попадания в кэш и пиковое потребление памяти, прежде чем решать, переходить ли на более мощную конфигурацию или добавлять узлы.

Число сборок в день — ориентир для планирования. Все три конфигурации — выделенные физические машины; по умолчанию сначала проверяйте запуск одной задачи.
Задач в день Стартовая модель и характеристики Что проверить в первую очередь Аренда на день
1–5
Разовые проверки, один проект
ArmRDP M4 Base
M4 / 16GB / 256GB
Проверьте полный цикл архивации и подписи. Оцените место на диске, необходимое для зависимостей, DerivedData и артефактов. $21.1/деньАрендовать M4 Base
6–20
Непрерывная интеграция, частые итерации
ArmRDP M4 Plus
M4 / 24GB / 512GB
Проверьте нагрузку на память при одновременной компиляции и тестировании. Сначала оптимизируйте кэширование и только потом решайте, нужны ли дополнительные runner. $41.4/деньАрендовать M4 Plus
От 21
Несколько целей, ресурсоёмкие задачи
ArmRDP M4 Pro
M4 Pro / 64GB / 2TB
Оцените потребность в ресурсах для крупных проектов или экспериментов с моделями. Если узкое место — очередь, распределите независимые задачи между несколькими узлами. $59.5/деньАрендовать M4 Pro

Учитывайте и расположение узла, и срок аренды

Доступны 5 узлов: Сингапур, Япония (Токио), Южная Корея (Сеул), Гонконг и запад США. Все три конфигурации представлены во всех локациях. Для работы с графическим интерфейсом в первую очередь сравните качество соединения команды с узлами. Для сборок без участия пользователя также проверьте маршруты до репозитория, серверов загрузки зависимостей и места размещения артефактов. Актуальный статус доступности отображается в панели управления.

Для проверки начните с аренды на день. При регулярных релизах сравните цены за неделю, месяц и квартал. Доступны USDT-TRC20 и Visa / Mastercard / Amex (через Stripe); расчёты ведутся в долларах США. Доступные способы оплаты зависят от ответа платёжного шлюза.

Арендуйте Mac на день и проверьте реальный конвейер.

Подготовьте один scheme, настройки подписи и чёткие критерии приёмки. После успешной архивации, подписи и доставки выделите узлы для остальных задач.