По состоянию на 5 сентября 2026 года Runner Scale Set Client в официальном репозитории GitHub помечен как Public Preview: он может связывать сигналы очереди и временную конфигурацию, но не поставляет физический Mac автоматически. Поэтому наш вывод практичен: при стабильной нагрузке оставляйте фиксированный Mac Runner, а при релизных пиках и строгой изоляции добавляйте ephemeral runner. Для большинства команд оптимальна гибридная схема — фиксированная базовая мощность плюс эластичный пул.
Кому предназначен этот материал:
- руководителям мобильной разработки, которым нужно убрать очередь на публикации, не оплачивая постоянно простаивающие узлы;
- DevOps- и platform-инженерам, проектирующим регистрацию, маршрутизацию, очистку и возврат Mac;
- ответственным за безопасность и релиз, которым нужно отделить кодовую сборку от задач с сертификатами и ключами.
Рабочее решение на первую неделю
Начните не с покупки дополнительных узлов и не с массовой миграции на временную схему. За одну рабочую неделю соберите из истории GitHub Actions четыре группы данных: время ожидания до назначения Runner, фактическую занятость узлов, типы пиковых заданий и причины неуспешных запусков. Время ожидания нужно отделить от времени поставки Mac: это разные задержки и они требуют разных решений.
Затем разделите pipeline на два потока:
- обычная сборка и тесты;
- публикация, подписание и действия с внутренними ресурсами.
Если первая группа постоянно загружает базовый узел, а вторая возникает короткими всплесками, не увеличивайте фиксированный парк по числу разработчиков. Сохраните узел для предсказуемой повседневной работы и проверьте временную аренду Mac для пиков. На странице тарифов JexMac заранее сопоставьте период использования с длительностью эксперимента, но решение принимайте по фактической очереди, а не по рекламной оценке производительности.
Важно: регистрация временного Runner означает завершение его жизненного цикла в GitHub Actions, но не гарантирует очистку самого Mac. Рабочая директория, кэш, брелок, локальные логи и временные файлы требуют отдельной процедуры.
Фиксированный Runner для стабильного репозитория
Постоянный Mac Runner оправдан, когда источник заданий контролируем, число репозиториев невелико, а инструменты долго устанавливаются или требуют устойчивого кэша. Это особенно заметно в проектах с несколькими версиями Xcode, приватными пакетами, тестовыми симуляторами и локальными скриптами подготовки окружения.
Его преимущество не сводится к скорости. Команда получает понятное состояние узла: установленный SDK, рабочие версии инструментов, локальные зависимости и предсказуемый процесс обновления. Если сборка сломалась после изменения окружения, инженеру проще исследовать конкретный хост, чем восстанавливать неизвестное состояние каждого нового экземпляра.
Однако постоянный Runner не является безопасным по умолчанию. Мы бы закрепили за ним конкретный Runner Group, ограничили доступ репозиториями с одинаковым уровнем доверия и назначили отдельное окно обслуживания. Документация GitHub о группах Runner и правах доступа прямо связывает маршрутизацию узлов с областью доступа, поэтому один общий узел для внутренних и внешних репозиториев — плохая отправная точка.
Фиксированная схема не подходит, если:
- релизные задания образуют очередь только несколько раз в месяц;
- разные команды требуют несовместимые версии Xcode;
- в рабочем каталоге остаются артефакты другого репозитория;
- узел содержит сертификаты, но задания могут запускаться из недостаточно доверенного источника;
- авария одного хоста останавливает единственный путь публикации.
Условия выбора
- Если очередь невелика, среда меняется редко, а кэш действительно сокращает подготовку — выбирайте фиксированный Runner.
- Если загрузка скачет, а постоянное увеличение парка оставит узлы незанятыми — переходите к базовой мощности и временному пулу.
- Если фиксированный хост хранит критичный ключ или сертификат — ограничьте источники заданий и подготовьте резервный путь публикации.
- Если проблема вызвана неправильной маршрутизацией, а не нехваткой Mac — сначала исправьте Runner Group и метки.
Релизные пики и эластическое масштабирование Mac Runner
Эластическое масштабирование Mac Runner имеет смысл, когда пик можно заранее описать: массовое слияние веток перед релизом, ночная матрица тестов или повторяющееся окно публикации. Нельзя считать любой короткий всплеск достаточным основанием для автоматизации. Сначала нужно проверить, сколько времени занимает запуск Mac, установка или проверка окружения, регистрация Runner, выполнение задания и уборка.
Есть три разных реакции на очередь:
| Подход | Когда подходит | Главный риск | Что проверить |
|---|---|---|---|
| Дополнительный постоянный Runner | Нагрузка повторяется почти ежедневно | Оплата и обслуживание простаивающего узла | Фактическую занятость базовых узлов и частоту пиков |
| Предварительно прогретый временный пул | Пик известен заранее | Пул может простаивать до релиза | Время готовности и корректность повторного использования |
| Запуск по сигналу очереди | Пики нерегулярны, но достаточно велики | Поставка Mac может быть дольше допустимого ожидания | Очередь, поставку, регистрацию, возврат и аварийное удаление |
В официальной документации по self-hosted Runner важно различать назначение задания и жизненный цикл хоста. GitHub Actions может подобрать доступный Runner, но внешний слой всё равно отвечает за то, откуда появляется Mac и в каком состоянии он приходит.
Для проверки эластичного пула используйте не усреднённую загрузку, а конкретный релизный сценарий. Возьмите самый тяжёлый тип задания, воспроизведите ожидаемую очередь и запишите:
- момент появления сигнала;
- момент, когда Mac доступен инфраструктуре;
- время регистрации Runner;
- время старта задания;
- результат публикации;
- момент удаления регистрации;
- подтверждение очистки или утилизации хоста.
Только после этого можно решать, действительно ли временная аренда Mac закрывает пик. Если Mac появляется после того, как приемлемое окно релиза уже прошло, формальное «масштабирование» не решает задачу.
Общий пул для нескольких репозиториев
Совместное использование Mac выглядит экономно, пока команды не начинают конкурировать за версии Xcode, кэш и доверие к исходному коду. Для организационного пула сначала создайте несколько логических классов, а уже затем определяйте механизм расширения:
| Критерий маршрутизации | Пример класса | Почему нельзя смешивать без проверки |
|---|---|---|
| Уровень доверия | внутренние репозитории и внешние pull request | скрипты сборки получают разные права и риски |
| Версия инструментов | Xcode с закреплённым SDK | несовместимые окружения дают непредсказуемые ошибки |
| Тип задания | тесты, обычная сборка, публикация | подпись и доступ к сети не должны быть доступны всему пулу |
| Состояние узла | чистый временный Mac и постоянный кэшированный Mac | разные требования к очистке и восстановлению |
Метку нельзя воспринимать как механизм безопасности сама по себе. Она помогает направить задание, но область, в которой репозиторий может использовать Runner, должна быть ограничена через группы и права. Руководство GitHub по меткам Runner следует использовать вместе с настройками доступа, а не вместо них.
Для каждого класса задайте отдельный маршрут:
- внутренние тесты — общий пул без ключей публикации;
- обычная сборка — узлы с нужной версией Xcode и разрешённым кэшем;
- публикация — ограниченный пул с минимальным числом репозиториев;
- задания из недоверенного источника — отдельный чистый узел либо запрет на self-hosted Runner.
Такой подход уменьшает вероятность загрязнения, но не устраняет её автоматически. Постоянный Mac может сохранить рабочую директорию, файлы Swift Package Manager, DerivedData, временный конфиг или состояние брелока. Ephemeral runner тоже не делает физическую машину чистой: после отмены регистрации исчезает запись Runner, а данные на диске могут остаться.
Наше правило приёмки: нельзя считать узел освобождённым, пока внешняя система не зафиксировала удаление рабочей директории, временных секретов, кэша и локальных логов либо не подтвердила уничтожение самого экземпляра.
Подписание и приватная сеть требуют отдельного маршрута
Сборка без подписи и публикация в магазин приложений — разные классы риска. Для обычных тестов можно использовать временный Mac с повторяемым установочным сценарием. Для подписи добавляются брелок, сертификаты, профиль provisioning, доступ к приватному репозиторию и иногда соединение с внутренней сетью.
Фиксированный узел здесь удобен: команда один раз проверяет цепочку сертификатов, сетевые маршруты, разрешения и версии инструментов. Цена удобства — постоянное наличие чувствительных материалов и более высокая ответственность за ограничение источников заданий.
Временный узел безопаснее с точки зрения срока жизни, только если процесс действительно воспроизводим. Нужно заранее определить:
- откуда поступает секрет;
- как он попадает в брелок;
- когда он становится доступен только текущей задаче;
- как выполняется отзыв или удаление;
- как проверяется отсутствие остатка после завершения;
- что происходит при прерывании задания и потере связи.
Рекомендации GitHub по безопасному использованию self-hosted Runner не следует заменять фразой «Runner временный, значит риск исчезает». Задание выполняется на вашей инфраструктуре, а вредоносный или ошибочный скрипт может получить доступ ко всему, что присутствует на хосте и разрешено его пользователю.
Runner Scale Set Client и реальные Mac-хосты
Runner Scale Set Client — не готовая система поставки Mac. Согласно официальному репозиторию actions/scaleset, клиент взаимодействует с API Runner Scale Set и помогает получать временную конфигурацию для Runner. По состоянию на 5 сентября 2026 года проект остаётся Public Preview, поэтому интерфейсы и операционные допущения нужно проверять перед каждым внедрением.
Разделяйте следующие уровни:
| Уровень | Ответственность | Что не следует ему приписывать |
|---|---|---|
| GitHub Actions | очередь задания и назначение Runner | физическое создание Mac |
| Runner Scale Set Client | связь с API и временная конфигурация | очистку диска и возврат хоста |
| Ваша инфраструктура | запуск, остановка, снабжение и удаление Mac | автоматическую гарантию безопасного состояния |
| Контроль безопасности | права, секреты, журналы и аудит | исправление ошибочной маршрутизации задним числом |
Не переносите на реальные Mac модель ARC, где Runner запускается как Kubernetes Pod. Описание Actions Runner Controller относится к Kubernetes-сценарию; оно не доказывает, что физический или удалённый macOS-хост будет создан, очищен и возвращён тем же способом.
Минимальная проверочная цепочка должна включать пять переходов: сигнал очереди, поставку Mac, регистрацию одного Runner, завершение задания с отменой регистрации и аварийное удаление. Если хотя бы один переход не наблюдаем во внешних логах, команда не сможет отличить задержку GitHub от сбоя собственной инфраструктуры.
Оценка вариантов по сценарию
Следующая таблица не является универсальным рейтингом производительности. Это рабочая оценка архитектурных свойств; баллы показывают удобство конкретного сценария, а не измеренную скорость сборки.
| Сценарий | Фиксированный Runner | Временный Runner | Гибрид |
|---|---|---|---|
| Стабильный один репозиторий | 5/5 | 2/5 | 4/5 |
| Редкий предсказуемый релизный пик | 2/5 | 4/5 | 5/5 |
| Несколько репозиториев с разным доверием | 2/5 | 5/5 | 5/5 |
| Сложная постоянная подпись | 5/5 | 2/5 | 4/5 |
| Нужна строгая очистка после каждого задания | 2/5 | 5/5 при полной утилизации | 5/5 |
| Неустойчивая система поставки Mac | 4/5 | 1/5 | 4/5 |
Баллы здесь не следует превращать в обещание результата: они помогают выбрать направление для теста. Например, временный узел получает высокую оценку за изоляцию только при доказанной очистке. Если инфраструктура просто снимает регистрацию Runner, этот балл нужно снизить.
Пять шагов до переключения маршрутизации
-
Снимите исходные данные.
Сгруппируйте workflow по типу: тест, обычная сборка, публикация и служебные задания. Для каждого типа сохраните время ожидания, длительность задания, ошибки и используемый Runner. -
Разделите базовую и пиковую нагрузку.
Не используйте число разработчиков как замену измерениям. Укажите, какие задания должны выполняться даже при недоступности эластичного контроллера, и оставьте для них фиксированный базовый узел. -
Опишите доверительные границы.
Создайте Runner Group для публикации отдельно от тестов, назначьте понятные метки и ограничьте репозитории. При необходимости закрепите версии Xcode на разных классах узлов. -
Проведите один изолированный прогон.
Запустите фиктивный репозиторий с безопасной задачей: регистрация, сборка без настоящего сертификата, завершение, удаление временных файлов и проверка внешнего журнала. Не помещайте в пример реальные токены, ключи, адреса или сертификаты. -
Устройте отказоустойчивый тест.
Остановите поставку Mac, оборвите регистрацию Runner и смоделируйте ошибку обновления. Зафиксируйте максимальное время ожидания, момент остановки дальнейшего масштабирования и ручной путь публикации. Инструкции GitHub по мониторингу и устранению неполадок Runner пригодятся для сопоставления локальных и платформенных событий. -
Только после этого включите рабочую маршрутизацию.
Сначала направьте на новый пул обычные тесты, затем ограниченную публикацию, и лишь потом расширяйте область репозиториев. Для управления доступом и добавления узлов используйте официальные инструкции GitHub по добавлению self-hosted Runner.
План деградации при отказе расширения
Эластичная схема должна иметь состояние, в которое она возвращается при сбое. В противном случае команда получает красивый механизм масштабирования без гарантии публикации.
Заранее задайте следующие правила:
- если сигнал очереди не обрабатывается, новые временные узлы не создаются бесконечно;
- если Mac не появился в отведённое внутреннее окно, задание переносится на фиксированный резерв или останавливается с понятной причиной;
- если Runner зарегистрирован, но не принимает работу, он не считается готовым;
- если внешний журнал недоступен, задания с секретами блокируются;
- если очистка не подтверждена, хост не возвращается в общий пул;
- если контроллер недоступен, критическая публикация выполняется на ограниченном фиксированном узле.
Критический показатель здесь — не максимальное число Runner, а способность объяснить любой пропущенный релиз: очередь возникла из-за нехватки Mac, задержки поставки, ошибки регистрации, сбоя Xcode или отсутствия сертификата. Без такой классификации команда будет добавлять узлы, хотя проблема может находиться в маршрутизации или окружении.
FAQ
Автоматическое расширение self-hosted Mac Runner
Автоматизация возможна, но не одной настройкой GitHub Actions. Runner Scale Set Client соединяет API и временную конфигурацию, тогда как создание, запуск, очистка и удаление Mac остаются задачами собственной инфраструктуры. Для macOS особенно важно измерять задержку поставки: сигнал очереди сам по себе не означает, что готовый хост уже доступен.
Постоянный Runner и ephemeral runner для Xcode CI
Постоянный Runner лучше подходит для стабильного проекта с дорогой подготовкой инструментов, длительным кэшем и контролируемым числом репозиториев. Ephemeral runner полезнее для релизных всплесков и строгого разделения заданий. Если временный хост не проходит полный цикл очистки, преимущество изоляции остаётся недоказанным.
Поддержка macOS в Runner Scale Set Client
Официальная информация позволяет строить пользовательскую схему с macOS, но состояние Public Preview нужно учитывать при проектировании. Клиент не заменяет поставщик Mac, систему секретов, журналирование или процедуру возврата хоста. Не следует переносить Kubernetes-модель ARC на удалённые реальные Mac без отдельной проверки каждого звена.
Защита от загрязнения между репозиториями
Начните с Runner Group и меток, но не ограничивайтесь ими. Для разных уровней доверия и версий Xcode используйте отдельные пулы, ограничьте область доступа, удаляйте рабочие каталоги и временные секреты, а результаты очистки сохраняйте во внешнем журнале. Снятие регистрации Runner не очищает диск автоматически.
Пиковая публикация и временная аренда Mac
Сначала сравните длительность пика с полным циклом поставки временного узла. Если тест показывает, что Mac готовится вовремя и корректно возвращается в чистое состояние, временная аренда позволяет не держать весь парк круглый год. Если публикация не может ждать, фиксированный базовый узел должен оставаться резервом.
Что выбрать перед внедрением
Фиксированный Mac Runner остаётся самым предсказуемым выбором для стабильного репозитория, сложного кэша и постоянно поддерживаемого подписания. Ephemeral runner оправдан, когда важнее изоляция и способность пережить краткий пик, чем сохранение локального состояния. Но для большинства команд не требуется выбирать только один вариант: базовые задачи могут идти на постоянном узле, а публикационные и массовые тестовые очереди — на временном пуле.
Если текущая схема — это постоянно включённые Mac с периодами простоя, она теряет деньги на неиспользуемой мощности и усложняет обновление нескольких версий Xcode. Если это Linux- или Windows-сервер с попыткой заменить macOS-окружение виртуализацией, добавляются ограничения совместимости, доступ к инструментам Apple и вопросы стабильности подписи. Если же весь парк строится только на временных узлах, команда рискует зависеть от времени поставки и незрелого процесса очистки.
В такой ситуации аренда Mac через JexMac может быть разумнее покупки дополнительных устройств для коротких релизных окон: сохраняется доступ к реальному macOS-хосту без круглогодичного содержания каждого пикового узла. Перед экспериментом изучите условия заказа JexMac, выберите период, соответствующий тестовому прогону, и проверьте не обещанную скорость, а собственную цепочку «очередь — поставка — регистрация — сборка — подпись — возврат».
Начните с матрицы сценариев: выделите базовую дневную нагрузку, релизный пик, задачи с ключами и допустимый путь деградации. Если все четыре границы описаны и подтверждены рабочим прогоном, гибридная схема обычно даёт более управляемый баланс между простотой фиксированных узлов и затратами на эластичное расширение.
FAQ
Может ли self-hosted Mac Runner в GitHub Actions масштабироваться автоматически?
Да, автоматизация возможна, но не в смысле полного управления физической машиной одной настройкой GitHub Actions. Runner Scale Set Client передаёт сигналы очереди и работает с временной конфигурацией, а поставку, запуск, очистку и возврат Mac команда должна организовать в собственной инфраструктуре. Поэтому автоматизируются несколько звеньев цепочки, а не весь жизненный цикл узла.
Что лучше выбрать для Xcode CI: постоянный Mac Runner или ephemeral runner?
Для стабильной нагрузки одного репозитория обычно удобнее постоянный Runner: на нём проще сохранять инструменты, кэш и состояние окружения. Ephemeral runner предпочтительнее при пиковых релизах, совместном использовании несколькими репозиториями и строгой изоляции. На практике безопаснее оставить фиксированную базовую мощность, а временные узлы использовать для предсказуемых всплесков.
Поддерживает ли Runner Scale Set Client узлы на macOS?
Официальные материалы подтверждают возможность строить пользовательские эластичные схемы, включая macOS, однако репозиторий Runner Scale Set Client по состоянию на 5 сентября 2026 года помечен как Public Preview. Клиент взаимодействует с API и временной конфигурацией; он не создаёт и не очищает Mac-хосты вместо вашей инфраструктуры.
Как не допустить загрязнения между репозиториями после масштабирования Mac Runner?
Разделяйте Runner Group и метки по уровню доверия, версии Xcode и типу задачи, ограничивайте область доступа и храните внешние логи. Регистрация ephemeral runner не доказывает, что на хосте удалены рабочая директория, кэш, брелок и временные ключи. После задания требуется отдельная проверка очистки или полная утилизация узла.
Что выбрать для пика публикаций Xcode: постоянные узлы или временную аренду Mac?
Если пик короткий и повторяется по календарю, сначала проверьте, успевает ли временный узел пройти поставку, регистрацию, сборку и очистку до окончания приемлемого окна ожидания. Если это не подтверждено рабочим прогоном, оставьте фиксированный узел для критического релиза. Временная аренда Mac подходит для расширения базовой мощности без круглогодичного содержания всех узлов.
Выберите подходящую Mac-инфраструктуру с JexMac
Арендуйте удалённый Mac для стабильных сборок, тестирования и публикации приложений.