Выбирайте временный Runner для публичных репозиториев, непроверенного кода и задач, между которыми нужна строгая изоляция; постоянный Runner оставляйте для стабильной подписи, внешних устройств и дорогого кэша. Для большинства производственных команд на Mac Mini M6 разумнее строить двухконтурную схему: пул временных узлов для обычной проверки и небольшой ограниченный пул постоянных узлов для публикации.
Эта статья предназначена платформенным командам, которым нужен чистый macOS-узел для pull request и обычных тестов. Она также пригодится мобильным разработчикам, обслуживающим подпись, реальные устройства или фиксированные сетевые зависимости, и техническим руководителям, рассчитывающим количество Mac Mini M6 и правила расширения пула.
Сначала определите, какой риск вы пытаетесь устранить
Вопрос «временный или постоянный» нельзя решать только по стоимости простоя либо скорости повторной сборки. У двух вариантов разные границы доверия.
Временный Runner подходит, когда:
- задание может выполнять код из внешнего pull request;
- репозиторий публичный либо в команде есть сторонние участники;
- после каждой сборки необходимо исключить перенос файлов, процессов и токенов;
- узел можно проверить, сбросить или заменить до следующего задания;
- обычные тесты не требуют постоянного доступа к сертификатам и внешним устройствам.
Постоянный Runner оправдан, когда:
- инструменты и SDK занимают заметное время на подготовку;
- сборкам нужен устойчивый кэш;
- узел подключён к реальному устройству, специальному интерфейсу или фиксированной сети;
- публикация ограничена конкретными репозиториями, ветками и workflow;
- команда готова регулярно проводить очистку, обновление и проверку состояния.
GitHub прямо рассматривает временные self-hosted Runner как предпочтительный вариант для сценариев автоматического масштабирования. В официальной документации также описаны требования к регистрации, маршрутизации и жизненному циклу узлов — см. документацию GitHub по self-hosted Runner. Но здесь есть важная граница: временный объект в GitHub не превращает физический Mac в одноразовую машину.
Временный Runner может автоматически отключиться от пула, а на Mac при этом останутся рабочие файлы, процессы, кэш, записи в связке ключей и сетевые сессии. Регистрация завершена — это не равно «операционная система восстановлена в чистое состояние».
Сравните модели до закупки узлов
Следующая таблица пригодна как первичный фильтр. Она показывает не «лучший» вариант вообще, а цену конкретного компромисса.
| Критерий | Временный Runner | Постоянный Runner | Решение для команды |
|---|---|---|---|
| Код из внешнего pull request | Предпочтительный вариант | Допустим только при жёстких ограничениях | Для открытого проекта выбирайте временный пул |
| Кэш зависимостей и сборок | Нужно проектировать безопасный внешний кэш | Проще поддерживать локальный кэш | Приоритет скорости не должен отменять очистку |
| Подпись и публикация | Возможны только при проверяемом вводе и уничтожении секретов | Удобнее контролировать ограниченный узел | Разделяйте публикацию и обычные тесты |
| Сбой во время задания | Нужны сбор логов и замена либо сброс среды | Нужны расследование загрязнения и ручной карантин | Не возвращайте узел в пул автоматически |
| Масштабирование | Хорошо подходит для очереди обычных задач | Ограничено количеством подготовленных Mac | Расширяйте только после анализа очереди |
| Внешние устройства | Обычно неудобно переназначать | Стабильнее при фиксированном подключении | Выделяйте отдельный постоянный контур |
| Администрирование | Сложнее организовать физический сброс | Проще начать, дороже поддерживать доверие | Автоматизируйте health check и очистку |
Официальная схема подключения self-hosted Runner к workflow описана в руководстве GitHub по использованию Runner в workflow. Используйте её как основу маршрутизации, но не считайте сам label доказательством изоляции.
Что известно о Mac Mini M6, а что ещё предстоит измерить
Apple официально представила Mac mini с M6, однако, согласно заданной границе фактов на 7 сентября 2026 года, первые устройства ещё не начали поставляться. Поэтому фактическое время сброса, поведение кэша, стабильная параллельность тестов и восстановление после прерванной сборки для M6 требуют отдельной проверки. Нельзя подменять такие измерения характеристиками из пресс-релиза: официальное объявление Apple о Mac mini M6 подтверждает выпуск модели, но не даёт производственного SLA для CI.
Актуальные аппаратные параметры следует сверять со страницей технических характеристик Mac mini у Apple. Для решения о Runner важнее не максимальная скорость чипа, а то, сможет ли команда:
- одинаково подготовить узлы;
- удалить состояние после задания;
- ограничить секреты по типу workflow;
- принять решение по сбойному Mac;
- восстановить очередь без ручного доступа к каждому устройству.
Выберите модель по типу команды
Приватный репозиторий и небольшая очередь
Если у вас личный проект или доверенная команда с редкими параллельными сборками, постоянный Runner обычно проще в эксплуатации. Инструменты, зависимости и кэш остаются на узле, а время подготовки очередного задания ниже.
Это не означает, что приватный репозиторий автоматически безопасен. В него могут попасть вредоносная зависимость, скомпрометированный скрипт, ошибочная команда очистки или участник с избыточными правами. Каждый workflow должен завершаться удалением рабочей директории, временных файлов и выданных секретов. Процессы, фоновые агенты и сетевые подключения также необходимо проверять.
Для такой команды разумна схема: постоянный узел для обычных задач, отдельная политика для pull request и запрет на передачу ключей публикации в общий workflow. Если источник кода не проходит проверку доверия, он должен попадать во временный пул.
Открытый проект и внешние pull request
В публичном проекте код из pull request может выполняться в пределах полномочий Runner. Даже если сам workflow выглядит безобидно, скрипт сборки, зависимость или шаг подготовки может прочитать доступные переменные, файлы и сокеты.
Здесь используйте модель «одно задание — одна идентичность». После выполнения нужно:
- запретить приём новых заданий;
- сохранить логи и диагностические признаки во внешнем хранилище;
- удалить рабочие каталоги и временные секреты;
- проверить процессы, launch agents и сетевые соединения;
- отменить регистрацию Runner;
- подтвердить сброс системы или вывести Mac из эксплуатации до ручной проверки.
Подробные ограничения доверия и риски для workflow собраны в официальной документации GitHub по безопасному использованию Actions. Не показывайте в workflow регистрационные токены, имена внутренних репозиториев, сертификаты или идентификаторы организации.
Ключевая ошибка — называть такой узел временным только потому, что приложение Runner автоматически завершило регистрацию. Временный Runner — это понятие жизненного цикла задания, а не обещание, что физический Mac сам себя сотрёт и переустановит.
Небольшая мобильная команда с частыми сборками
Для команды, выпускающей iOS или macOS-продукт, постоянный кэш может заметно упростить ежедневную работу. Но выигрыш от кэша нужно сравнить с тремя скрытыми издержками:
- состояние одного проекта может влиять на другой;
- обновление SDK или инструмента создаёт дрейф среды;
- неудачное задание может оставить процесс, файл или настройку, которые проявятся намного позже.
Разделите маршруты. Обычная компиляция, линтеры и тесты должны идти во временный или регулярно сбрасываемый пул. Публикация, подпись и работа с физическим устройством — в отдельный контур с меньшим числом узлов.
Для расширения не ориентируйтесь на ощущение «Mac постоянно занят». Собирайте длину очереди, время ожидания, длительность заданий, число повторных запусков и долю сбоев восстановления. Регистрация и список узлов доступны через REST API GitHub для self-hosted Runner, поэтому эти данные можно включить в собственный контроль состояния.
Вторая матрица: кому какой пул назначить
| Тип работы | Рекомендуемый пул | Разрешённые секреты | Контроль перед возвратом |
|---|---|---|---|
| Линтеры и unit-тесты из pull request | Временный | Минимальные, без ключей публикации | Сброс либо подтвержденно чистый образ |
| Обычная сборка доверенной ветки | Временный или сбрасываемый постоянный | Только необходимые токены | Очистка рабочей области и процессов |
| UI-тесты на внешнем устройстве | Ограниченный постоянный | Доступ к конкретному устройству | Проверка состояния устройства и сессии |
| Подпись тестовой сборки | Отдельный постоянный | Только сертификаты этого проекта | Контроль связки ключей и журналов |
| Публикация релиза | Небольшой постоянный пул | Минимальный набор release-секретов | Ограничение ветки, workflow и ручное подтверждение |
| Непроверенный внешний код | Временный одноразовый | По возможности без секретов | Сбор логов, отмена регистрации и сброс |
Отдельно защитите подпись, ключи и публикацию
iOS-подпись плохо сочетается с безусловным размещением всех секретов на общем Runner. Сертификаты, provisioning profiles, записи в Keychain, токены публикации и доступ к хранилищу артефактов должны быть доступны не каждому заданию.
Есть два рабочих подхода.
Ограниченный постоянный узел. Разместите подпись на небольшом пуле Mac, доступном только выбранным репозиториям, веткам и workflow. Разделите labels, права и секреты. После каждой публикации проверяйте, что временные профили и файлы экспорта удалены.
Временный узел с управляемой инъекцией. Передавайте секреты только после прохождения условий workflow, ограничивайте время их существования и записывайте доказательства удаления. Такой вариант сложнее, потому что необходимо доказать не только выдачу, но и уничтожение данных после ошибки, отмены или принудительной остановки.
Если процесс уничтожения нельзя проверить по журналам и health check, не используйте временный Runner для подписи. Лучше сократить права постоянного узла, чем создавать видимость изоляции.
Для приложений на Apple Silicon также учитывайте совместимость инструментов и зависимостей: документация Apple по переносу macOS-приложений на Apple Silicon полезна при проверке старых бинарных компонентов и скриптов сборки.
Шаги внедрения двухконтурной архитектуры
Шаг первый: разделите задания по уровню доверия
Создайте отдельные классы для внешних pull request, обычной проверки доверенных веток, подписания и публикации. Не пытайтесь решить всё одним label: маршрутизация должна учитывать источник workflow и требуемые секреты.
Шаг второй: опишите состояние чистого Mac
Зафиксируйте, что именно означает «узел готов». В список обычно входят отсутствие чужой рабочей директории, завершённые процессы, удалённые временные ключи, закрытые сетевые сессии, корректное состояние инструментов и доступность нужной версии SDK.
Шаг третий: автоматизируйте жизненный цикл регистрации
Регистрация должна происходить перед заданием или короткой серией доверенных заданий, а отмена регистрации — после завершения. Срок действия регистрационных данных храните вне исходного кода. Не записывайте реальные токены в логи и не передавайте их в переменных, доступных внешнему коду.
Шаг четвёртый: вынесите логи до очистки узла
Сначала отправляйте логи сборки, сведения о сбое и результаты health check во внешнее хранилище, затем очищайте Mac. Иначе неудачная попытка сброса может уничтожить признаки компрометации вместе с диагностикой.
Шаг пятый: задайте правила карантина
Любой прерванный процесс, неожиданный файл, ошибка очистки или несоответствие версии инструмента должны переводить Mac в карантин. Не возвращайте его в пул только потому, что GitHub снова показывает Runner как доступный.
Шаг шестой: измеряйте очередь до добавления оборудования
Собирайте время ожидания, длительность задания, частоту повторных запусков, процент занятых узлов и долю задач, которым требуется подпись или устройство. Для Mac Mini M6 отдельно измерьте время подготовки, сброса и восстановления после отключения питания, когда реальные устройства станут доступны.
Шаг седьмой: проведите ограниченный пилот
Начните с одного класса обычных тестов без release-секретов. Сравните временный и постоянный режим на одинаковом workflow, затем проверьте отказ посреди задания. Только после этого решайте, нужен ли дополнительный Mac, больший кэш или отдельный постоянный узел.
Базовые сведения о группировке и маршрутизации Runner можно сверить в документации GitHub по self-hosted Runner. При этом Linux-подход с быстрым созданием контейнеров нельзя напрямую переносить на физические macOS-узлы: у Mac есть собственная загрузка, состояние диска, внешние устройства, сетевые зависимости и процедура возврата в пул.
Когда нужен масштабируемый пул
Платформенной команде с несколькими проектами придётся поддерживать не только регистрацию. В контур входят:
- выдача узлу правильного профиля и labels;
- маршрутизация заданий между группами;
- внешнее сохранение логов;
- контроль образа и версии инструментов;
- повторная регистрация после сброса;
- обнаружение зависшего процесса;
- физическое или удалённое выключение;
- замена узла после неуспешного восстановления.
Увеличивать количество Mac следует не по числу проектов, а по характеру очереди. Если задания короткие, но часто ждут запуска, узкое место может быть в количестве узлов. Если задания долго выполняются из-за тестов или подписи, добавление машин без разделения маршрутов только увеличит сложность. Если большинство сбоев связано с загрязнением среды, сначала исправьте очистку.
Для производственной схемы задайте два стандарта:
- для временного пула — время регистрации, критерии чистоты, срок хранения логов и условия замены;
- для постоянного пула — расписание обновлений, ручную проверку секретов, ограничение репозиториев и процедуру аварийного вывода.
В разделе блога kvmsync вы можете сопоставить эту архитектуру с другими материалами о Mac-инфраструктуре. Если узлы берутся на ограниченный период для пилота или релизного пика, заранее проверьте доступные варианты на странице аренды kvmsync, но не подменяйте арендой требования к очистке и правам.
Итоговый выбор для Mac Mini M6 Runner
Если у вас публичный код, внешние pull request или строгая граница между заданиями, начинайте с временного Runner и проверяемого сброса Mac. Если вам нужны стабильная подпись, фиксированное устройство, предсказуемый кэш или особая сеть, оставляйте постоянный узел, но ограничивайте его репозитории, ветки, workflow и секреты.
На практике наиболее устойчивой будет двухконтурная модель: обычные проверки выполняются на временном либо регулярно сбрасываемом пуле, а подпись и специальные зависимости — на небольшом постоянном пуле. Если автоматический сброс пока нельзя доказать, уменьшите права постоянных узлов и не называйте их временно изолированными.
Частые вопросы
Чем временный Runner отличается от постоянного в GitHub Actions?
Временный Runner рассчитан на один жизненный цикл задания: после выполнения он должен быть отключён и удалён из пула, а среда — проверена или заменена. Постоянный Runner принимает последующие задания на том же Mac. Это ускоряет использование кэша и сохраняет инструменты, но повышает риск загрязнения рабочей директории, утечки переменных и переноса состояния между задачами.
Подходит ли Mac Mini M6 для одноразового macOS Runner?
Да, но одноразовым должен быть не только объект Runner в GitHub, а весь контролируемый жизненный цикл среды. Mac Mini M6 необходимо подготовить, зарегистрировать с ограниченным сроком действия, принять задание, собрать внешние логи, удалить рабочие данные и подтвердить сброс либо заменить узел. Автоматическая отмена регистрации сама по себе не стирает Mac.
Стоит ли выполнять iOS-подпись на временном Runner?
Только если команда может доказать аудитируемое внедрение и уничтожение сертификатов, профилей, ключей и сессий. Для большинства команд безопаснее выделить небольшой постоянный пул с ограниченными репозиториями, ветками и workflow. Временный узел можно использовать для подписи после отдельной проверки, но нельзя передавать ему общие секреты обычных тестовых заданий.
Как не допустить загрязнения между заданиями на self-hosted Runner?
Минимальный контроль включает очистку рабочей директории, удаление временных файлов, отзыв или уничтожение выданных секретов, проверку процессов и сетевых сессий, а также повторную регистрацию только после успешного health check. Если автоматическая очистка не даёт проверяемого результата, не называйте узел временно изолированным: ограничьте его права или замените физическую среду.
Какие данные нужны для масштабирования Mac Runner?
Смотрите не только на среднее число заданий. Нужны длина очереди, время ожидания, длительность сборки, доля повторных запусков, занятость узлов, частота неуспешного восстановления, потребность в подписи и доля задач с фиксированным окружением. Для macOS также учитывайте время подготовки и сброса физического Mac, потому что контейнерная модель масштабирования Linux не переносится автоматически.
Если текущая инфраструктура перегружена только в периоды релизов, сначала выделите один обычный тестовый workflow во временный пул и измерьте его жизненный цикл. При росте очереди добавляйте краткосрочные Mac-узлы с тем же образом и теми же границами доступа; для стабильной подписи сохраняйте отдельный ограниченный контур, а не превращайте каждый Runner в хранилище release-секретов.
Частые вопросы
Чем временный Runner отличается от постоянного в GitHub Actions?
Временный Runner рассчитан на один жизненный цикл задания: после выполнения он должен быть отключён и удалён из пула, а среда — проверена или заменена. Постоянный Runner принимает последующие задания на том же Mac. Это ускоряет использование кэша и сохраняет инструменты, но повышает риск загрязнения рабочей директории, утечки переменных и переноса состояния между задачами.
Подходит ли Mac Mini M6 для одноразового macOS Runner?
Да, но одноразовым должен быть не только объект Runner в GitHub, а весь контролируемый жизненный цикл среды. Mac Mini M6 необходимо подготовить, зарегистрировать с ограниченным сроком действия, принять задание, собрать внешние логи, удалить рабочие данные и подтвердить сброс либо заменить узел. Автоматическая отмена регистрации сама по себе не стирает Mac.
Стоит ли выполнять iOS-подпись на временном Runner?
Только если команда может доказать аудитируемое внедрение и уничтожение сертификатов, профилей, ключей и сессий. Для большинства команд безопаснее выделить небольшой постоянный пул с ограниченными репозиториями, ветками и workflow. Временный узел можно использовать для подписи после отдельной проверки, но нельзя передавать ему общие секреты обычных тестовых заданий.
Как не допустить загрязнения между заданиями на self-hosted Runner?
Минимальный контроль включает очистку рабочей директории, удаление временных файлов, отзыв или уничтожение выданных секретов, проверку процессов и сетевых сессий, а также повторную регистрацию только после успешного health check. Если автоматическая очистка не даёт проверяемого результата, не называйте узел временно изолированным: ограничьте его права или замените физическую среду.
Какие данные нужны для масштабирования Mac Runner?
Смотрите не только на среднее число заданий. Нужны длина очереди, время ожидания, длительность сборки, доля повторных запусков, занятость узлов, частота неуспешного восстановления, потребность в подписи и доля задач с фиксированным окружением. Для macOS также учитывайте время подготовки и сброса физического Mac, потому что контейнерная модель масштабирования Linux не переносится автоматически.
Читать также
Удалённый узел kvmsync M4
Запустите GitHub Actions на удалённом Mac mini с kvmsync
Арендуйте выделенный Mac для временных Runner или постоянной CI/CD-инфраструктуры без покупки собственного оборудования.