Skip to content

Сборки в контейнерах#

Disclaimer

The text below contains Avito specific details

Avito Docker documentation (internal)

Все образы расположены в ci/docker.

Android SDK image#

This is the base image with Android Build Tools.
It's not ready yet, see MBS-7071.

Android builder image#

This is the image for building and testing Android applications. It contains Android SDK.

How to update android-builder image?#

  1. Build the image to test your changes

Run Build android-builder (internal) teamcity configuration.
You will see the tag in stdout:

Image *******/android/builder:eb4a3b67e564 has been published successfully
export DOCKER_REGISTRY=<docker registry>
cd ci/docker
./publish.sh <directory with Dockerfile>

This script will build a new image. You will the tag in stdout:

Successfully built eb4a3b67e564

To push the image you must have registry credentials in these envs: DOCKER_LOGIN, DOCKER_PASSWORD .
Without it the script will stop after building.

  1. Upload the image to Docker Hub
  2. Update image hash in IMAGE_ANDROID_BUILDER variable in ci shell scripts:
    • In github repo: ci/_environment.sh
    • In internal avito repository: ci/_main.sh
  3. Check this images is working. At least, run ci/local_check.sh.
  4. Make PR with a new image.

Docker in docker image#

Утилитарный образ с докером внутри.
Используем внутри скриптов для создания и публикации других образов, прежде всего эмулятора.

How to update itself?#

Образ собирает сам себя с помощью предыдущей версии образа (bootstrapping):
./publish.sh docker-in-docker-image
publish.sh - использует текущую версию образа
docker-in-docker-image - содержит изменения

Если меняем контракт с окружением, то вносим правки поэтапно, чтобы прошлая версия образа могла собрать новую.

Build docker-in-docker (internal)

Android emulator images#

Эмуляторы имеют кастомные настройки, оптимизированы для стабильности и производительности.

  • Небольшое разрешение экрана: 320x480, 4 inch
  • Отключены многие фичи

Как запустить эмулятор?#

CI эмулятор невозможно запустить из-за ограничений виртуализации haxm #51. Поэтому воспроизводим идентичную конфигурацию.

  • Создай эмулятор в Android Studio: WVGA (Nexus One) с размером экрана 3.4'' и разрешением 480x800.
  • Запусти эмулятор
  • Настрой параметры:
adb root
adb shell "settings put global window_animation_scale 0.0"
adb shell "settings put global transition_animation_scale 0.0"
adb shell "settings put global animator_duration_scale 0.0"
adb shell "settings put secure spell_checker_enabled 0"
adb shell "settings put secure show_ime_with_hard_keyboard 1"
adb shell "settings put system screen_off_timeout 1800000"
adb shell "settings put secure long_press_timeout 1500"
  • Перезагрузи эмулятор

См. все настройки в android-emulator/hardware и android-emulator/prepare_snapshot.sh

Задача на автоматизацию (internal)

Проще и надежнее использовать оригинальные CI эмуляторы.

Требования:

  • Docker
  • KVM

  • Найди актуальную версию образа в Emulator.kt.

  • Разреши подключение к Xorg серверу с любого хоста (изнутри контейнера в нашем случае):
xhost +
  • Запусти эмулятор:
docker run -d \
    -p 5555:5555 \
    -p 5554:5554 \
    -e "SNAPSHOT_ENABLED"="false" -e "WINDOW"="true" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    --privileged \
    <registry>/android/emulator-27:<TAG>

Или в headless режиме:

docker run -d \
    -p 5555:5555 \
    -p 5554:5554 \
    --privileged \
    <registry>/android/emulator-27:<TAG>
  • Подключись к эмулятору в adb
adb connect localhost:5555

Как обновить образ?#

Для эмулятора нужна более сложная подготовка, поэтому используем отдельные скрипты и образы.

1. Залей образы в приватный Docker registry#

  1. Собери образ на ветке в Teamcity конфигурации Build android-emulator (internal).
    Теги новых образов будут в артефактах сборки.
  2. Обнови теги в build.gradle скриптах.
  3. Запушь изменение в ветку.

Требования:

  • Linux, docker
  • KVM
  • K8S права на push образов в registry-mobile-apps (env переменные DOCKER_LOGIN, DOCKER_PASSWORD)

  • Запусти скрипт:

cd ci/docker
./publish_emulator android-emulator

Соберет образ, протестирует и запушит в docker registry.

  1. Найти новые теги образов. См. stdout скрипта или файл android-emulator/images.txt
  2. Обнови теги образов в build.gradle скриптах.

2. Залей образы в Docker hub#

Uploading image to Docker Hub

Как проверить регрессию?#

  • Прогони instrumentation dynamic чтобы выявить возможную утечку памяти.
    Для этого запусти компонентный тест с большим числом повторов.
  • Прогони fullCheck
    Сравни количество тестов по всем статусам, не стало ли больше упавших или потерянных.

Как проверить сколько ресурсов тратит эмулятор?#

Локально используем cAdvisor

sudo docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

В CI смотрим в метрики куба.

Docker Hub#

Образы публикуем в hub.docker.com/u/avitotech.

Uploading image to Docker Hub#

Пока что заливаем вручную, задача на автоматизацию: MBS-8773.

  1. Залогинься в Docker hub
docker login --username=avitotech --password=...
  1. Скачай новый образ из приватного registry
docker pull <DOCKER_REGISTRY>/android/<image>:<DIGEST>

Пример:

docker pull registry/android/android-emulator-29:c0de63a4cd
  1. Поставь образу tag равный digest из приватного registry
docker tag <DIGEST> avitotech/android-emulator-<API>:<DIGEST>

Пример:

docker tag c0de63a4cd avitotech/android-emulator-29:c0de63a4cd`

Tag нужен чтобы ссылаться на образ по одним и тем-же координатам. Digest в разных registry может не совпадать (images ID does not match registry manifest digest).

  1. Залей образ
docker push avitotech/android-emulator-<API>:<DIGEST>`

Пример:

docker push avitotech/android-emulator-29:c0de63a4cd

Best practices#

Reproducible image#

Хотим получать одинаковый образ на любой машине, в любом окружении. Это упрощает отладку проблем и делает сборку более надежной.

reproducible-builds.org

Источники нестабильности:

  • Не указана явно версия зависимости.
  • Копируем в образ файлы, сгенерированные вне докера.
    Глядя на такие файлы трудно сказать в каком окружении они созданы, какое содержание ожидаемое.