Выбирайте по задачам, а не по цифрам

Облачный Mac для четырёх задач

Добавьте к своему рабочему процессу выделенный физический узел Apple Silicon. Не виртуальная машина: доступны SSH и графический интерфейс macOS. Для разовой сборки, постоянного CI-пайплайна и экспериментов с инференсом в унифицированной памяти.

Три конфигурации, пять локаций. Shell M4 — от $21.8 в день. Проверьте на своём проекте.

01 / BUILD

Оставьте основной компьютер как есть,
а Xcode перенесите в облако

Если вы обычно пишете код в Windows или Linux, а собирать проект нужно перед релизом, синхронизируйте репозиторий с облачным Mac и запускайте сборку по SSH. Для проверки настроек проекта, симуляторов или подписи можно перейти в графический интерфейс macOS — переносить всю привычную среду разработки не придётся.

Shell M4 подойдёт, чтобы проверить сборку и архивирование одного проекта. Достаточно ли 16GB унифицированной памяти, зависит от размера проекта, числа симуляторов и одновременно запущенных инструментов. Сначала зафиксируйте пиковое потребление памяти и время чистой сборки, а затем решайте, нужна ли другая конфигурация.

  • Проверьте зафиксированные в проекте версии Xcode и зависимостей: иначе сборка может пройти локально и завершиться ошибкой на удалённом Mac.
  • Сначала выполните сборку без подписи, затем настройте сертификаты и профили, которыми вы вправе пользоваться.
  • Успешное архивирование ещё не означает, что релиз готов: отдельно проверьте права на подпись и распространение, а также сам артефакт.
02 / AUTOMATE

Для сборок macOS —
постоянный Runner

Зарегистрируйте выделенный физический узел как self-hosted runner в GitLab или GitHub, чтобы объединить коммиты, тестирование, архивирование и передачу артефактов в один CI-пайплайн. Узел работает 365 дней в году; планирование задач, управление процессами и очистку сборок команда настраивает под проект.

Рекомендуем конфигурацию с 24GB унифицированной памяти и SSD на 512GB — Shell M4 Plus: этого хватит с запасом для разрешения зависимостей, сборки и тестов, а также для хранения репозитория, кэша и артефактов. Начните с параллелизма 1, оцените загрузку CPU, давление на память и рост занятого места, а затем при необходимости увеличьте значение. Число параллельных задач не всегда равно пропускной способности.

  • Запускайте CI от отдельного пользователя macOS, не используя общие с интерактивной работой каталоги.
  • Указывайте в метках Runner macOS, архитектуру чипа и версию Xcode, чтобы задачи попадали на нужный узел.
  • Перед запуском задач, которым нужны графическая сессия или связка ключей для подписи, проверьте права в той же пользовательской сессии.
  • Допускайте к Runner с релизными учётными данными только доверенные репозитории; код внешних участников запускайте изолированно.
03 / VERIFY

Сохраняйте результаты ночных тестов для разбора

Организуйте задачи с fastlane, запускайте UI-тесты через XCUITest и сохраняйте пакет результатов с контекстом сбоев. Сначала стабилизируйте тестовую среду, затем расширяйте охват устройств.

Сначала запустите регрессионные тесты на симуляторе

Установите нужные проекту среды выполнения симулятора и зафиксируйте целевое устройство и версию ОС. Сначала выполните xcrun simctl list devices available чтобы посмотреть доступные цели, затем укажите фактический идентификатор устройства в конфигурации тестов.

Для ночных заданий сохраняйте .xcresult, снимки экрана и логи. При сбое выясните, вызван ли он дефектом продукта, нестабильностью тестового скрипта или проблемой среды — не скрывайте причину бесконечными повторами.

Подходит для проверок коммитов и ночных регрессионных тестов

Для тестирования на реальном iOS-устройстве нужна отдельная проверка

Аренда физического Mac не означает аренду iPhone или iPad. В каталоге сервиса iOS-устройства не входят в комплект, а их подключение не гарантируется по умолчанию. До заказа уточните, кому принадлежит устройство, как оно подключается и какие инструменты нужны для тестирования.

USB-устройство, подключённое к вашему компьютеру, не появится на удалённой машине после входа по SSH. Для тестирования нужны доступное устройство, сопряжение и доверие между устройствами, а также соответствующие права на подпись. Сначала уточните возможность по электронной почте.

Сохраняйте результаты каждого запуска

Запустите команду после настройки lane для тестирования в fastlane проекта. Сохраняйте результаты в каталог с номером задания и передавайте их после теста, не накапливая на узле.

bundle exec fastlane scan \
  --scheme App \
  --result_bundle true \
  --output_directory build/test-results
04 / EXPERIMENT

Используйте унифицированную память,
чтобы проверить гипотезу об инференсе

Shell M4 Pro оснащён чипом M4 Pro, 64GB унифицированной памяти и SSD на 2TB. Он подойдёт, чтобы с помощью MLX или llama.cpp проверить загрузку модели, варианты квантования, длину контекста и путь инференса Metal. CPU и GPU используют общую память, но это не значит, что весь её объём доступен весам модели.

При выборе модели сначала оцените объём весов, затем оставьте запас для работы. Приблизительная оценка для 4-битных весов: модели с 8B параметров нужно около 4GB, с 32B — около 16GB. Расчёт основан на 0,5 байта на параметр и не учитывает метаданные квантования, KV cache, среду выполнения и системные процессы. По этой оценке нельзя гарантировать, что конкретная модель загрузится.

  • Сначала измерьте задержку до первого токена и стабильную скорость генерации на коротком контексте и одном запросе, затем увеличивайте контекст или параллелизм.
  • Записывайте версию модели, формат квантования, версии инструментов и параметры сэмплирования, чтобы не смешивать результаты разных конфигураций.
  • Для задач, требующих экосистемы CUDA или обучения на нескольких GPU, этот Mac не станет прямой заменой соответствующей системы.
С локального компьютера в облако

Три этапа переноса — каждый можно принять отдельно

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

01

Данные: подготовьте репозиторий к восстановлению

На работу: 10–30 минут, без учёта передачи данных

При первом переносе клонируйте репозиторий; незакоммиченные ресурсы синхронизируйте отдельно. Команды ниже выполняются на локальном компьютере,cloud-mac — настроенный вами SSH-псевдоним. Адрес репозитория берётся из переменной окружения проекта.

ssh cloud-mac 'mkdir -p ~/work'
rsync -av --exclude '.git' \
  ./App/ cloud-mac:~/work/App/
ssh cloud-mac
git clone "$REPOSITORY_URL" ~/work/repo

Проверка: совпадает хеш коммита, все необходимые ресурсы на месте; кэш и восстанавливаемые каталоги сборки переносить не нужно.

02

Инструменты: зафиксируйте версии и права

На работу: 20–60 минут, без учёта загрузки

Проверьте на удалённом Mac путь к Xcode и доступные SDK. Если в проекте есть Brewfile, восстановите инструменты с помощью Homebrew. Передавайте сертификаты и профили безопасным способом, одобренным командой; не помещайте их в репозиторий или логи заданий.

xcode-select -p
xcodebuild -version
xcodebuild -showsdks
brew bundle --file Brewfile
security list-keychains -d user

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

03

CI: сначала пробный запуск, затем смена меток

На работу: 15–45 минут, без учёта сборки

Подключите Runner с регистрационными данными, выданными организацией. Ниже приведены команды для GitLab; для GitHub Runner используйте конфигурационный скрипт организации и проверьте состояние службы на узле. Вводите токен только в доверенной сессии.

gitlab-runner register
gitlab-runner install
gitlab-runner start
gitlab-runner verify

Проверка: тестовая ветка запускается на новой метке, артефакты доступны для скачивания. После проверки переключите основной CI-пайплайн, оставив прежний исполнитель для отката.

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

Передача работы между часовыми поясами

Общий график — да, общий пароль — нет

Команда может пользоваться одним узлом по очереди, но CPU, GPU, память и диск остаются общими ресурсами. Разные системные пользователи не обеспечивают изоляцию уровня виртуальных машин; для релизных учётных данных и чувствительных проектов нужны более строгие настройки доступа.

  1. 01

    Индивидуальные учётные записи

    Каждому участнику создайте отдельного пользователя macOS и выдайте собственный открытый SSH-ключ — не делитесь закрытыми ключами. Для CI используйте отдельную учётную запись. При выходе участника из команды удалите его ключ и проверьте связанные токены.

  2. 02

    Передавайте задачи по расписанию

    Ведите расписание в едином часовом поясе. В записи о передаче указывайте хеш коммита, рабочий каталог, запущенные процессы и следующую задачу. Долгие процессы запускайте через Runner или управляемую сессию, а не оставляйте открытое подключение к рабочему столу.

  3. 03

    Управляйте подписью отдельно

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

  4. 04

    Храните резервную копию

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

NEXT / ЗАПУСТИТЕ СВОЙ ПРОЕКТ

Сначала выберите задачу,
затем запустите первый узел

Для сборки одного проекта начните с Shell M4, для командного CI выберите Shell M4 Plus, а для экспериментов с инференсом, требующих больше памяти, — Shell M4 Pro. На странице заказа проверьте период аренды, локацию и дополнительные опции.

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