Внимание, хардкор! Для понимания происходящего ниже, нужно хорошо разбираться в том, как устроены и работают: selenium, selenium-hub, selenium-grid, docker, appium, adb. Я тебя предупредил.
Когда число девайсов в стенде мобильной автоматизации перевалило за 4 :-) мы стали замечать проблемы в работе adb. Он тупил при параллельной работе с несколькими девайсами а иногда вообще вставал колом и мы вручную его перезапускали. Мы попробовали изолировать девайсы в docker-контейнеры, чтобы у каждого был свой adb, работающий в один поток. Получилось даже лучше, чем мы ожидали, и в итоге мы стали использовать контейнеры не только для железок, но и эмуляторов.
Итак, мы запускаем appium внутри docker-контейнеров. По инстансу на каждый эмулятор или девайс. Единственный минус - приличный оверхед по диску - образ весит около 5Gb. Умножай на число подключенных девайсов :-). Зато получаешь все плюсы работы в изолированном окружении:
- у каждого девайса свой appium
- у каждого девайса свой adb (скорость работы с девайсами ускорилась в разы)
- раздельные логи для каждого девайса
- можно поднимать/гасить девайсы независимо друг от друга
Вот так выглядит наш Docker-файл для реальных девайсов:
Пробежимся по нетривиальным моментам:
RUN curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -
- костыль для установки nodejs на ubuntu, на ноде написан appium, без неё никудаRUN wget -qO- "http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz" | tar -zxv -C /opt/
- качаем и распаковываем SDKRUN echo "y" | android update sdk --filter android-16 --no-ui -a
- 16-я версия SDK опять же нужна appium’уCOPY files/configgen.sh /opt/config/
про этот скрипт будет чуть позжеRUN cd /opt && git clone --branch master --single-branch https://github.com/yandex-qatools/appium.git
- используем наш форк appium’aautossh -f -o StrictHostKeyChecking=no -N -i /opt/config/id_rsa -R $PORT:localhost:$PORT $HUBUSER@$HUB
- порты, на которых appium-нода слушает команды, открыты внутри контейнера и не видны наружу, поэтому мы создаём ssh-тоннель чтобы хаб мог общаться с appium-нодами
Как видишь, в контейнер зашит android sdk, который собственно и весит почти 5 гигов :-D Скрипт configgen.sh
считывает параметры девайса и генерирует конфиг-файл для запуска appium. Про него, а так же про возможности фильтрации устройств в selenium-гриде - в следующей серии.