Для команд в АТР и Северной Америке

Инструкция: от подключения до сборки

Машина уже готова — начните с шага, на котором возникла проблема. Проверьте подключение, инструменты, подпись и пайплайн по отдельности, чтобы превратить успешную сборку в воспроизводимый процесс.

Адрес, порт, имя пользователя и статус выдачи смотрите в карточке экземпляра в консоли. Перед выполнением команд замените переменные среды своими значениями: в примерах нет действительных данных для подключения.

01 · Подключение к машине

Сначала проверьте параметры, затем соединение

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

SSH: проверьте параметры подключения

Откройте нужный экземпляр в консоли и скопируйте адрес хоста, SSH-порт и имя пользователя. Сначала проверьте путь к закрытому ключу на локальном компьютере, затем подключайтесь. Не указывайте в команде SSH порт VNC.

chmod 600 "$SSH_KEY"
ssh -i "$SSH_KEY" -p "$SSH_PORT" "$NODE_USER@$NODE_HOST"

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

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

VNC: рабочий стол для интерактивных задач

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

Рабочий стол подходит для настройки Xcode, проверки связки ключей и работы с симулятором; длительные сборки запускайте через SSH или runner. Если SSH работает, а рабочий стол — нет, запишите сообщение клиента и состояние экземпляра и проверяйте именно удалённый рабочий стол. Не перезагружайте всю машину снова и снова.

Чтобы подключиться через SSH-туннель, настройте перенаправление на фактический порт VNC и подключитесь к локальному порту клиента:

ssh -N -L 5901:127.0.0.1:"$VNC_PORT" \
  -p "$SSH_PORT" "$NODE_USER@$NODE_HOST"

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

Узел: выбирайте по месту работы, а не по расположению проекта

Доступны 5 узлов: Сингапур, Токио, Сеул, Гонконг и восток США. Для интерактивной работы выбирайте узел рядом с основными пользователями; для автоматических сборок учитывайте также расположение кода и источников загрузки зависимостей. Распределённые команды могут назначить отдельные сборочные машины рядом с участниками и направлять задачи по меткам runner — не обязательно всем работать с одним удалённым рабочим столом.

Сравнивайте узлы в одинаковых условиях: используйте один клиент и одну сеть, проводите замеры в одно и то же время, фиксируйте время отклика, клонирования репозитория и полной сборки. Сетевая задержка не равна времени компиляции, поэтому не сравнивайте результаты, полученные в разных сетевых условиях.

02 · Фиксируем инструменты

Закрепите версию Xcode за каждой веткой

Сначала зафиксируйте версии, затем переносите подпись. Успешная сборка на рабочем столе ещё не означает, что пользовательский сеанс runner готов к работе.

Установите несколько версий и не переключайте их между задачами

Переименуйте версии Xcode и разместите их в папке «Программы». Stable и Next ниже — условные названия приложений; перед выполнением замените их на реальные имена на машине. Перед подключением к пайплайну запустите Xcode, подтвердите лицензию и установите нужные компоненты платформ.

xcode-select -p
xcodebuild -version
xcrun --sdk iphoneos --show-sdk-version

sudo xcode-select --switch \
  /Applications/Xcode-Stable.app/Contents/Developer

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

export DEVELOPER_DIR=/Applications/Xcode-Next.app/Contents/Developer
xcodebuild -version

Проверяйте сертификат, закрытый ключ и профиль вместе

Импортируйте сертификат для подписи и соответствующий закрытый ключ под тем пользователем macOS, который запускает сборку. Затем установите профиль в соответствии с настройками подписи текущей версии Xcode. Один сертификат без закрытого ключа не позволит подписать код.

security find-identity -v -p codesigning
xcodebuild -list -workspace App.xcworkspace

Проверьте идентификатор команды, Bundle Identifier, способ подписи и область действия профиля. Сначала выполните archive вручную под тем же пользователем, затем запустите ту же команду через CI — так будет проще отличить проблему конфигурации проекта от ограничений доступа в сеансе runner.

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

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

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

xcodebuild archive \
  -workspace App.xcworkspace \
  -scheme App \
  -configuration Release \
  -destination 'generic/platform=iOS' \
  -archivePath "$HOME/builds/App.xcarchive"

xcodebuild -exportArchive \
  -archivePath "$HOME/builds/App.xcarchive" \
  -exportPath "$HOME/builds/export" \
  -exportOptionsPlist ExportOptions.plist
03 · Настраиваем непрерывную сборку

Запускайте задачи от имени постоянного пользователя macOS

То, что машина выделена одному клиенту, ещё не означает, что задачи не будут мешать друг другу. Команде всё равно нужно согласовать пользователя для сборки, каталоги и правила очереди.

GitHub Actions: зарегистрируйте runner, затем настройте службу

В настройках runner репозитория или организации скачайте установщик и команду регистрации для Apple Silicon, затем распакуйте архив в отдельный каталог. Используйте временный токен, предоставленный этой страницей, и зарегистрируйте runner в нужном репозитории или организации. Не сохраняйте токен в скрипте.

./config.sh \
  --url "$RUNNER_URL" \
  --token "$RUNNER_TOKEN" \
  --labels pushmac,macos,arm64

./svc.sh install
./svc.sh start
./svc.sh status

В workflow значение runs-on должно соответствовать зарегистрированным меткам. Сначала запустите тестовую задачу без материалов для подписи и проверьте инструменты, рабочий каталог и права доступа. Только после этого добавляйте задачи публикации. Доверяйте runner с материалами для подписи только проверенному коду.

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

GitLab Runner: задайте executor и рабочий каталог

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

mkdir -p "$HOME/ci"
gitlab-runner register
gitlab-runner install --working-directory "$HOME/ci"
gitlab-runner start
gitlab-runner status

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

Параметры установки должны соответствовать установленной версии runner. Перед запуском проверьте справку на этой машине.

Проверьте автозапуск на первой задаче после перезагрузки

Пользовательские службы macOS обычно зависят от сеанса вошедшего в систему пользователя. Установка службы не гарантирует выполнение задач с подписью, когда пользователь не вошёл в систему. Проверьте тип службы launchd для runner, условия входа и доступность связки ключей. Не обходите политики доступа команды ради автозапуска.

В удобное для команды время проверьте состояние службы после перезагрузки и выполните полную сборку. Запускайте Fastlane с зависимостями, зафиксированными в проекте, например bundle exec fastlane ios build, где имя lane должно соответствовать настройкам проекта. При передаче задач между часовыми поясами заранее задайте число параллельных запусков и правила очереди, чтобы два archive не записывались в один каталог артефактов.

04 · Сохраняем результаты для повторного использования

Сначала разберите затраты времени, затем решайте вопрос с хранилищем

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

Разделяйте кэш по проекту и версии инструментов

На выделенной машине можно сохранять DerivedData, загруженные пакеты SPM и кэш CocoaPods в течение всего срока аренды. Не направляйте все ветки в один каталог: разделяйте пути по проекту, инструментам и типу задачи, сохраняя файлы блокировки зависимостей.

xcodebuild archive \
  -workspace App.xcworkspace \
  -scheme App \
  -destination 'generic/platform=iOS' \
  -derivedDataPath "$HOME/ci-cache/App/stable/DerivedData" \
  -clonedSourcePackagesDirPath "$HOME/ci-cache/App/stable/SPM" \
  -archivePath "$HOME/builds/App.xcarchive"

Для проектов Flutter и React Native также зафиксируйте версии соответствующих инструментов и состояние файлов блокировки зависимостей iOS. При сбое сначала сохраните журнал, затем очистите только относящийся к проблеме кэш. Полная очистка при каждой сборке обычно сводит на нет пользу повторных сборок.

Разбирайте нехватку места и памяти по отдельности

Push M4 S: M4 / 16GB / 256GB — для повседневного CI одного приложения. Push M4 L: M4 / 24GB / 512GB — для задач с повышенными требованиями к памяти и сборки нескольких target. Возможность параллельной сборки проверяйте по фактической пиковой нагрузке проекта.

+1TB SSD подойдёт, если системный диск постепенно заполняется кэшем зависимостей, несколькими версиями инструментов и старыми артефактами. +2TB SSD — для рабочих процессов, которым нужно хранить больше кэша проектов и archive. Дополнительное хранилище не увеличивает объём объединённой памяти и не гарантирует ускорения компиляции.

df -h
du -sh "$HOME/ci-cache" "$HOME/builds"

Сначала определите путь монтирования, затем перенесите кэш и обновите переменные пайплайна. Дополнительное хранилище — не резервная копия: храните архивы, файлы символов и важные настройки в отдельных копиях согласно правилам команды.

05 · Учётная запись и срок аренды

Продлевайте аренду с учётом графика релизов

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

Аренда от одного дня и продление

Доступна оплата за день, неделю, месяц или квартал. Push M4 S: $19.2 в день, $51.8 в неделю, $95.9 в месяц, $260.8 в квартал; Push M4 L: $39.7 в день, $107.2 в неделю, $198.5 в месяц, $539.9 в квартал. Смотрите срок аренды, варианты продления и доступные периоды в консоли. Не рассчитывайте цену за другой период простым умножением дневной ставки.

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

Подготовка к смене узла

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

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

Способы оплаты и расчёты в долларах США

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

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

Работа 365 дней в году и резервные копии

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

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

Продолжить работу над процессом сборки

Практические шаги — в руководстве, архитектурные решения — в статьях

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

Статьи PushMac по технологиям

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

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

Добавьте в заявку данные, по которым можно проверить сборку

Если коллеги в Азиатско-Тихоокеанском регионе и Северной Америке передают друг другу решение одной проблемы, укажите время и узел — так продолжить диагностику проще, чем по сообщению «не подключается».

  1. 01

    Укажите экземпляр

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

  2. 02

    Приложите ошибку

    Добавьте сообщение клиента, команду сборки, код завершения, версию Xcode и фрагмент журнала, относящийся к проблеме. Удалите секретные данные из скриншотов и текста перед отправкой.

  3. 03

    Перечислите, что уже проверили

    Укажите, работают ли SSH и VNC по отдельности, удаётся ли воспроизвести проблему и какие настройки менялись недавно. Это поможет следующему специалисту не повторять проверки.

Передайте результаты проверки службе поддержки

Войдите в консоль и отправьте заявку по проблеме с экземпляром или заказом. Если войти не удаётся, напишите на адрес support@pushmac.comи укажите адрес электронной почты аккаунта и суть проблемы.