Сначала подключение, затем сборка

От первого подключения по SSH
до первого archive

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

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

01 / Подключение

Сначала убедитесь, что подключаетесь к своему физическому узлу

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

  1. 01

    Проверьте данные экземпляра

    Откройте сведения об экземпляре в панели управления и запишите IP-адрес, порт и текущие данные для подключения. Далее используются обозначения NODE_IP,SSH_PORT и NODE_USER — это соответствующие значения. Перед выполнением задайте их в локальном терминале; не используйте имена переменных как адреса без изменений.

  2. 02

    Проверьте отпечаток хоста

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

  3. 03

    Смените пароль и настройте ключ

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

Сохраните параметры подключения под коротким именем

На локальном компьютере добавьте конфигурацию в файл ~/.ssh/config и замените три поля, написанные заглавными буквами, фактическими значениями из сведений об экземпляре.IdentityFile должен указывать на уже существующий локальный файл закрытого ключа. Если ключ ещё не создан, сначала выполните команду генерации справа.

Host armshell-dev
  HostName NODE_IP
  User NODE_USER
  Port SSH_PORT
  IdentityFile ~/.ssh/armshell_ed25519
  IdentitiesOnly yes
  ServerAliveInterval 30
  ServerAliveCountMax 3

Сохраните файл и подключитесь командой ssh armshell-dev . Если отпечаток хоста изменился, сначала проверьте, не был ли экземпляр предоставлен заново. Не удаляйте запись, чтобы затем просто продолжить вход.

Передавайте открытый ключ, а не закрытый

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

ssh-keygen -t ed25519 -f ~/.ssh/armshell_ed25519
cat ~/.ssh/armshell_ed25519.pub | ssh armshell-dev \
'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'
ssh -o PreferredAuthentications=publickey armshell-dev

После входа выполните команды whoami,sw_vers и df -h, чтобы проверить имя пользователя, версию системы и доступное место на диске. Если права отличаются от ожидаемых, сначала устраните проблему с доступом и только затем устанавливайте инструменты разработки.

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

Сначала проверьте сборку вручную, затем подключайте CI

Убедитесь, что нужная версия Xcode установлена и первичная настройка завершена. Ниже показаны формат команд и пример вывода. Версии, SDK и названия сертификатов зависят от вашего узла и проекта — это не перечень предустановленного ПО.

dev@armshell-tokyo
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
$ xcode-select -p
/Applications/Xcode.app/Contents/Developer

$ sudo xcodebuild -runFirstLaunch
$ xcodebuild -showsdks
iOS SDKs:
    iOS 18.0                       -sdk iphoneos18.0
iOS Simulator SDKs:
    Simulator - iOS 18.0           -sdk iphonesimulator18.0

$ bundle exec fastlane match development --readonly
[09:12:01]: Successfully decrypted certificates repo
[09:12:03]: Installing certificate...
[09:12:05]: Installing provisioning profile...
[09:12:06]: All required keys, certificates and provisioning profiles are installed

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

Выбор версии — настройка всего узла

xcode-select меняет каталог разработчика по умолчанию и влияет на другие задачи на этом компьютере. Если параллельно используются несколько версий, лучше задавать DEVELOPER_DIRдля отдельной задачи и выводить в начале журнала команду xcodebuild -version. Так при передаче задачи не будет случайно выбрана другая цепочка инструментов.

Ключ подписи должен быть доступен в текущем сеансе

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

archive — ещё не готовый релиз

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

03 / Графический интерфейс

Открывайте рабочий стол, только когда нужен графический интерфейс

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

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

Подключитесь к системе через доступный для экземпляра вход на рабочий стол. В macOS откройте «Системные настройки → Основные → Общий доступ» и проверьте настройку «Общий экран». Разрешите доступ только выбранным пользователям. Если общий экран конфликтует с удалённым управлением, сначала проверьте текущие настройки и не меняйте оба параметра одновременно.

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

Войдите в панель управления и создайте заявку

Клиент и способ подключения

В macOS можно использовать системное приложение «Общий экран». Для других систем подойдёт клиент с поддержкой протокола VNC и защищённого подключения. В первую очередь используйте безопасный способ доступа, предусмотренный для экземпляра; не выставляйте службу рабочего стола напрямую в недоверенную сеть.

Если вы убедились, что служба VNC на узле слушает порт 5900, создайте SSH-туннель командой ниже и подключите клиент к локальному адресу 127.0.0.1:5901.

ssh -N -L 5901:127.0.0.1:5900 armshell-dev

Сначала снизьте нагрузку на соединение

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

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

Графический интерфейс и командная строка работают на одном выделенном физическом компьютере.
04 / Непрерывная интеграция

Запустите Runner в уже проверенной среде

Зарегистрируйте Runner под отдельным пользователем для сборки macOS. Сначала проверьте зависимости, подпись и передачу результатов при одном параллельном задании. Увеличивайте параллелизм с учётом использования памяти и диска. Не запускайте недоверенные запросы на слияние на исполнителе, у которого есть данные для публикации.

GitLab: регистрация shell executor

Сначала установите GitLab Runner, подходящий для Apple Silicon. Команды ниже предполагают, что исполняемый файл доступен в PATH текущего пользователя, а Runner создан в интерфейсе управления CI и у вас есть адрес сервера и токен авторизации.

read -r CI_SERVER_URL
read -rs RUNNER_TOKEN
gitlab-runner register --non-interactive \
  --url "$CI_SERVER_URL" \
  --token "$RUNNER_TOKEN" \
  --executor shell
unset RUNNER_TOKEN
gitlab-runner verify
gitlab-runner install
gitlab-runner start
gitlab-runner status

В интерфейсе управления CI задайте понятные теги, например macos-arm64 и нужную проекту версию Xcode. Теги задания должны совпадать с тегами Runner. Сначала выполните команды whoami,xcodebuild -version, а затем запустите настоящую сборку.

GitHub Actions: регистрация self-hosted Runner

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

read -r REPOSITORY_URL
read -rs RUNNER_TOKEN
./config.sh --url "$REPOSITORY_URL" \
  --token "$RUNNER_TOKEN" \
  --labels macos-arm64 --unattended
unset RUNNER_TOKEN
./svc.sh install
./svc.sh start
./svc.sh status

В workflow укажите runs-on: [self-hosted, macOS, ARM64]. Если настроены собственные теги, добавьте их. Регистрация токена и запуск службы — разные этапы. После настройки проверьте состояние службы и выполните реальное тестовое задание.

Постоянная работа через launchd: после установки проверьте загруженные службы

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

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

ls "$HOME/Library/LaunchAgents"
launchctl print "gui/$(id -u)"
gitlab-runner status
./svc.sh status

Выполните подходящие команды проверки в каталоге каждого Runner. В неинтерактивной среде CI переменная PATH может отличаться от PATH в терминале. Пропишите пути Homebrew, Ruby и Xcode в скрипте сборки под контролем версий. Не допускайте попадания токенов в журналы.

05 / Данные

Синхронизируйте только изменения и храните резервные копии вне узла

Исходный код лучше получать клонированием репозитория. Большие каталоги, результаты сборки и файлы, которые не следует хранить в репозитории, можно синхронизировать через rsync по SSH. Арендованный узел — рабочая среда, а не единственное место хранения данных.

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

Сначала проверьте на обеих сторонах версию rsync --version. Ниже используются распространённые базовые параметры: завершающий слеш означает синхронизацию содержимого каталога, а список исключений нужно адаптировать под проект. Сначала внимательно проверьте результат пробного запуска и только затем уберите -n.

rsync -avzn --exclude '.git/' --exclude 'build/' \
  ./project/ armshell-dev:~/work/project/

rsync -avz --exclude '.git/' --exclude 'build/' \
  ./project/ armshell-dev:~/work/project/

rsync -avz armshell-dev:~/build/ ./artifacts/

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

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

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

Если нужно больше места, можно заказать дополнительный SSD на +1TB или +2TB. Расширение диска не заменяет резервное копирование: копии кода, результатов сборки и сертификатов должны храниться вне узла.

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

06 / Аккаунт и сроки

Добавьте проверку срока аренды в чек-лист перед релизом

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

Проверьте срок и время

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

Для проверки используйте данные заказа и дату окончания аренды.

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

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

Уточните в заявке правила пересчёта и срок вступления изменений в силу, если они не указаны.

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

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

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

Сначала определите: проблема в подключении или в задании

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

SSH не отвечает: с чего начать?
  1. Откройте сведения об экземпляре и проверьте IP-адрес, порт, заказ и состояние узла, чтобы исключить подключение к старому адресу.
  2. В локальном терминале выполните ssh -vvv armshell-devи определите, что происходит: тайм-аут, отказ в соединении или ошибка аутентификации. Это разные проблемы.
  3. Проверьте локальную сеть и правила исходящего трафика, затем повторите попытку через другую надёжную сеть. Отсутствие ответа ICMP само по себе не доказывает, что служба SSH недоступна.
  4. Если подключение зависает на этапе аутентификации, проверьте имя пользователя, права на закрытый ключ и привязку открытого ключа. Если постоянно возникает тайм-аут, приложите к заявке журнал с удалёнными конфиденциальными данными. Не сбрасывайте пароль снова и снова.
Xcode или зависимости загружаются медленно: как определить причину?
  1. Сначала выполните команду df -h и проверьте, достаточно ли места для установщика, распаковки и одновременного хранения предыдущей версии.
  2. Определите, что именно занимает время: передача установщика Xcode, загрузка зависимостей из репозитория или первая компиляция. Остановка журнала сборки не обязательно означает, что идёт загрузка.
  3. Используйте полный установщик из надёжного источника и проверьте его целостность. Не передавайте большие файлы одновременно с резервным копированием, чтобы задачи не конкурировали за пропускную способность.
  4. Запишите тип источника, размер файла, время начала и сообщение об ошибке. Не отправляйте ссылки на загрузку с токенами доступа. Если нужно проверить сеть узла, приложите эти сведения к заявке.
Удалённый рабочий стол подключился, но экран чёрный?
  1. Сначала проверьте, работает ли SSH, и выясните, недоступен весь узел или проблема только с сеансом рабочего стола.
  2. Проверьте, есть ли у пользователя права на общий экран и активен ли графический сеанс. Уменьшите разрешение и подключитесь снова.
  3. При использовании SSH-туннеля убедитесь, что терминал с туннелем ещё работает, а клиент подключается к локальному перенаправленному порту, а не к другому порту узла.
  4. Не перезагружайте принудительно узел, на котором идёт сборка. Сохраните доступные журналы, сообщите, удаётся ли увидеть экран входа, и создайте заявку на проверку.
Runner отключился или доступен, но не берёт задания?
  1. Сначала проверьте состояние службы и журналы процесса, затем — настройки в интерфейсе CI. Возможность подключиться к узлу по SSH не означает, что служба Runner запущена.
  2. Если Runner в сети, но не берёт задания, проверьте права проекта, теги Runner, условия выбора workflow и настройки защищённых веток.
  3. Если Runner отключается после перезагрузки, проверьте домен загрузки launchd и состояние входа пользователя сборки. Ручной запуск в терминале не заменяет постоянно работающую службу.
  4. Если задание завершилось с ошибкой после запуска, выведите имя пользователя, PATH, версию Xcode и рабочий каталог, а затем проверьте связку ключей и права на каталоги. Не начинайте с многократной отмены регистрации и повторного создания Runner.

SSH работает, но проблема осталась?

Отправьте нам сообщение об ошибке вместе с контекстом

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