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

Проблемы с облачным Mac? Проверяйте по уровням, а не наугад

От SSH, графического интерфейса и передачи файлов до Xcode, Runner, fastlane и сетей узлов: используйте воспроизводимые команды, сужайте область поиска и только затем меняйте конфигурацию или отправляйте заявку.

Выделенный физический сервер Графический интерфейс macOS и командная строка Диагностика сети четырёх узлов
Инженерный кластер из нескольких физических узлов Mac mini и сетевых каналов
diagnose@mac-node — zsh

$ ssh -v "$MAC_USER@$MAC_HOST"

debug1: Authentication succeeded

$ xcodebuild -version

Xcode toolchain ready

$ scutil --dns | grep nameserver

Resolver path verified

Первое подключение

Сначала установите проверяемое SSH-соединение

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

  1. 01

    Проверьте экземпляр и локальную среду

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

    export MAC_HOST="адрес хоста из консоли"
    export MAC_USER="имя пользователя из консоли"
    test -n "$MAC_HOST" && test -n "$MAC_USER" && echo "connection variables ready"
  2. 02

    Подключитесь впервые и проверьте отпечаток хоста

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

    ssh -v "$MAC_USER@$MAC_HOST"
    ssh-keygen -F "$MAC_HOST"
  3. 03

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

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

    ssh-keygen -t ed25519 -a 64 -f "$HOME/.ssh/macrents_build"
    cat "$HOME/.ssh/macrents_build.pub" | ssh "$MAC_USER@$MAC_HOST" 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'
    ssh -i "$HOME/.ssh/macrents_build" "$MAC_USER@$MAC_HOST"
  4. 04

    Зафиксируйте конфигурацию клиента и проверьте базовые параметры

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

    sw_vers
    whoami
    date
    df -h /
    uptime

Тайм-аут подключения и ошибка аутентификации — разные проблемы

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

Удалённый доступ

Выбирайте терминал, графический интерфейс или файловый канал под задачу

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

Подключение через терминал

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

ssh -vvv -o ServerAliveInterval=30 -o ServerAliveCountMax=4 "$MAC_USER@$MAC_HOST"

Удалённый графический рабочий стол

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

Передача файлов

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

rsync -azP --partial --exclude DerivedData/ ./project/ "$MAC_USER@$MAC_HOST:~/workspace/project/"

Безопасность сессии и восстановление после обрыва

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

tmux new -s build
tmux attach -t build
tail -n 200 "$HOME/logs/build.log"
Инструменты сборки

До анализа ошибки Xcode проверьте фактически используемую цепочку инструментов

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

Базовые команды проверки

xcode-select -p
xcodebuild -version
xcodebuild -showsdks
xcrun simctl list devices available
xcrun --find swift
swift --version
security list-keychains -d user
security find-identity -v -p codesigning
A

Каталог разработчика

xcode-select -p должна указывать на Xcode, необходимую для этой сборки. Если путь не совпадает, сначала остановите Runner, переключите каталог и запустите его заново, чтобы выполняющаяся задача не унаследовала старую среду.

B

SDK и симулятор

Если целевой SDK отсутствует в выводе -showsdks , изменение параметров проекта не добавит недостающую цепочку инструментов. Для задач симулятора также проверьте состояние устройства, версию среды выполнения и свободное место на диске.

C

Идентификатор подписи и связка ключей

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

D

Минимальное воспроизведение сборки

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

set -o pipefail
xcodebuild -workspace Project.xcworkspace -scheme Project -configuration Release -destination 'generic/platform=macOS' clean build | tee "$HOME/logs/xcode-build.log"
printf 'exit_code=%s\n' "$?"
Автоматизация

Регистрация Runner ещё не означает воспроизводимость среды сборки

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

GitHub Actions

Self-hosted Mac Runner

В настройках проекта или организации один раз создайте данные регистрации и зарегистрируйте Runner на облачном Mac под выделенным системным пользователем. Метки должны различать ОС, класс чипа и назначение; направляйте задачи macOS только на соответствующие узлы.

  • После регистрации установите как постоянно работающую службу
  • Разделите каталог сборки и каталог учётных данных
  • Удаляйте временные материалы подписи после каждой задачи
  • Сначала ограничьте параллельность одним заданием, затем оцените очередь
whoami
xcode-select -p
printenv | sort
df -h "$HOME"
GitLab CI

Runner для macOS

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

  • Проверьте метки и правила защищённых веток
  • Добавьте версии инструментов и зависимостей в ключ кэша
  • Используйте повтор только для кратковременных сетевых сбоев
  • Перед загрузкой артефактов запишите контрольную сумму и размер
git status --short
git rev-parse HEAD
shasum -a 256 "$HOME/artifacts/app.zip"
du -sh "$HOME/build-cache"
Постоянно работающий агент сборки

Запуск как служба

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

  • Настройте стабильный уникальный рабочий каталог
  • Ограничьте размер журналов и сохраняйте контекст сбоя
  • Автоматически восстанавливайте работу после перезапуска, избегая циклов сбоев
  • Регулярно проверяйте инструменты и базовые параметры диска
launchctl list | grep build
ps aux | grep '[b]uild-agent'
lsof -nP -iTCP -sTCP:ESTABLISHED
tail -n 200 "$HOME/logs/agent.log"

Рекомендуемый минимальный порядок подключения

  1. Проверка среды: Выведите пользователя, путь к Xcode, версию, сведения о диске и рабочий каталог.
  2. Задача репозитория: Выполните только получение кода и разрешение зависимостей, проверив сеть и права доступа к файлам.
  3. Сборка без подписи: Проверьте компиляцию и тесты, исключив переменные сертификатов.
  4. Подписанный архив: Подключите контролируемую связку ключей и необходимые переменные среды.
  5. Загрузка артефактов: Запишите код выхода, размер файла, контрольную сумму и журнал загрузки.
  6. Расширение параллельности: Перед увеличением числа задач проверьте CPU, унифицированную память, операции диска и время в очереди.
Автоматизация релиза

При сбое fastlane разделяйте сертификаты, права, переменные и журналы

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

Типовые проблемы fastlane, команды проверки и способы диагностики
Уровень диагностики Типичное проявление Что проверить сначала Принцип решения
Сертификат Идентификатор подписи не найден, число идентификаторов равно нулю security find-identity -v -p codesigning Проверьте целевую связку ключей, действительность сертификата и соответствие закрытого ключа
Профиль подготовки Несовпадение идентификатора, различия в возможностях Целевой идентификатор, сведения о команде, необходимые возможности и содержимое файла Не смешивайте профили подготовки разных проектов или сред
Права связки ключей В терминале сборка проходит, Runner не может подписать Пользователь запуска, список поиска, состояние разблокировки и контроль доступа к закрытому ключу Разрешите процессу автоматизации доступ только к материалам подписи текущей задачи
Переменные среды В интерактивном режиме выполняется, службе не хватает параметров printenv : различия в обезличенных данных и конфигурации запуска службы Явно передавайте переменные, не полагаясь на конфигурационные файлы интерактивного Shell
Журнал загрузки Архивация успешна, но загрузка прервана или вернула ненулевой статус Полный код выхода, число повторов, размер файла и временная шкала сети Сначала проверьте артефакт, затем отделите проблему загрузки от проблемы сборки
Почему команда в терминале выполняется успешно, а Runner сообщает, что идентификатор подписи не найден?

Чаще всего причина в другом пользователе запуска или в том, что процесс службы не унаследовал список поиска связок ключей интерактивной сессии. Отдельно запишите whoamisecurity list-keychains -d user и вывод идентификаторов подписи, затем сравните две среды выполнения. Не скрывайте проблему границ пользователей, ослабляя права доступа ко всем закрытым ключам.

Как понять, что fastlane не хватает переменной среды, а не параметра проекта?

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

Какие журналы сохранить при обращении по проблеме fastlane?

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

Сеть четырёх узлов

Сравнивайте Сингапур, Японию (Токио), Южную Корею (Сеул) и Гонконг по одному набору показателей

Выбирайте узел с учётом расположения команды, источников кода и зависимостей, места назначения артефактов и реального маршрута. Не ориентируйтесь на один замер задержки: сравнивайте RTT, потери пакетов, DNS-разрешение и изменения маршрута, фиксируя период тестирования.

SG

Сингапур

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

JP

Япония (Токио)

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

KR

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

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

HK

Гонконг

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

Задержка и потери пакетов

Краткий тест подтверждает доступность, а длительный выявляет джиттер и периодические потери пакетов. Установите $MAC_HOST в адрес текущего экземпляра и выполните:

ping -c 20 "$MAC_HOST"
nc -vz -w 5 "$MAC_HOST" 22
traceroute "$MAC_HOST"

DNS и локальное разрешение

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

scutil --dns
dscacheutil -q host -a name "$MAC_HOST"
dig "$MAC_HOST"

Маршрут и интерфейс

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

route -n get "$MAC_HOST"
netstat -rn
ifconfig
networkQuality

Проверка транспортного уровня

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

time scp "$HOME/test-transfer.bin" "$MAC_USER@$MAC_HOST:~/"
shasum -a 256 "$HOME/test-transfer.bin"
ssh "$MAC_USER@$MAC_HOST" 'shasum -a 256 ~/test-transfer.bin'

Все узлы стабильно работают 365 дней в году

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

Обращение в службу поддержки

Отправляйте заявку с воспроизводимым контекстом

Существующим пользователям рекомендуется войти в консоль и отправить заявку — это упростит привязку к заказу и экземпляру. Если войти в консоль невозможно, отправьте письмо на адрес support@macrents.com. Оба способа попадают в один и тот же процесс поддержки.

Что указать в заявке

  • Номер заказа и затронутый экземпляр
  • Узел: Сингапур, Япония (Токио), Южная Корея (Сеул) или Гонконг
  • Период возникновения проблемы и часовой пояс
  • Ожидаемый и фактический результат, шаги воспроизведения
  • Система клиента, тип сети и используемый протокол
  • Код выхода команд и относящиеся к проблеме обезличенные журналы
  • Уже выполненные шаги диагностики и их результаты

Не отправляйте в сообщении

  • Файлы закрытых ключей или их содержимое
  • Полные пароли, токены доступа или данные сессий
  • Пароли сертификатов и незашифрованные материалы подписи
  • Полную базу данных или архив проекта с пользовательскими данными
  • Необработанные персональные данные и коммерческую тайну

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

Порядок обработки после отправки

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

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

Следующий шаг

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

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