Сегодня воскресенье. Подходит к концу моя неделя в этом аккаунте.
Как и обещал, расскажу о том, как мы собирали свою ферму андроид эмуляторов.
Начинали мы с простого запуска 4 или 6ти эмуляторов на одном из шагов прогона UI-тестов.
Эмуляторы были обёрнуты в докер-образ, поэтому не приходилось писать длинные команды вызовов.
Мы просто написали баш-скрипт, где шли по циклу, поднимали контейнер, ждали успешной загрузки и так N раз. Для полной уверенности мы ждали ещё какое-то время. Итого, запуск 6ти эмуляторов мог занимать около 10 минут. А перед этим собиралось приложение и тестовый apk
Занимало времени прилично. 200 тестов на 6ти эмуляторах шли около 2х часов.
QA озвучили свои ожидания в 1000 тестов к концу года.
Запускать больше эмуляторов мы не могли, т.к. упирались в ресурсы машин.
Но, на наше счастье оказалось, что android adb работает по обычному tcp/ip. И все сетевые просторы нам открыты, если только знаешь путь.
Проверили, сможет ли билдагент подключить эмуля на наших локальных машинах и прогнать тесты. Всё прошло успешно)
Мы заказали одну большую виртуалку (20 cpu и 64Gb RAM). Из расчёта 2cpu 4Gb на один эмулятор.
И сели писать обвязку для нашей фермы.
Нам виделись две задачи, которые нужно решить
Запускать эмули и следить за их жизнеспособностью. При необходимости перезапускать.
Подключать эмуляторы к билдагенту.
Спустя месяц началась интеграция.
Для каждой задачи мы создали отдельное java-приложение. Первое сделило за жизню эмулей на виртуалке. Второе запускалось вместе с билдагентом и следило за тем, чтобы определённые эмуляторы были подключены к текущему хосту.
Количество и адреса девайсов указывались в конфигах и заполнялись людьми.
Ферма оказалось очень стабильной. Эмуляторы дохли, если не проходили проверку на доступность, а им на смену поднимались новые.
Спустя время, мы дозаказали ещё две таких виртуалки. Конфигурации раскатывались через puppet, поэтому добавление новой машины особо не отнимало у нас время. Только конфиги заполнить.
Но, оказалось, что если поднять по 8-10 эмуляторов на одной такой машине, то начинались проблемы с производительностью, т.к. контейнеры дрались за ресурсы. Подвисание эмулей приводило к появлению красных тестов. Оптимальным оказалось число в 6 штук. Не самый экономный вариант.
Благодаря коллегами из отдела эксплуатации мы узнали, что есть кубер. И задумались о переезде агентов и эмуляторов в отдельное пространство.
Кубер полностью решал проблему с созданием контейнеров и проверкой их жизнеспособности.
Мы доработали приложение для подключения эмулей к хосту. Теперь оно просто ходило в Kubernetes-api и создавало столько эмуляторов сколько указано в конфигах.
А дальше всё по старому, подключаем девайсы и гоним тесты.
Т.к. в кубере работает ограничение ресурсов для контейнеров, то мы получили больше девайсов с приемлиемой производительностью.
Нам удалось организовать запуск 20 эмуляторов для прогонов UI-тестов на каждом pullrequest'е.
Новые ресурсы добавлялись в кластер и мы просто меняли количество девайсов и билдагентов на нашем CI.
Александр Крылов