2026 Flutter и React Native CI: какие этапы на macOS в облаке, а какие на Linux — гибридная матрица и параметры
Команды, которые ведут себя с iOS как с обычной Linux CI, часто сжигают минуты macOS не на тех задачах или маскируют реальные сбои шумными перезапусками. Здесь — три типичные проблемы, матрица этапов Linux/macOS для Flutter и React Native, семь шагов внедрения тегов и артефактов, жёсткие пороги для архитектурных ревью и FAQ со ссылками на VPSMAC о лимитах Linux для iOS и нескольких версиях Xcode. После прочтения проще масштабировать только iOS-слой пула.
В этой статье
1. Три болевые точки, когда iOS планируется как Linux
Monorepos используют Dart, TypeScript и линтеры на разных платформах, что побуждает разработчиков платформ повторно использовать одну большую матрицу. Xcode 26 и SwiftPM по-прежнему предполагают macOS для всего, что касается реальной цепочки подписи, поэтому неправильное размещение проявляется в виде нестабильных кэшей или загадочных сетевых ошибок вместо явного отсутствия сигнала цепочки инструментов. Эта привычка понятна, поскольку дорожки Android выглядят идентично бэкэнд-заданиям, однако дорожки iOS ближе к конвейерам прошивки, которые требуют определенного ядра и предположений о защищенных элементах.
Как только вы усвоите эту разницу, обсуждение затрат станет проще, потому что вы можете продемонстрировать линейное масштабирование Android с дешевыми виртуальными процессорами, в то время как масштабирование iOS отслеживает дефицит хранилища, подключенного к T2, и цепочки инструментов, подписанные Apple.
- Несоответствие стадий расширяет возможности сортировки. Запуск сценариев, похожих на macOS, в Ubuntu приводит к созданию длинных нерелевантных журналов. Дежурство колеблется между теориями сертификатов и пробелами в образах, в то время как платные мощности macOS простаивают или позже тратятся на дублирующую упаковку.
- Артефактам не хватает контрактов. Если в двоичных файлах движка, выходных данных Hermes или папках codegen отсутствует минимальная версия Xcode и фрагменты метаданных, архивы поздно выходят из строя. Затем откаты делают недействительными проверки «зелености» Linux и создают ложную уверенность в готовности выпуска.
- Очереди и диски взрываются только на Mac: общий тег
mobileпозволяет тяжелым архивам Android захватывать дефицитные слоты macOS. БезDERIVED_DATA_PATHдля каждой ветки параллельные ветки могут сжимать свободное пространство APFS до однозначных цифр, что владельцы Linux ошибочно воспринимают как нестабильный инструментарий Apple, а не как ошибку планирования.
Приведенная ниже матрица отделяет работу, которая должна оставаться в Linux, от работы, которая должна выполняться в облачных средах SSH Mac, чтобы финансы могли точно финансировать часть iOS.
2. Матрица этапов для Flutter и React Native
Используйте эту таблицу в качестве базового уровня на 2026 год; Если вы экспериментируете с контейнерами, которые претендуют на замену macOS для iOS, сначала прочитайте статью об ограничениях Linux, чтобы избежать незаконных ярлыков.
| Этап | Примеры флаттера | Примеры React Native | ОС | Примечания |
|---|---|---|---|---|
| Статический анализ и тесты виртуальных машин | dart analyze, только для виртуальной машины flutter test | ESLint, Jest без родных мостов | Линукс | Высокое разветвление, дешевые ядра |
| Поды и парсинг Xcodeproj | Регистрация плагина до flutter build ios | bundle exec pod install | macOS | Требуется разрешение Xcode |
| Архив, загрузка IPA, ASC | flutter build ipa, xcodebuild archive | xcodebuild плюс полоса обгона | macOS | Настоящая цепочка подписания |
| Работа интерфейса симулятора | Интеграционные тесты на Симуляторе | Детокс iOS, XCUITest | macOS | Безголовому все еще нужен стек симулятора |
| Упаковка Android | flutter build appbundle | Грейдл-конвейер | Linux или контейнеры | Изолируйте теги от iOS |
linux-mobile and mac-ios-only instead of one overloaded mobile tag.
3. Семь шагов развертывания
Предположим, что самостоятельные или арендованные облачные средства Mac уже доступны через SSH. Если вам не хватает базовой линии золотого изображения, захватите тройку заголовков из руководства по мульти-Xcode, прежде чем настраивать параллелизм.
- Закрепить наборы инструментов: документируйте ожидаемые версии Xcode и Flutter; печатайте
xcodebuild -versionиflutter --versionв начале каждого задания macOS. - Защита заданий Linux: замкните
pod installс помощью флагов среды, чтобы Ubuntu никогда не притворялась подписывающим хостом. - Сведите к минимуму вводимые данные для Mac: загружайте только файлы блокировки и промежуточные пакеты из Linux вместо повторной загрузки всего архива рабочей области.
- Изолировать производные данные: пример
DERIVED_DATA_PATH=$CI_WORKSPACE/dd/ios/$CI_COMMIT_SHORT_SHA; очистить, используя те же пороговые значения диска, что и в статье об очереди сборки. - Сериализация упаковщика и компилятора. Если Hermes и Xcode используют общий узел, разделите каталоги кэша, чтобы избежать всплесков конфликтов APFS.
- Два уровня CI: запросы на слияние выполняют облегченный
build-for-testing; Ветки релизов запускают полные архивы по ночам. - Сигналы Runbook: после каждого изменения YAML отслеживайте очередь macOS p95, настенные часы и процент свободного места; откатывайте YAML перед горячим исправлением узлов.
4. Пороговые значения для отзывов 2026 года.
Во-первых, зарезервируйте примерно от девяноста до ста двадцати гигабайт свободного пространства для типичного среднего монорепозитория, включая DerivedData и промежуточный этап dSYM; быстро выходит из строя ниже двенадцати процентов, которые можно использовать для остановки новых архивов до появления ошибок метаданных APFS. Во-вторых, когда количество слотов macOS остается ниже четверти постоянной глубины очереди, ожидание p95 обычно превышает в три раза среднее время стены модульного теста, а это означает, что вам следует добавить емкость Mac, прежде чем сокращать Linux lint. В-третьих, без устаревшего биткода ожидайте от восемнадцати до тридцати пяти минут на архив в зависимости от макросов Pods и Swift. В-четвертых, сборки RN с поддержкой Hermes часто показывают среднее значение ЦП примерно на одну целую, четыре или одну целую, в восемь раз больше, чем на чистом этапе JVM Linux, поэтому ограничивайте параллелизм mac-ios-only отдельно. В-пятых, сохраняйте объем одного конвейерного пакета артефактов iOS в пределах от двух до шести гигабайт, отделяя символы от IPA, чтобы избежать расходования минут загрузки на бюджет macOS.
Еще два удобных для обзора числа помогают финансировать разговоры. Коэффициент попадания в кэш для зависимых загрузок в macOS должен оставаться примерно на уровне семидесяти процентов еженедельно; внезапное падение обычно означает, что кто-то направил задание iOS на новый эфемерный том без восстановления кешей CocoaPods или Pub, что добавляет от восьми до пятнадцати минут времени на выполнение каждого задания. Также отслеживайте разницу в тактовой частоте бегуна между этапами Linux и Mac; Расхождение между временными метками подписи артефакта и API-интерфейсами загрузки ASC более чем на две секунды может вызвать спорадические сбои аутентификации, которые выглядят как случайные сбои в работе Apple, пока NTP не будет исправлен.
Наконец, укажите, кому принадлежит откат, когда неправильное изменение YAML увеличивает глубину очереди macOS: при проектировании платформы следует сначала отменить определения конвейера, поскольку исправления узлов без отката YAML воссоздают скрытые снежинки во всем парке.
5. Часто задаваемые вопросы
Может ли pod install работать в Linux, чтобы сэкономить минуты?
Только если никакие перехватчики Podspec не требуют анализа Xcode; большинство производственных приложений RN по-прежнему должны выполнять CocoaPods в macOS, иначе сбои будут группироваться во время архивирования.
Имеет ли здесь значение цель Flutter для настольного Linux?
Нет; Цели рабочего стола заслуживают собственного пула бегунов и не должны воровать теги iOS.
Как это связано со статьей о мульти-Xcode?
Это руководство обеспечивает сосуществование xcode-select и SDK; в этом руководстве описаны разделения этапов между ОС и гигиена тегов. Обновите оба модуля Runbook вместе.
6. Выбор подложки Mac под гибридную топологию
Ноутбуки и отдельные удаленные настольные компьютеры могут выпускать выпуск, но они нарушают три производственных свойства: непредсказуемое время безотказной работы в ночное время, базовые показатели Xcode, которые никогда не соответствуют общему SLO, а также настройки корпоративного прокси или сертификата, которые невозможно клонировать в CI. Linux остается плотным универсальным вычислительным слоем, в то время как сменные узлы macOS образуют часть, специфичную для Apple. Попытка подделать выходные данные iOS без встроенной macOS тратит минуты на бесполезные журналы вместо компиляции кода. Для команд, которым нужны предсказуемые очереди, эластичный доступ по SSH и политики дисков, написанные помимо SLO для Linux, аренда облачных хостов VPSMAC M4 Mac обычно более стабильна, чем сжатие смешанных персональных компьютеров: изображения, правила DerivedData и перехватчики наблюдения соответствуют статьям VPSMAC о миграции SSH, пулах с несколькими Xcode и телеметрии Mac CI.