You already run Jenkins on Linux, но сборки iOS/macOS застревают между покупкой оборудования, постановкой в очередь размещенных бегунов или присмотром за ноутбуками. Для команд, которые думаютVPS operations, это руководство открывает четвертый путь: оставить контроллер в Linux, подключитьвыделенные удаленные компьютеры Mac as SSH agents. Вы получаете семь обзорных мин, сравнительную таблицу сСамостоятельные бегуны GitHub Actions, a шестишаговая инструкция по адаптации(учетные данные, метки, параллелизм,xcodebuild, артефакты) и перекрестные ссылки на нашиrunner, SSH checklist, and Fastlane + CI articles.
Многие предприятия не испытывают недостатка в компьютерах Mac — им не хватаетпроверяемый, масштабируемый, удобный для откатаКонтракт: оставьте контроллер на знакомом Linux, переместите разветвление сборки macOS на выделенные облачные Mac. Семь пунктов ниже превращают фразу «мы верим в Дженкинса» в таблицу рисков, которую вы можете подписать.
Относитесь к удаленному Mac как к «Linux, на котором работает xcodebuild»: ignoring TCC, Keychain и случайные зависимости графического пользовательского интерфейса приводят к взрыву подписи и подготовки при первом запуске.
Повторное использование личной учетной записи macOS для CI:политики сна, запросы на обновление и сеансы рабочего стола нарушают настоящие автоматические потоки — создайте выделенного пользователя CI и согласуйте его сreproducible builds.
Определение размера параллелизма только по ядрам ЦП:Скачки памяти Xcode и усиление записи NVMe обычно срабатывают раньше, чем процессор; без сегментовDerivedData, две работы могут зайти в тупик друг друга.
Игнорирование различий в путях SSH от контроллера к агенту:бастионы, ротация ключей иStrictHostKeyCheckingполитики должны находиться в IaC, иначе в день ротации вы получите полностью красные очереди.
Разрастание плагинов заменяет дизайн:тяжелый Groovy плюс специальная оболочка на агентах удлиняют MTTR — определите минимальный набор плагинов и явные версии набора инструментов.
Оставляем артефакты только на агенте:без архивирования в хранилище объектов или репозитория артефактов страдают как диск, так и соответствие нормативным требованиям — хранение привязывается к политике конвейера.
Никакого плана «первого человеческого окна»:при первоначальной установке материалов для подписи может потребоваться однократное подтверждение VNC или рабочего стола перед возвратом в автономный режим — см.Контрольный список SSH и VNC.
Общая основная причина заключается в том, что «удаленный Mac» рассматривается как необработанные вычисления, а не какХост цепочки инструментов Apple с сохранением состояния. Команды платформы должны поддерживать отпечатки изображений, версии цепочки инструментов, границы связки ключей и водяные знаки очистки так же, как и реплики базы данных. Сопряжение спулы корпоративных сборок: когда несколько приложений используют один хост, метки Jenkins должны быть тоньше, чем «любой Mac», иначе семантика очереди не сможет выразить изоляцию.
В отличие от GitHub Actions, настоящая разница заключается не в том, «может ли он скомпилироваться», а в том, «может ли он скомпилироваться».источники событий и границы учетных данных: Дженкинс блестяще справляется с оркестровкой между репозиториями и задачами в стиле cron; Actions отлично подходит для рабочих процессов, ориентированных на PR. Если вы уже стандартизировали Job DSL и одобрения, добавление macOS через SSH зачастую менее разрушительно, чем запуск второй религии CI, но если вы руководствуетесь сквозными связями с общественностью, самостоятельным менеджерам может потребоваться меньше клея. Прочтитеrunner guideкэшируйте разделы перед регистрацией узлов; большинство контрактов каталогов переводятся напрямую.
Следующая таблица фиксирует сравнение, поэтому вы можете выбрать плоскость управления, не пересматривая логотипы каждый квартал.
Серебряной пули не существует — вы выбираетементальная модель оркестровки and a credential boundary, а не логотип. Впишите в обзор три соглашения об уровне обслуживания: задержка в очереди, объяснимые сбои и стоимость ротации ключей.
| Dimension | Дженкинс + агент SSH (macOS) | Самостоятельный раннер GitHub Actions |
|---|---|---|
| Event model | Общие вебхуки, cron, параметризованные сборки; подключаемый к хостам Git | Тесно связан с событиями GitHub (PR, push, релиз); более высокая стоимость миграции в другое место |
| Credentials | Контроллер централизованно хранит ключи и роли SSH — укрепите плоскость контроллера. | Токены исполнителя и области организации/репозитория относительно стандартизированы. |
| Параллелизм и очереди | Метки + емкость узла + плагины регулирования — гибко, но сложно настраивать | Матрицы и параллелизм живут в YAML с более плавной кривой обучения. |
| Observability | Агрегация журналов сборки является зрелой; метрики/оповещения создаются своими руками | Пользовательский интерфейс и API платформы унифицированы; глубокая настройка часто требует третьих сторон |
| Best fit | Линии нескольких продуктов, локальные хранилища артефактов, смешанные хосты Git, тяжелые утверждения | GitHub-ориентированные инженерные организации с доставкой на основе PR |
Аренда Mac «как VPS» в терминах Jenkins означает покупкурегистрируемый профиль узла: фиксированный SSH, предсказуемые уровни дисков и возможность отмечать версии цепочки инструментов в метаданных узла.
Если Дженкинс выиграет ваш обзор, побалуйте себяnode propertiesв качестве первого класса: путь Xcode, версия Swift, Ruby/Bundler, если задействованы CocoaPods, а также разрешены ли задания графического интерфейса — все это должно быть подтверждено в выходных данных задания работоспособности. Сопряжение сснимки против долгоживущих узлов: долгоживущие агенты полагаются на поэтапную очистку; Базовые значения моментальных снимков основаны на повторно нагретых изображениях и дымовых тестах с откатом.
Если вам необходимо эксплуатировать и бегунки, и Дженкинсы в одном автопарке, унифицируйтеГруппа производных данныхконтракты: отдельные пользователи Unix или отдельные корни вместо «надеюсь, что смещенные графики позволят избежать коллизий».
Порядок имеет значение: на первом месте идентичность и каталоги, на втором — зонды инструментальной цепочки, на последнем — параллелизм. Согласовать сreproducible buildsтаким образом, Дженкинс не только доказывает, что «SSH работает», хотя подпись остается нестабильной.
Создайте выделенного пользователя и рабочий root: e.g. /Users/ci/jenkins; forbid sharing ~/Desktopс людьми; контроллер использует только аутентификацию на основе ключей.
Создайте узел Дженкинса: launch via SSH, установите хост, учетные данные, удаленный корень и путь JVM для стороны macOS.
Label for intent: at least ios, xcode-16, heavy-pod— отделять установки с тяжелыми зависимостями от заданий только для компиляции.
Сначала запустите задание работоспособности: print xcode-select -p, swift --versionснимки диска и памяти; сохраните журнал в качестве доказательства приемки.
Передайте DerivedData явным образом в конвейеры: match Управление SwiftPM/Pods— бакет на репо, избегать дефолта~/Library/Developer/Xcode/DerivedData sharing.
Определите таймауты, архивирование и очистку:загрузка журналов, сохранение в случае сбоя и правила планирования остановки, когда диск пересекает водяной знак.
pipeline {
agent { label 'ios && xcode-16' }
options { timestamps(); timeout(time: 45, unit: 'MINUTES') }
environment { DERIVED_DATA = "${WORKSPACE}/DerivedData" }
stages {
stage('Probe') { steps { sh 'xcode-select -p; xcodebuild -version; df -h' } }
stage('Build') {
steps {
sh 'xcodebuild -scheme "App" -configuration Release -destination "generic/platform=iOS" -derivedDataPath "$DERIVED_DATA" build'
}
}
}
post { always { archiveArtifacts artifacts: '**/build.log', allowEmptyArchive: true } }
}
Tip:если трубопроводы еще и отгружают в магазины, читайтеFastlane + CIи согласовать пользователей сборки, разделы связки ключей и ключи API App Store Connect с доменами учетных данных Jenkins.
В дни обновления контроллера выполните один и тот же коммит до и после обновлений и сравните выходные данные отпечатков пальцев и дистрибутивы во время сборки. Противrunner caching: Очистка рабочего пространства Jenkins, которая слишком агрессивна и заполнена.pod installкаждый пробег; слишком консервативные очистки заполняют диски — определяют уровни хранения для платформы и продукта.
Если поставщики предоставляют нестандартные порты SSH и пользователей без полномочий root, храните метаданные подключения в описаниях учетных данных, а не разбрасывайте их по заданиям. Сопряжение сSSH checklist for known_hostspolicy вместо глобального отключения проверки ключей хоста.
Классическая ошибка — определять параллелизм исходя из того, «сколькоxcodebuildпроцессы подходят». В действительности,pod install/ СЗМ разрешает и компилирует пики на разных фазах — используйте дроссели и метки для моделированияmutex resources. Pair with Управление SwiftPM/Podsчтобы изолировать сложные задачи по решению задач от быстрых «зеленых» сборок.
Тесты пользовательского интерфейса, насыщенные симуляторами, меняют историю параллелизма по сравнению с заданиями, состоящими только из компиляции; следоватьXCTest / Simulatorруководство по сегментированию и изолировать эти задания с помощью собственных меток или пулов дочерних узлов.
Warning:не продолжайте планирование, когда диск находится ниже водяной отметки безопасности — сначала приостановите планирование и очистите его; в противном случае Xcode и git могут наполовину записать состояние, которое стоит больше, чем короткая очередь.
Мультирегиональные автопарки должны кодироватьregionв именах и метках узлов, а также помечайте пути выхода артефактов, чтобы избежать случайных массовых копий между регионами, ошибочно принятых за сбои сборки. Сrent vs buy TCOзаблаговременно включать задержку и выходную полосу пропускания в модель затрат.
Настройте пороговые значения в соответствии с вашими размерами параллелизма и репо; эти якоря объединяют команды безопасности и платформы. Для организаций, ориентированных на ЕС, logкакие машины касались каких подписывающих удостоверенийдля поддержки вопросов аудита DSGVO — удаленные узлы не должны быть анонимными домашними животными.
xcodebuild -version, swift --version, Ruby/Bundler, когда CocoaPods используется, и модель диска; повторно запускайте канареечные задания после любых изменений.Офисные ноутбуки и одноразовые Mac mini вызывают спящий режим, дрожание сети и дрейф цепочки инструментов; чистый Linux не может запускать официальный стек iOS от Apple. Сохранение Jenkins в Linux при переносе сборок macOS навыделенный, всегда включенный, доступный по SSHnodes превращает фразу «нам где-то нужен Mac» в операционный контракт. По сравнению со специальным оборудованием или нестабильными виртуализированными хостами,Аренда облака Mac Mini от NodeMiniпары фиксированного SSH, чистых дисковых уровней и повторяемых профилей — лучше для CI платформенного уровня. Сравните уровни вrental rates and onboard via the help center.
Привяжите этот модуль Runbook к внутренним «уровням изменений цепочки инструментов»: исправления Xcode, незначительные и крупные обновления должны иметь разные утверждения, канареечную область действия и правила аннулирования кэша.
Не автоматически. Jenkins выигрывает благодаря подключаемым конвейерам и локальной интеграции; Actions побеждает на PR-мероприятиях. Если у вас уже есть Job DSL, агенты SSH часто работают более гладко; если вы ориентированы на GitHub, бегунам может потребоваться меньше клея. Сравните уровни оборудования вrental rates.
Да — отделите дом и связку ключей от личных учетных записей, чтобы избежать спящего режима, подсказок графического интерфейса и дрейфа разрешений; соответствие контрольному списку SSH и статьям о воспроизводимых сборках. Более подробная информация содержится вhelp center.
Базовое пиковое усиление оперативной памяти и записи NVMe для одного задания, а затем масштабирование параллельной обработки при просмотре P95; Установка ведра DerivedData и тяжелого модуля дроссельной заслонки. Также прочтитеself-hosted runnerстатья о шаблонах кэша, соответствующих меткам Jenkins.