Инженеры платформы iOS/macOS и сопровождающие CI, распределяющие пулы сборок по Сингапуру, Японии, Корее, Гонконгу, восточному и западному побережью США, часто упираются в узкие места раньше Xcode: pod install, pod repo update и swift package resolve взрываются, когда неверные источники, таймауты по умолчанию и общие границы кэша складываются в инциденты на всю очередь. Материал делит работу с гайдом по воспроизводимым чистым сборкам и матрицей близости Git и артефактов: шесть классов боли зависимостей для RCA, две матрицы для официальных, зеркальных и частных путей реестра, таблица egress и повторов по регионам, блоки команд для копирования, шестишаговый runbook и три метрики для дашборда, плюс пороги диска для решений о расширении 1 ТБ/2 ТБ на той же странице ревью.
Пуловые удалённые Mac ротируются, делят каталоги кэша между параллельными job’ами и меняют политику egress по регионам. Подписывать каждый таймаут как «нестабильная сеть» — сжигать часы аренды всплеска. Фиксируйте ниже сигналы в тикетах изменений и проверяйте их рядом с тегами runner’ов и вехами контракта.
Podfile.lock или Package.resolved фиксируют результат резолва, но CI может бить в другие конечные точки spec, URL Git или хосты реестра, чем ноутбук разработчика — «одна метка, разные job’ы».curl-подобные таймауты скапливаются на пике; CPU простаивают, очередь растёт.CI=true, договорённостей по keychain или шаблонов netrc падают на частных pod’ах или SPM-репозиториях, которые в GUI-сессии проходят.git или HTTP нуждаются в лимитах с учётом RTT; ночные job’ы не должны наследовать интерактивные значения по умолчанию.Накладывайте это на статью о воспроизводимости: там фиксируются представления компилятора и derived data; здесь — пути резолвера и границы кэша. Близость артефактов решает, что тянуть; этот playbook — откуда, как откатываются повторы и куда ложатся кэши.
Универсальной «лучшей» стратегии источников нет — есть стратегии, согласованные с комплаенсом, аудитом и откатом. Вставьте таблицу в закупочные или дизайн-ревью.
| Стратегия | Сигналы | Польза | Риски / заметки по контракту |
|---|---|---|---|
| Официальный trunk / стандартный резолв SPM | В основном открытые зависимости; политика разрешает прямой интернет | Меньше движущихся частей; совпадает с умолчанием сообщества | Региональный джиттер без backoff; кодифицируйте таймауты в пайплайнах, не в «трайбл-ноу» |
| Корпоративное зеркало или частный spec/реестр | Аудиторские следы, зафиксированные снимки или регулируемый egress | Воспроизводимые pull’ы; можно отключить публичные пути | Устаревшие метаданные дают «локально ок, в CI падает»; задайте SLA обновления зеркала |
| Гибрид официального и зеркала из allow-list | Мультирегиональные пулы с неравномерным качеством CDN | Дешевле полной приватизации — переключать шаблоны по регионам | Дрейф шаблонов; привяжите «регион → карту источников» к меткам runner’ов |
| Полный вендорский или офлайн-бандл | Air-gapped или разовые поставки | Максимальная детерминированность | Высокая цена обновлений; плохо для быстрых security-патчей |
Держите диапазоны явными: подставляйте свои перцентили mtr или пайплайна вместо плейсхолдеров — не копируйте дефолты слепо в прод. Сверяйте с мультирегиональным гайдом и условиями аренды, чтобы задержка и счета делили одну веху.
| Сценарий | Типичные симптомы | Первое действие | Связь с диском / SKU |
|---|---|---|---|
| Сборщики в регионе A, привычка Git/реестра в регионе B | Длиннохвостый git fetch, прерывистый SPM resolve | Приблизить горячий путь зависимостей к сборщикам или добавить edge-кэш; настроить GIT_HTTP_LOW_SPEED_LIMIT и ограничить параллелизм | Сначала сеть, не CPU; диски здоровы до upsell M4 Pro |
| Джиттер CDN CocoaPods | Сгруппированные curl-таймауты по job’ам | Переключение на зеркало или частный кэш; повторы в пайплайне с backoff | Параллельные загрузки всплеском нагружают запись — следить за хостами 1 ТБ |
| Частные pod’ы или SPM с авторизацией | 401/403 или зависания только в CI | Стандартизировать netrc, SSH-агент или OIDC-токены; не полагаться на интерактивный GUI | Сочетать с выделенными CI-пользователями по гайду SSH против VNC |
| Повреждённые кэши или старые блокировки | Облегчение после ручной очистки, возврат при высоком параллелизме | Префикс кэша на job или изолированные учётки; автоматические ворота очистки | 2 ТБ или выделенные кэш-ноды только после сужения ширины матрицы |
# CocoaPods: неинтерактивные флаги и CDN-источник (URL заменить по политике) export COCOAPODS_DISABLE_STATS=true export CI=true pod install --verbose --no-repo-update # Обновления repo — в отдельном job, не в каждом шарде матрицы # pod repo update trunk # SPM: трассировка resolve и занятость кэша (проверить пути Xcode/SwiftPM) swift package resolve -v 2>&1 | tail -n 50 du -sh ~/Library/Caches/org.swift.swiftpm 2>/dev/null du -sh ~/Library/Developer/Xcode/DerivedData 2>/dev/null # Длинные хвосты Git: пример дросселирования (подстроить под RTT; с гайдом по артефактам) export GIT_HTTP_LOW_SPEED_LIMIT=1000 export GIT_HTTP_LOW_SPEED_TIME=60
Предупреждение: зеркала снижают задержку, но могут ввести сдвиг метаданных. Проверяйте и Podfile.lock / Package.resolved, и метки времени снимка зеркала — не ошибочно называйте отстающие зеркала регрессиями приложения.
Считайте, что runner’ы и секреты следуют чеклисту self-hosted runner’ов; если секреты не изолированы, сначала исправьте это.
pod install и resolve, таксономию сбоев (TLS, 401, 5xx, таймаут) и недельный рост диска — без данных не добавлять регионы.Эти метрики превращают «медленные сборки» в управляемые корзины и должны поднимать алерты вместе с мониторами диска.
Храните также булево «регион сборщика не совпадает с основным Git-регионом»: длительное false должно запускать FinOps-ревью размещения аренды, а не героические перезапуски.
Опорная рамка (не бенчмарк): холодный резолв плюс широкие матрицы могут добавлять десятки ГБ кэша в неделю — у SKU 1 ТБ до принятия неограниченного параллелизма нужна явная политика повторного использования.
Личные скрипты плохо переносят аудит и ломаются при смене регионов. В пулах без присмотра «зависимости установлены» и «каждый раз один и тот же граф зависимостей» — разные SLA. Контрактный Apple Silicon CI требует выделенного bare metal, мультирегионального размещения и комбинируемых условий аренды вместе с шаблонами источников, телеметрией диска и счетами на одном листе.
Краткосрочная аренда без изоляции кэша или карт источников разносит хвосты резолвера по основному пулу. Командам, которым нужны стабильный egress, аудируемая политика кэша и масштаб под всплески, чаще выгоднее профессиональный Mac cloud, чем импровизированное железо. MACCOME предлагает узлы bare metal Mac mini M4 / M4 Pro в Сингапуре, Японии, Корее, Гонконге, на восточном и западном побережье США с гибкими сроками — как базовый и burst-слой в линии с привычками Git и реестра, затем окончательно согласуйте тарифы и региональные страницы.
Совет пилота: краткосрочно арендуйте там, где уже лежат репозитории, прогоните блок здоровья и двухнедельную базу, затем решайте по месяцам или 2 ТБ — избегайте обмена на «дёшевый регион», который покупает непредсказуемые графы резолвера.
FAQ
Чем это отличается от статьи о воспроизводимых чистых сборках?
Та статья фиксирует представления Xcode/CLT/DerivedData/keychain; эта — источники CocoaPods/SPM, зеркала и границы кэша. По бюджету откройте вместе тарифы аренды Mac mini и мультирегиональный гайд.
Сначала зеркало или диск?
Если сбои скапливаются в таймауты или 5xx, настройте источники и повторы. Если после гигиены заполнение держится выше ~85%, планируйте 1 ТБ→2 ТБ или выделенные кэш-хосты. Подробности — в центре помощи.
Как это сочетается с близостью артефактов?
Близость артефактов выбирает регионы реестра и Git; этот playbook — пути загрузки pod/SPM и кэши. Отдавайте оба в одном пакете изменений.