← К дневнику разработки

GitHub Actions macOS self-hosted на облачном Mac в 2026: настройка, Keychain, параллелизм и стоимость

Технический блог · 2026.05.22 · ~11 мин

Self-hosted macOS runner GitHub Actions на облачном Mac mini

Когда ваш конвейер iOS запускает xcodebuild archive дюжину раз в неделю, поминутный счет GitHub Actions macOS начинает работать быстрее, чем это делают инженеры. Что на самом деле нужно командам платформы, так это выделенная облачная машина для сборки Mac, на которой работает автономная среда выполнения macOS со стабильной связкой ключей, путями к производным данным и проверяемым выходным IP-адресом. В этом посте рассматривается только этот шаблон перехода, а не «xcode для Windows». дерево решений (VM vs Cloud Mac vs CI), а не сценарий загрузки места TestFlight (Канадская полоса TestFlight).

Прежде чем выбрать хостинг или автономный хостинг, обратите внимание на три идеи:

  • Размещенная macOS: оплата поминутно

    Тяжелые трубопроводы в первую очередь увеличивают счета; Общедоступные цены часто составляют несколько центов за минуту – проверьте это в своем счете.

    ≈ 0,08 доллара США в минуту

  • Начните с одного облачного Mac и одной очереди

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

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

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

1. Когда следует отказаться от размещенных версий macOS

Размещенные средства выполнения GitHub Actions macOS не требуют операций и управляются очередями. Скрытые затраты: счета за минуты пиковой нагрузки, сохранение артефактов и отладка за пределами Тихого океана только по фрагментам журналов. Рассмотрите возможность использования автономных версий macOS на облачной машине для сборки Mac, когда:

  • Один репозиторий занимает более 3000 минут в macOS в месяц, при этом преобладают холодные производные данные.
  • Вам необходимо стабильное имя хоста или выделенный IPv4 для API ASC, веб-перехватчиков или корпоративных списков разрешений.
  • Сертификаты распространения и match должны храниться в единственном устройстве записи – ни в коем случае не в связке ключей общего размещенного пула.
  • Дневные фиксации в Азиатско-Тихоокеанском регионе с ночными пакетами в Северной Америке—то же место в Канаде, что и нотариальное заверение и Выпуск автономных модулей Runbook.

2. Минуты хостинга и выделенное место для Mac в облаке

MacOS, размещенный на GitHub, или локальный облачный Mac: как выбрать
Сравнить Размещено на GitHub В минуту · ноль операций Автономное размещение Cloud Mac Фиксированное сиденье · SSH-отладка
ОплатаПоминутная + очередьФиксированное ежемесячное место + легкие операции
Окружающая средаИзображение может смещатьсяВы закрепляете Xcode, Ruby, Fastlane
Связка ключейВнедрение секретов; ограниченная разблокировкаСвязка ключей для входа + разминка запуска
ДискЭфемерный; большие архивы достигают предела512 ГБ–2ТБ для производных данных
ОтладкаВ основном фрагменты журналовSSH и воспроизведение на одном хосте
Оптимально длялегких артефактов iOS, спорадических сборокеженедельного TestFlight, параллельных схем

Окончательная стоимость: 5000 минут macOS в месяц по цене ~0,08 доллара США ≈ 400 долларов США в месяц на хостинге (без учета множителей частного репо). Облачное место Mac M4 24 ГБ/512 часто работает в той же полосе частот, а также обеспечивает прием VNC и загрузку Fastlane — структурное преимущество машины для сборки облачных Mac над SaaS, поддерживающим только CI.

3. Ярлыки, параллелизм и границы одного автора

Не совмещайте компиляцию, подписание и загрузку ASC в одном задании с использованием одной и той же цепочки ключей. Безопасное разделение до 2026 года:

  • Ярлыки: macos-m4-canada (регион), signing (только совпадение), build (параллельно 2, если 24 ГБ и более).
  • Параллелизм: задания на подписание concurrency: signing global 1; Задания сборки могут выполняться по два на ветку с изоляцией производных данных.
  • Регионы: бегуны в Азиатско-Тихоокеанском регионе для ворса/единицы; Канада облачная машина для сборки Mac для archive + exportArchive.
По сравнению с Xcode Cloud
Xcode Cloud продает интеграцию; Самостоятельные программы для запуска macOS продают проверяемые диски и пользовательские Fastlane. Многие команды используют оба варианта: Cloud для PR и Cloud Mac для Release/Match.

4. Зарегистрируйте бегуна на облачном Mac (первый хост)

GitHub → Настройки → Действия → Бегуны → Новый автономный раннер → macOS. SSH в облачный Mac; предпочитайте выделенного пользователя Unix runner отдельно от интерактивных администраторов VNC.

Зарегистрировать и установить как услугу (пример)
mkdir -p ~/actions-runner && cd ~/actions-runner
curl -o actions-runner-osx-arm64.tar.gz -L \
  https://github.com/actions/runner/releases/download/v2.319.1/actions-runner-osx-arm64-2.319.1.tar.gz
tar xzf actions-runner-osx-arm64.tar.gz
./config.sh --url https://github.com/YOUR_ORG/YOUR_REPO \
  --token YOUR_TOKEN --labels macos-m4-canada,arm64 --unattended
sudo ./svc.sh install && sudo ./svc.sh start
./run.sh --check

Рабочий процесс Smoke с runs-on: [self-hosted, macos-m4-canada], запускающий sw_vers && xcodebuild -version. Закрепите Xcode с помощью xcode-select и задокументируйте версию в README.

5. Брелок, совпадение и автоматическая разблокировка

Основной локальный сбой: кодовому дизайну не удалось найти личность. На облачном Mac:

  1. Импортировать сертификат распространения в связку ключей login; ACL для codesign / security.
  2. Выделите задание match с помощью concurrency: signing; другие job читают только provisioning profiles.
  3. Используйте security set-key-partition-list для разблокировки CI – только для сборки машины, никогда не копируйте на ноутбуки.
  4. Задайте явный KEYCHAIN_PATH в workflows, чтобы эфемерные keychain GHA не перекрывали вывод match.
Фрагмент рабочего процесса: закреплен на локальном хостинге
jobs:
  archive:
    runs-on: [self-hosted, macos-m4-canada, build]
    steps:
      - uses: actions/checkout@v4
      - name: Build archive
        run: |
          xcodebuild -scheme MyApp -configuration Release \
            -archivePath $RUNNER_TEMP/MyApp.xcarchive archive

6. Усиление безопасности облачного приложения для Mac

Автономные средства запуска выполняют произвольный код из ваших репозиториев (и разветвляются, если они неправильно настроены). Относитесь к машине для сборки облачных Mac как к бастиону для подписания продукции, а не как к виртуальной машине для хобби.

  • Область репозитория: отдавайте предпочтение исполнителям на уровне организации с явными списками разрешений репозитория; отключите рабочие процессы PR-форка, если вы не доверяете защите ветвей.
  • Разделение пользователей: запускайте службу от имени runner, а не администратора; запретить вход по VNC этому пользователю.
  • Секреты. Сохраняйте соответствующий пароль и ключ API ASC в средах GitHub с необходимыми рецензентами; ротация ежеквартально.
  • Сеть: разрешить исходящий трафик GitHub + Apple CDN; блокировать входящий трафик, за исключением SSH, с IP-адресов офиса или Tailscale.
  • Шифрование диска. FileVault на облачном Mac — это настольная игра; При экспорте снимков следует исключать *.p12, если они не зашифрованы в хранилище.
Угрозы и меры по их устранению в облачной версии Mac
РискСнижение риска на облачном Mac
Рабочий процесс вредоносного форка PRТребуется одобрение участника; нет самостоятельного размещения в публичных вилках
Украденный регистрационный токенНедолговечные токены; перерегистрируйтесь после основного окна
Исчерпание диска при параллельном заданииОграничения одновременной обработки + водяные знаки диска (следующий раздел)
Утечка производных данныхОтдельные метки подписи; очистить RUNNER_TEMP после задания

7. Операции: водяные знаки на диске, обновления Xcode, ротация бегунов

Водяные знаки и действия на диске
УровеньИспользование дискаДействие
Зеленый< 70 %Ротируют производные данные старше 14 дней
Желтый70–85%Отбросить параллель 2; удалить загруженные архивы
Красный> 85%Блокируют новые архивы; Проверка VNC и расширение диска

Незначительные обновления Xcode: ./svc.sh stop, обновление, рабочий процесс дыма, svc.sh start. Ежемесячно обновляйте пакет Action-Runner в период обслуживания; сохранить предыдущий каталог для отката.

8. Бегуны на уровне организации и бегуны для каждого репозитория

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

  • Группы исполнителей сопоставляются со средами (например, ios-release видит только метки signing).
  • Эфемерные программы (при наличии лицензии) очищают диск после каждого задания – отлично подходят для ненадежных заданий сборки и неэффективны для кэшей совпадений; держите эфемерным подальше от подписывающего хоста.
  • Совет по политике: документ, в котором репозитории могут устанавливать runs-on: [self-hosted] в CODEOWNERS; мошеннические рабочие процессы — основной путь утечки информации.

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

repository_dispatch из фермы компиляции APAC
# .github/workflows/canada-archive.yml
on:
  repository_dispatch:
    types: [archive-ready]
jobs:
  archive:
    runs-on: [self-hosted, macos-m4-canada, build]
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.client_payload.sha }}
      - run: xcodebuild -scheme App archive -archivePath $RUNNER_TEMP/App.xcarchive

Исполнители Linux в Азиатско-Тихоокеанском регионе завершают модульные тесты, а затем отправляют в Канаду с SHA фиксации и URL-адресами артефактов. Этот шаблон позволяет избежать оплаты минут macOS за lint, сохраняя при этом задержку архива рядом с Apple CDN в Северной Америке.

9. Наблюдаемость: что регистрировать в случае сбоя заданий

Размещенные бегуны скрывают инфраструктуру; Самостоятельное размещение заставляет вас владеть сигналами. Минимально возможная наблюдаемость без полного счета за Datadog:

  1. Отправьте ~/actions-runner/_diag/Runner_*.log в свой стек журналов в красных сборках (rsync или агент).
  2. Cron каждые 5 минут: df -h / + ./run.sh --check в PagerDuty, когда бегун находится в автономном режиме > 10 минут.
  3. Аннотируйте рабочие процессы с помощью run-id в выходных данных Fastlane, чтобы сопоставить ошибки загрузки ASC.
  4. Отслеживать глубину очереди: if > 3 ожидающих задания для macOS, предупредите канал платформы, прежде чем разработчики обвинят «GitHub работает медленно».

Транстихоокеанским командам следует регистрировать RTT из офиса в Азиатско-Тихоокеанском регионе в облачный Mac SSH отдельно от задержки GitHub API – путаница этих двух факторов приводит к неправильным решениям по масштабированию (больше участников против лучшего региона).

10. Контрольный список Runbook на первую неделю

  1. Предоставьте одну машину для сборки облачных Mac (минимум 24 ГБ/512 ГБ; 1 ТБ для еженедельных выпусков > 3).
  2. Зарегистрировать бегуна + ярлыки; оставьте runs-on по умолчанию на хосте до тех пор, пока не будут перенесены рабочие процессы выпуска.
  3. Дым → пустой архив → подписанная внутренняя сборка (загрузка необязательна).
  4. Отслеживать минуты хостинга; если все еще < 1500 в месяц, отсрочка вторичного РЕПО.
  5. Ключ ASC API документа + доступ на запись соответствует только на этом хосте.
  6. Оповещения о диске + хранение ~/actions-runner/_diag 7 дней.

14. Часто задаваемые вопросы

Разрешены ли самостоятельные запуски macOS?

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

Сколько бегунов на одном облачном Mac?

Возможно несколько папок; для подписи iOS и дискового ввода-вывода отдайте предпочтение одной очереди на физический Mac и используйте метки для типов заданий.

Раннер ARM64 и матрицы симулятора x86?

Собственные сборки Apple Silicon используются по умолчанию; добавляйте облачный компьютер Intel Mac или размещенные на нем бегунки только в том случае, если вам действительно нужны сетки симулятора x86.

Агенты GitLab для macOS?

Тот же шаблон: фиксированный хост + агент macOS. В этой статье сохранен синтаксис действий/рабочего процесса GitHub.

Частные репозитории и поминутные цены?

Свыше ~3000 минут macOS в месяц или если вам нужен фиксированный IP-адрес или связка ключей, выделенное место часто выигрывает в течение 2–3 месяцев.

Оповещения бегунов в автономном режиме?

Используйте API-интерфейсы GitHub Runner (Enterprise) или cron ./run.sh --check с внешними проверками работоспособности.

Подходит ли Hashvps?

Да, если вам нужны выделенные узлы IPv4, M4 без операционной системы и узлы в Канаде/Азиатско-Тихоокеанском регионе, работающие в нескольких регионах – перед оформлением заказа сравните показатели задержки и уровни дисков.

Следует ли кэшировать производные данные на автономных бегунах?

Да, на выделенном облачном Mac: смонтируйте стабильный путь, например /Users/runner/DerivedDataCache, и кэши ключей с помощью $(SWIFT_VERSION)-$(hash Package.resolved). Недействителен при неровностях зависимости. Хостинговые бегуны уже делают это непрозрачно; Самостоятельное размещение возлагает на вас ответственность, но экономит 30–50 % времени при дополнительных сборках.

А как насчет M4 Pro / 32 ГБ для параллельных целей iOS + watchOS?

Параллельный xcodebuild с 24 ГБ работает для двух средних приложений, если подпись остается сериализованной. Добавьте ОЗУ перед добавлением второй папки бегуна на тот же диск – нехватка памяти проявляется в виде хлопьев симулятора и загадочного clang OOM, а не четких предупреждений.

12. Трехэтапный перенос с хостовой macOS за несколько минут

Большой взрыв разрывает поезда. Используйте поэтапную миграцию в течение двух спринтов:

Этап А (неделя 1): Регистрация облачного средства запуска Mac; запускать теневые рабочие процессы только в workflow_dispatch; сравнивайте журналы и время с размещенными заданиями на том же коммите. Не трогайте подпись.

Этап Б (2-я неделя): Переместите задания archive в runs-on: [self-hosted, build]; оставляйте upload_to_testflight на хостинге или вручную, пока связка ключей не станет стабильной 5 ночей подряд.

Этап C (3+ неделя): Переместите задания сопоставления и подписи на метку signing с параллелизмом 1; отключить размещение macOS в ветке по умолчанию; оставьте одно экстренное задание позади workflow_dispatch для аварийного восстановления.

Общайтесь с разработчиками: интерактивный симулятор остается на ноутбуках APAC или в облаке VNC Mac; CI-лейн не является заменой настольного компьютера. Такое управление ожиданиями предотвращает теневое копирование ИТ-Mac mini на рабочих столах, «поскольку CI работает медленно».

Триггер отката: если глубина собственной очереди превышает четыре задания в течение двух часов или дважды происходит сбой при проектировании кода для несвязанных коммитов, повторно включите размещенный archive на 48 часов, пока вы используете SSH. Сохраните ссылку Runbook в README рабочего процесса, чтобы дежурный оператор не собирал историю Slack в 2 часа ночи.

13. Таблица совокупной стоимости владения за двенадцать месяцев (копия в отдел финансов)

Финансы запросят точные цифры. Используйте эту таблицу в качестве стартового шаблона; подключите минутный уровень вашей организации и цену облачного Mac.

Оценка совокупной стоимости владения за 12 месяцев (замените счетом)
ПозицияРазмещенная macOS (~5 тыс. мин/мес)Единое облачное место для Mac
ВычислениеПеременная ~400 долл. США в месяц~250 долларов США – 450 долларов в месяц фиксированная
Операционная работаПочти нольЗаплаты ~4 часа в месяц
Риск сбояСкаки в очереди GitHubРабота в автономном режиме = заблокированный выпуск
Аудит подписиСложнее доказать фиксированный IPВыделенное доказательство IPv4 + VNC
БезубыточностьЧасто 2–4 месяц, когда минуты macOS > 3k и матч должны оставаться стабильными

Добавьте скрытую экономию: меньше перестроек после того, как “работает на хосте, происходит сбой локально” дрейф и более быстрое реагирование на инциденты, когда SSH находится на расстоянии одной команды от журнала сбоя xcodebuild.

Отдел финансов может спросить, почему вы все еще платите за несколько минут хостинга после перехода. Сохраните небольшой размещенный пул для зеркал с открытым исходным кодом, экстренных запросов от форков или бета-версий Xcode, которые вам не нужны на подписывающем хосте – обычно 5–10 % от предыдущих затрат, а не ноль.

Закрепите GitHub Actions на реальном облачном компьютере для сборки Mac

Автономные версии macOS обеспечивают независимость среды: унифицированная память M4 сокращает архивы; встроенный codesign и OpenSSH сохраняют Fastlane/match на том же хосте, что и GHA; ~4 Вт в режиме ожидания и безвентиляторная тишина подходят для круглосуточных очередей; Gatekeeper и FileVault блокируют ключи API и сертификаты для проверяемого выхода — лучше, чем размещенные пулы с еженедельным сбросом для шлюзов выпуска.

Перенос рабочих процессов выпуска без поминутной оплаты? Сравнить облачные планы Mac и зарегистрируйте своего первого бегуна на этой неделе.

Hashvps · Mac Cloud

Выделенный облачный Mac для своих runner

Mac mini M4 bare metal, выделенный IPv4, круглосуточные self-hosted macOS runner и Fastlane.

На главную
Акция