🔥

Тред (Александр Крылов)


Сегодня воскресенье. Подходит к концу моя неделя в этом аккаунте. Как и обещал, расскажу о том, как мы собирали свою ферму андроид эмуляторов.

Начинали мы с простого запуска 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.

Александр КрыловАлександр Крылов