От подключения до первой сборки

Подключитесь к Mac для сборки

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

Уже есть узел? Сначала запишите адрес, порт SSH, имя пользователя и способ подключения к рабочему столу, затем выполните инструкции ниже.

Сначала настройте SSH, затем автоматизацию

Создайте ключ в локальном терминале, авторизуйте открытый ключ для облачной учётной записи и задайте узлу постоянный алиас. В дальнейшем используйте это подключение для rsync, Fastlane и runner.

Ниже 192.0.2.10 указан пример адреса из документации,macbuild — пример имени пользователя,22 — пример порта SSH. Замените все значения данными из консоли. Не отправляйте в заявку приватный ключ, пароль или полный набор данных для подключения.

  1. 01

    Создайте отдельный ключ для сборки

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

    ssh-keygen -t ed25519 -f ~/.ssh/xcr_build -C "xcr-build"
    ssh-add ~/.ssh/xcr_build
    ls -l ~/.ssh/xcr_build.pub

    Файл с суффиксом .pub содержит открытый ключ — его можно установить на узел. Файл без суффикса содержит приватный ключ: храните его только локально или в контролируемом хранилище секретов CI.

  2. 02

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

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

    ssh-copy-id -i ~/.ssh/xcr_build.pub -p 22 macbuild@192.0.2.10
    ssh -i ~/.ssh/xcr_build -p 22 macbuild@192.0.2.10

    В локальной среде macOS может не быть ssh-copy-id. Если по данным подключения разрешён вход по паролю, используйте стандартную команду SSH ниже. Если разрешена только аутентификация по ключу, авторизуйте открытый ключ через предусмотренный процесс — не пытайтесь снова и снова вводить пароль.

    cat ~/.ssh/xcr_build.pub | ssh -p 22 macbuild@192.0.2.10 \
    'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'

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

  3. 03

    Настройте алиас и проверьте подключение

    Добавьте конфигурацию ниже в локальный файл ~/.ssh/config. Алиас избавляет от необходимости запоминать адрес узла: если адрес изменится, достаточно поправить одну запись, а скрипты по-прежнему будут использовать xcr-build.

    Host xcr-build
        HostName 192.0.2.10
        User macbuild
        Port 22
        IdentityFile ~/.ssh/xcr_build
        IdentitiesOnly yes
        ServerAliveInterval 30
        ServerAliveCountMax 3

    Выполните проверку только для чтения: уточните версию системы, выбранную версию Xcode и свободное место на диске. Сначала проверьте среду и только потом устанавливайте зависимости или регистрируйте runner — так неверная конфигурация не попадёт в конвейер.

    ssh xcr-build
    sw_vers
    xcode-select -p
    xcodebuild -version
    df -h "$HOME"

Откройте VNC и проверьте последние настройки в графическом интерфейсе

При первой настройке сертификатов подписи, проверке доступа к Keychain или просмотре параметров Xcode удалённый рабочий стол часто удобнее, чем подбор команд. После проверки верните повторяемые шаги в командную строку.

Подключение через «Общий экран» в macOS

На локальном Mac откройте «Общий экран» и укажите адрес рабочего стола и порт из данных подключения. Также можно открыть в Finder «Переход → Подключиться к серверу» и ввести предоставленный VNC-адрес.

Данные для подключения к рабочему столу могут отличаться от данных SSH. Используйте соответствующие поля из консоли и не вводите файл ключа SSH вместо пароля VNC.

Совместимый клиент или SSH-туннель

В других системах используйте VNC-клиент, совместимый с предоставленным способом аутентификации. Укажите хост, порт и данные для входа. Не открывайте службу рабочего стола в общедоступной сети.

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

ssh -N -o ExitOnForwardFailure=yes \
-L 127.0.0.1:5901:127.0.0.1:5900 xcr-build

Не закрывайте этот терминал, а в локальном VNC-клиенте подключитесь к адресу 127.0.0.1:5901. Локальный порт доступен только через loopback-интерфейс. Завершив работу с рабочим столом, нажмите Control-C, чтобы закрыть туннель.

Проверьте на рабочем столе три вещи

Убедитесь, что Xcode запускается и выбрана нужная версия; что пользователь сборки имеет доступ к сертификату подписи и приватному ключу; что профиль подготовки соответствует Bundle Identifier, Team и способу экспорта проекта. Не показывайте пароль от сертификата на снимках экрана.

Сохраните воспроизводимую сборочную среду

Перенесите сборку с локального Mac в облако

Переносите поэтапно: данные, инструменты, подключение CI. Сначала выполните ручную сборку архива на одном и том же коммите, затем передайте сборку runner. Не меняйте одновременно Xcode, версии зависимостей и настройки подписи.

01 / Данные

Синхронизируйте исходный код, кэш переносите по необходимости

Храните исходный код и lock-файлы в отдельном рабочем каталоге. Сначала запустите rsync в режиме предварительного просмотра и проверьте целевой путь. Не синхронизируйте весь каталог пользователя и не загружайте автоматически сертификаты, приватные ключи и локальные файлы окружения.

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

02 / Инструменты

Согласуйте Xcode, зависимости и подпись

С помощью xcode-select -p и xcodebuild -version проверьте версии. Для переключения укажите путь к реально установленной на узле версии Xcode, затем проверьте, какой SDK требуется проекту.

Сохраните Podfile.lock, Package.resolved и Gemfile.lock. Запускайте CocoaPods, SPM и Fastlane в соответствии с зафиксированным в проекте окружением. Импортируйте сертификаты и профили подготовки отдельно и проверьте доступ к приватному ключу.

03 / Подключение CI

Зарегистрируйте runner и настройте планирование

Создайте данные для регистрации self-hosted runner в проекте GitHub или GitLab, затем установите runner, следуя инструкциям платформы для macOS. Токен регистрации используйте только при контролируемой настройке — не сохраняйте его в репозитории или журналах сборки.

Добавьте runner метки, указывающие его назначение и набор инструментов, например macosиios-build. Сначала разрешите запуск задач подписи только из доверенных веток и ограничьте параллельность. Затем корректируйте настройки с учётом памяти, диска и журналов задач.

Сначала проверьте синхронизацию каталогов, затем передавайте файлы

rsync -avzn --exclude '.env' --exclude '.env.*' \
--exclude 'DerivedData/' ./MyApp/ xcr-build:~/builds/MyApp/

rsync -avz --exclude '.env' --exclude '.env.*' \
--exclude 'DerivedData/' ./MyApp/ xcr-build:~/builds/MyApp/

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

Завершите перенос записью с настройками

Запишите коммит исходного кода, версию Xcode, lock-файлы зависимостей, Scheme, параметры экспорта, метки runner и путь к артефактам. Сначала отдельно проверьте сборку с нуля и инкрементальную сборку, а затем решите, стоит ли копировать кэш. Команды на этой странице не являются тестом производительности и не гарантируют фиксированное время сборки.

Шесть терминов, которые стоит знать для подключения

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

Физический узел
Выделенный физический Mac под управлением macOS. Это не виртуальная машина: конфигурация чипа, памяти и диска соответствует выбранному тарифу, а весь компьютер выделен одному клиенту.
VNC
Протокол для удалённого просмотра и управления графическим рабочим столом. Подходит для визуальных настроек и проверки подписи. Указывайте способ аутентификации, порт и адрес подключения из предоставленных данных.
SSH-туннель
Перенаправляет локальный порт к удалённой службе через SSH-соединение. В примере выше трафик VNC идёт по аутентифицированному SSH-подключению. Закрытие туннеля прерывает соединение с рабочим столом.
self-hosted runner
Исполнитель задач CI, которым управляет ваша команда. После регистрации в проекте конвейер направляет задачи на этот Mac по меткам или условиям runner. Для выделенного узла всё равно нужно самостоятельно настроить параллельность задач и права доступа.
Keychain
Механизм macOS для хранения сертификатов, приватных ключей и разрешений на доступ. Успешная подпись в графическом интерфейсе не гарантирует, что приватный ключ будет доступен runner без интерактивного входа. Проверьте доступ от имени фактического пользователя сборки.
DerivedData
Каталог Xcode для промежуточных файлов, индексов и кэша модулей. Его можно пересоздать; это не резервная копия исходного кода. После смены версии или пути старый кэш может потребовать очистки.

Выбирайте узел с учётом того, кто работает с рабочим столом

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

Сингапур

SG · UTC+8

Подходит командам, чья основная совместная работа приходится на рабочие дни в Юго-Восточной Азии. Сначала проверьте работу удалённого рабочего стола из своей сети, затем — загрузку зависимостей и передачу артефактов.

Япония · Токио

JP · UTC+9

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

Южная Корея · Сеул

KR · UTC+9

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

Гонконг

HK · UTC+8

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

Восточное побережье США

US-E · UTC−5 / UTC−4

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

Западное побережье США

US-W · UTC−8 / UTC−7

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

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

Подключитесь по данным доступа за пять минут

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

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