Как я могу получить Xcode 5 для запуска модульных тестов iOS на подчиненном устройстве Jenkins?

Мы использовали Jenkins с плагином Xcode для непрерывной интеграции наших приложений iOS, включая автоматическое выполнение и отчетность модульных тестов. Это хорошо работало с использованием Jenkins на Linux-машине и ведомого Mac с Xcode 4.6.3.

Теперь мы хотим обновить настройку до Xcode 5 для поддержки целевой iOS 7 и столкнуться с следующими проблемами.

Во-первых, модульные тесты не запускались вообще, потому что мы использовали RunUnitTests script из Xcode 4, который больше не поддерживается в Xcode 5. Я обратился к этому, как рекомендовано Xcode, путем настройки рабочей области с помощью соответствующую схему с целью unit test.

Затем я сконфигурировал шаг Xcode задания Jenkins с настраиваемыми аргументами xcodebuild, установленными на test -destination platform=${DESTINATION_PLATFORM},name=${DESTINATION_NAME},OS=${DESTINATION_OS}, чтобы заставить его выполнять модульные тесты.

Если я запустил командную строку xcodebuild, что плагин Xcode для Jenkins запускается в Terminal на моем собственном компьютере, тесты модуля выполняются, но когда выполняется задание Jenkins, он либо терпит неудачу, либо зависает при попытке выполнить модульные тесты.

Я подозреваю, что это связано с тем, что с помощью Xcode 5 и тестовой сборки вместо RunUnitTests script теперь в iOS Simulator запускаются модульные тесты, для которых требуется интерактивный сеанс, а подчиненный процесс Jenkins запускается через SSH от мастера Jenkins (Linux). Если я зашел в подчиненную машину с учетной записью, которую использует Jenkins для SSH, я вижу, что iOS Simulator запускается, когда должны выполняться тесты модулей, но тесты не работают и работа зависает. Если я не вошел в подчиненную машину, задание Jenkins не может выполнить модульные тесты.

Есть ли какой-либо способ получить модульные тесты iOS на подчиненном устройстве Jenkins через SSH, а если нет, любые предложения о том, как сохранить автоматизацию выполнения модульных тестов, когда проект должен быть построен с помощью Xcode 5?

Ответ 1

Основываясь на coffeebreaks 'answer, я придумал полное решение.

Прежде всего, ведомый Mac не может быть запущен с SSH и должен запускаться вручную с помощью интерактивного сеанса, а затем оставался вошедшим в систему в любое время. В моей ситуации раб фактически безголовый, так что это еще одно осложнение.

Вот шаги, которые я использовал, чтобы все это работало.

  • Создайте новый подчиненный node на главном сервере Jenkins, настроенном на уникальную метку (я выбрал "xcode-unittests" ) и метод запуска, установленный в "Запуск ведомых агентов через Java Web Start".

  • Войдите через общий доступ к экрану (VNC) в подчиненное устройство Mac и запустите ведомый агент. В моем случае я не мог заставить раба запускаться из браузера, возможно, потому, что у моего браузера не было необходимого Java-плагина для запуска апплетов. Поэтому я использовал командную строку javaws http://{jenkins-host}/computer/{slave-name}/slave-agent.jnlp. Чтобы сделать это немного более надежным, я настроил эту команду для автоматического запуска при каждом входе в систему на компьютере в соответствии с "Системные настройки", "Пользователи и группы", "Элементы входа".

  • Закройте экранное разделение без выхода из подчиненного устройства Mac. Это позволяет интерактивному сеансу работать с ведомым агентом, даже если никто не использует эту машину.

Для того, чтобы модульные тесты запускались без запроса пользователя, мне также пришлось запустить sudo DevToolsSecurity -enable на ведомом Mac. Это позволяет Xcode взаимодействовать с iOS Simulator без интерактивного запроса разрешения сделать это каждый раз.

Если ведомая машина когда-либо перезагружается, кто-то должен войти в подчиненное устройство Mac, чтобы запустить ведомый агент. По этой причине я также оставил активную рабочую станцию ​​на базе SSH. Я разделил работу Jenkins на отдельные задания для создания приложений и выполнения модульных тестов. Работы по созданию приложений настроены для работы на ведомом на базе SSH, а задания для запуска модульных тестов сконфигурированы для работы на интерактивном ведомом node, описанном выше. Таким образом, если интерактивное подчиненное устройство опускается, пострадают только модульные тесты, а не сборки продукта.

Ответ 2

Попробуйте запустить ведомое устройство jenkins со стандартного терминала на вашем подчиненном устройстве Mac, а не от мастера, использующего SSH.

Ответ 3

См. ответы GBegen и кофе-брейки. Когда Jenkins защищен, используйте альтернативную командную строку, чтобы запустить ее из сеанса общего доступа к экрану/сеанса VNC.

java -jar slave.jar -jnlpUrl http://jenkins-master:port/computer/jenkins-slave/slave-agent.jnlp -secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Ответ 4

Что @GBegen сказал правильно, и я раньше делал это раньше - Запустите симулятор и выйдите из VNC без выхода из системы, но это было ненадежным. Теперь я должен иметь script, который фактически запускает симулятор, если он не работает. С Xcode 5, который также сломался, но я исправил его, добавив пользователя jenkins в группу администратора.