Запуск тестов эмулятора на GitLab CI

GitLab CI (Continuous Integration) стал неотъемлемой частью процессов сообщества F-Droid. Это свободное программное обеспечение, построенное на открытых стандартах, и оно хорошо работает. Последний элемент, которого не хватает в нашей экосистеме тестирования, - это надежный способ запуска тестов в реальных эмуляторах Android. Благодаря усилиям многих людей, Google теперь действительно тестирует запуск эмуляторов Android в Docker. А недавние выпуски пакета эмуляторов SDK действительно работают без немедленного сбоя! Это самая многообещающая новость об использовании свободных программных эмуляторов для тестирования Android за долгое время. К сожалению, пока не все гладко, и чтобы заставить эмуляторы работать в GitLab CI, все еще требуется немного потанцевать с магическими заклинаниями (или с бубном). Наши требования таковы:

  • Работает на стандартных общих раннерах (бегунах?) gitlab.com.
  • Работает без KVM или каких-либо дополнительных привилегий.
  • Использует KVM, когда это доступно.

То, что мы имеем сейчас, дает нам основу для создания нашего стандартного fdroidclient CI setup. Раньше мы были ограничены использованием старых эмуляторов armeabi-v7a, которые работают почти невообразимо медленно. Это были единственные системные образы эмуляторов, которые могли работать в Docker без поддержки KVM. Даже с поддержкой KVM эмулятор кажется довольно нестабильным. Это стало лучше, но все еще не там, где должно быть.

Хорошей новостью является то, что запуск эмулятора в Docker теперь достаточно стабилен, чтобы люди действительно создавали вещи на его основе, например, запускали эмуляторы в GitHub Actions. Поскольку люди используют эмуляторы Google, это должно заставить Google заботиться о них. Установка эмулятора F-Droid является свободным программным обеспечением: базовый образ Debian, работающий на GNU/Linux runners. Любой проект, использующий GitLab CI, может использовать эту установку для запуска эмуляторов в запросах на слияние и т.д.

Важно использовать системные образы default, а не google_apis, поскольку они не содержат бинарных блоков Google Play и приложений, а также потому, что приложения Google сильно замедляют процесс загрузки. Кроме того, похоже, что системные образы с android-22 по android-27 требуют меньше ресурсов, чем более новые, настолько, что они вряд ли вообще будут работать в некоторых проектах.

Репозиторий microg system-image repository также включен в установку F-Droid. В настоящее время существует два образа:

  • system-images;android-29;microg;x86_64
  • system-images;android-23;microg;x86 - требуется эмулятор v28 или старше, так как в нем отсутствует ядро “ranchu”.

Использование

В fdroiclient setup используются шаблоны YAML для упрощения выбора конкретных настроек эмулятора, в частности, test-template, connected-template и kvm-template.

Мы используем образ microg в fdroidclient следующим образом:

kvm 29 microg x86_64:
  <<: *kvm-template

no-accel 29 microg x86_64:
  <<: *test-template
  <<: *connected-template
  • Для облегчения отладки журнал запуска ядра эмулятора можно найти в корне проекта в kernel.log, а полный вывод logcat в logcat.txt. Их можно включить в artifacts: для легкого доступа.
  • Чтобы запустить задания, использующие KVM, сначала необходимо иметь CI-бегунок GitLab, который поддерживает KVM и помечен fdroid и kvm. Затем необходимо установить переменную RUN_KVM_JOBS в настройках CI/CD Settings в значение true.

Чтобы развитие использования образов эмуляторов в GitLab CI продолжалось, создана вики-страница для документирования советов и рекомендаций, проблем и новых разработок: