Задание на управляемом macOS Runner GitLab завершается ошибкой во время UI-теста, хотя сборка проходит.
Самое быстрое решение: сначала проверьте, требует ли тест интерактивной UI-сессии или testmanagerd. Управляемые macOS Runner работают в режиме headless, и GitLab прямо указывает, что задания с такими зависимостями не поддерживаются; смена метки Runner и повторный запуск это ограничение не устраняют. Если тест не зависит от UI, проверяйте журналы, образ, Xcode и фактическую маршрутизацию задания, а не объявляйте проблему ограничением платформы без доказательств.
Эта диагностика предназначена инженерам CI-платформ, которые разбирают сбой iOS UI-тестов на управляемых Runner.
Она также поможет руководителям IT и выпускающим специалистам разделить задачи, остающиеся в управляемой среде, и проверки, для которых требуется Mac с подходящим пользовательским сеансом.
Последняя проверка: 5 ноября 2026 года. Статус, режим выполнения и ограничения сверены с документацией GitLab по управляемым macOS Runner, а поведение XCTest и XCUIAutomation — с документацией Apple по XCTest. Образы, доступность и ограничения могут меняться, поэтому перед изменением конвейера сверяйте текущие страницы документации.
GitLab macOS hosted runners: ограничение headless или сбой среды?
Управляемый macOS Runner GitLab может быть пригоден для сборки и неинтерактивных тестов, но это не означает, что он способен выполнить проверку, которой нужна реальная UI-сессия. В документации GitLab статус этой возможности обозначен как Beta; там же указано, что Runner работает в режиме headless и что задания, зависящие от UI-взаимодействия, включая взаимодействие с testmanagerd, не поддерживаются. Поэтому сначала классифицируйте тест, а затем выбирайте способ исправления.
| Что проверяется | На что указывает документация или журнал | Что делать дальше |
|---|---|---|
| Сборка приложения | Компиляция или этап подготовки завершается до запуска тестов | Проверить образ, Xcode, настройки сборки и фактическое задание в журнале |
| Набор тестов без UI | Тестовый процесс запускается, но завершается с ошибкой проверки или зависимости | Разбирать сообщение теста, окружение и результат запуска; не считать headless причиной автоматически |
| XCTest UI-тест | Тест требует управления интерфейсом, Simulator или testmanagerd |
Сопоставить требование с ограничением GitLab; оценить другой Mac с подходящим пользовательским сеансом |
| Неизвестный тип сбоя | В журнале нет убедительных данных о причине | Сохранить полный журнал и подтвердить тип Runner, образ и назначение задания |
Таблица не заменяет проверку конкретной конфигурации. Она задаёт порядок расследования: ограничение UI, ошибка инструментария и неверное направление задания требуют разных действий. Повторно запускать задачу имеет смысл только для проверки непостоянного сбоя, но не как средство обхода задокументированного ограничения.
Почему управляемый Runner может не запускать UI-тест?
В headless-среде нет предпосылки, что тест сможет управлять пользовательским интерфейсом так же, как на Mac с доступной UI-сессией. GitLab отдельно относит к неподдерживаемым рабочие нагрузки, зависящие от интерактивного UI, в том числе связанные с testmanagerd; сверяйте это утверждение с актуальным описанием ограничений macOS Runner. Это причина изменить среду выполнения соответствующей задачи, а не подбирать другую метку Runner.
Apple описывает XCTest как набор средств тестирования, а XCUIAutomation — как средства автоматизации взаимодействия с пользовательским интерфейсом. Их назначение само по себе не подтверждает, что конкретная CI-среда поддерживает нужный режим. Сверяйте цель теста с описанием тестирования в Xcode и затем отдельно — с ограничениями GitLab.
Разделение важно для планирования выпуска: если ваша цель — проверить логику и результат сборки, такой тест может быть подходящим кандидатом для headless-задания. Если проверка должна нажимать кнопки, переходить по экранам или проверять отображение интерфейса, успешный компиляторный этап не доказывает, что UI-проверка выполнима в том же окружении.
Какие признаки отличают ошибку UI-теста от сбоя сборки?
Смотрите не только на итоговый статус задания, но и на последний успешно завершённый этап. GitLab различает состояния заданий и предоставляет журналы выполнения; используйте описание статусов заданий вместе с документацией по журналам CI/CD. Сам факт, что задание завершилось ошибкой, не устанавливает её причину.
- Сборка не завершилась. В журнале нет подтверждения, что тестовый процесс вообще стартовал. Проверяйте компиляцию, подписание, зависимости и параметры команды сборки.
- Тестовый набор стартовал, но завершился ошибкой. Установите, какой тест и какая проверка завершились неуспешно. Ошибка логики приложения или тестовых данных не равна ограничению UI-сессии.
- UI-тест не стартует либо не может взаимодействовать с приложением. Сопоставьте цель теста с требованиями UI-сессии и ограничением headless, не смешивая их с ошибкой установки Simulator или неверной версией инструментария.
- Тестов в журнале нет или запущен не тот этап. Проверьте правила задания, зависимости между этапами и фактическое назначение Runner.
Например, если компиляция проходит, а этап тестирования не сообщает о запуске ожидаемой UI-проверки, вывод «приложение собирается, значит тестовая цепочка исправна» преждевременен. Зафиксируйте, какую команду выполнил Runner, какой тестовый набор она выбрала и на каком шаге журнал прекращает показывать прогресс. Это помогает отличить неверный сценарий запуска от ограничений среды.
Не удаляйте журнал и не заменяйте его только итоговой строкой об ошибке. При диагностике нужны команда запуска, сообщения о выборе тестов и сведения о фактически назначенной среде; без них гипотеза о headless может оказаться лишь предположением.
Что проверить в журнале, образе и маршрутизации задания
Если журнал не показывает явного UI-ограничения, сначала подтвердите, на какой именно Runner попало задание. В проектах с несколькими исполнителями похожие имена, метки или правила могут направить job не в ту среду, которую инженер ожидал. Сверьте заданные метки, ограничения выполнения и идентификатор назначенного Runner с журналом конкретного задания.
Затем выясните, каким образом используется образ и какие инструменты в нём доступны. Не исходите из старого списка Xcode или Simulator Runtime: документация GitLab по образам и условиям доступности управляемых Runner и страница macOS Runner могут измениться. Проверяйте текущий перечень поддерживаемых образов и фактическую информацию, выведенную заданием, а не переносите версии из другой ветки конвейера или прежнего запуска.
Проверка по шагам
- Сохраните полный журнал неудачного задания. Отметьте этап последнего успешного выполнения и команду, которая должна была запустить тесты. Не ограничивайтесь сообщением интерфейса о статусе.
- Подтвердите тип фактического Runner. Сверьте назначение и метки задания с ожидаемой конфигурацией. Если в журнале или параметрах job нет достаточных сведений, добавьте безопасный вывод диагностической информации, который не раскрывает секреты.
- Уточните цель тестового этапа. Разделите сборку, XCTest без UI, интеграционную проверку и автоматизацию интерфейса. Проверьте, что команда запуска действительно выбирает нужную тестовую цель.
- Проверьте образ и инструментарий. Сопоставьте используемый образ с текущей документацией GitLab, затем подтвердите доступность необходимого Xcode и Simulator Runtime в конкретном задании. Отсутствие Runtime рассматривайте как гипотезу до подтверждения журналом.
- Сравните результаты успешного и неудачного запуска. Используйте один и тот же проект, тестовую цель и конфигурацию конвейера. Ищите различия в Runner, образе и выводе о доступных инструментах, а не только в финальном статусе.
- Классифицируйте причину до изменения архитектуры. Если подтверждено отсутствие инструмента или неверная маршрутизация, исправляйте соответствующую конфигурацию. Если тест зависит от UI-взаимодействия, переходите к оценке другой среды, а не бесконечному повтору.
Для управляемых macOS Runner GitLab публикует сведения о доступных образах и условиях использования, но это не освобождает команду от проверки конкретного назначения job. Полезно хранить в журнале безопасную сводку о выбранном образе и окружении: она позволяет сопоставлять попытки, не опираясь на предположения. Не выводите секреты, токены подписи и закрытые переменные при расширении диагностики.
Может ли управляемый Runner выполнять XCTest UI-тесты и обычные тесты?
Ответ зависит от вида теста. XCTest охватывает разные способы тестирования, тогда как автоматизация интерфейса требует отдельной проверки условий запуска. Поэтому утверждение «XCTest работает» не равнозначно утверждению «UI-тесты работают», а успешный запуск unit-тестов не подтверждает поддержку UI-сессии. Apple объясняет назначение XCTest в документации фреймворка, а конкретную роль тестирования и автоматизации в Xcode — в руководстве по тестированию.
Обычные тесты без интерактивного взаимодействия можно пробовать на управляемом Runner, если проект, образ и команды запуска соответствуют текущим условиям GitLab. Такой запуск следует считать проверкой вашей конкретной задачи, а не общей гарантией для всех наборов XCTest. Если тестовая цель включает UI-автоматизацию или обращается к компоненту, который GitLab исключает из поддерживаемых сценариев, успешная сборка и запуск независимых тестов не устраняют этого ограничения.
Чтобы избежать неверного критерия готовности, разделите в конвейере отчёты о сборке, неинтерактивных тестах и UI-приёмке. Тогда команда сможет сохранить подходящие этапы в управляемом окружении, а интерфейсные проверки назначить в среду, которая прошла отдельное испытание. Это также упрощает разбор: ошибка конкретной UI-проверки не будет скрыта общей меткой «тесты не прошли».
Когда вместо управляемого Runner нужен Mac с пользовательским сеансом?
Если проверка должна взаимодействовать с Simulator или рабочим столом, оцените самостоятельный Mac либо удалённую Mac-среду с подходящими условиями пользовательского сеанса. В документации GitLab Runner для macOS описан запуск с использованием LaunchAgent и пользовательского сеанса; изучите описание режимов установки и работы Runner на macOS. Сам факт удалённого доступа к Mac не гарантирует, что ваша UI-тестовая цепочка будет работать: это нужно проверять на целевой конфигурации.
| Вариант | Когда рассматривать | Ограничения и ответственность |
|---|---|---|
| Управляемый macOS Runner GitLab | Сборка и задания, которые не требуют неподдерживаемого UI-взаимодействия | Нужно сверять текущие ограничения, образ и правила назначения задания |
| Собственный Mac | Нужны контроль над настройкой, пользовательским сеансом и доступом к среде | Команда отвечает за обслуживание, обновления, безопасность и доступность машины |
| Удалённый арендованный Mac | Нужен удалённый Mac для проверки сценария без покупки отдельного компьютера | Требуются собственная проверка совместимости, настройка доступа и оценка ответственности за CI-процесс |
Выбирайте среду не по формулировке «облачная» или «собственная», а по подтверждённому результату. Для решения нужны повторяемый запуск представительной UI-проверки, диагностируемые журналы, понятная маршрутизация и согласованная модель доступа. Вопросы управления доступом и обработки данных стоит оценивать отдельно; для предварительной проверки используйте, например, описание защиты данных и конфиденциальности, не принимая его за замену внутренней оценке безопасности.
У собственной машины есть преимущество контроля, но есть и постоянные обязанности: обслуживать операционную систему и инструменты, управлять пользовательской сессией, следить за доступом и восстанавливать исполнение при сбоях. Удалённая аренда позволяет не покупать отдельный Mac для каждого эксперимента, однако не снимает с команды проверки конфигурации и не делает UI-тесты автоматически совместимыми. Если решение требует конкретного региона или устройства, сначала изучите доступные сведения о удалённой среде Mac mini, затем сверяйте их с вашими требованиями; не считайте географическое расположение или удалённое управление доказательством прохождения теста.
Как принять решение по результатам пробного запуска
Сравнивайте управляемую среду и кандидатный Mac на одном проекте, одной тестовой цели и сопоставимых условиях конвейера. Проверьте три результата: выполняется ли нужная тестовая цель, позволяют ли журналы определить место сбоя и понятно ли, кто отвечает за образ, пользовательский сеанс и обновление инструментария. Зафиксируйте также, какие этапы можно оставить в управляемом Runner без UI, а какие требуют отдельного исполнения.
Если сборка и неинтерактивные тесты проходят, а UI-проверка упирается в документированное ограничение, разделите задачи, вместо того чтобы объявлять весь Runner неисправным. Если журнал указывает на недостающий Runtime, несовпадающий образ или ошибочную маршрутизацию, сначала устраните эту причину и повторите тот же сценарий. Результат пробного запуска относится только к испытанному проекту и окружению: не переносите его автоматически на другие приложения, цели и конфигурации.
Для команды, которой нужен только повторяемый запуск сборки и неинтерактивных проверок, отдельный удалённый Mac может добавить ненужные обязанности и расходы — оставьте такие задания в подходящей управляемой среде. Но если релиз зависит от автоматизации Simulator или рабочего стола, сравните текущую схему с Mac-средой: управляемый headless Runner не предоставляет требуемого UI-взаимодействия, а самостоятельная машина требует обслуживания и контроля доступа. Если вам нужно испытать конкретный сценарий на удалённом Mac, изучите доступные руководства OSXPort, подготовьте тестовую цель и журнал, а затем решите по результату, оправдана ли аренда для вашего CI.
Читайте также
Проверьте UI-тесты на выделенном Mac от OSXPort
Запустите self-hosted runner на физическом Mac mini с графической средой macOS и проверьте, связана ли ошибка с headless-ограничениями.
