Skip to content

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

Disclaimer

The text below contains Avito specific details

Avito Docker documentation (internal)

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

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:

Published the image <docker registry>/android/builder:<tag>

If you need to test locally before publishing:

# Docker registry to further publishing
export DOCKER_REGISTRY=...
# DockerHub credentials (optional)
export DOCKER_HUB_USERNAME=...
export DOCKER_HUB_PASSWORD=...
cd ci/docker
./build.sh <directory with Dockerfile>

You will see in stdout:

Image <image id> tagged as <docker registry>/android/image-builder:<tag>

Continue to further publishing:

# Docker registry to publish
export DOCKER_REGISTRY=...
export DOCKER_REGISTRY_USERNAME=...
export DOCKER_REGISTRY_PASSWORD=...
# DockerHub credentials (optional)
export DOCKER_HUB_USERNAME=...
export DOCKER_HUB_PASSWORD=...
cd ci/docker
./publish.sh <directory with Dockerfile>

You will see in stdout:

Published the image <docker registry>/android/builder:<tag>
  1. 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
  2. Check this images is working. At least, run ci/local_check.sh.
  3. Make PR with a new image.

Image builder#

Образ для сборки других docker образов.

Как обновить#

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

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

Teamcity configuration: Build image-builder (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. Собери образ на ветке в 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.sh android-emulator 30

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

  1. Найти новые теги образов. См. stdout: "Published the image ..."
  2. Обнови теги образов в скриптах.

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

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

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

Локально используем 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=...
    
  2. Скачай новый образ из приватного registry:
    docker pull <DOCKER_REGISTRY>/<repository>/<image>:<TAG>
    
    Пример:
    docker pull inhouse-registry/android/android-emulator-29:c0de63a4cd
    
  3. Поставь образу такой-же тег, но имя для репозитория в DockerHub:

    docker tag <SOURCE IMAGE> avitotech/android-emulator-<API>:<TAG>
    
    Пример:
    docker tag inhouse-registry/repository/android-emulator-29:c0de63a4cd avitotech/android-emulator-29:c0de63a4cd`
    

    Info

    Первоначальный уникальный tag получаем из digest. Проставляем его как tag, потому-что digest в разных registry может не совпадать.

  4. Залей образ:

    docker push <IMAGE>:<TAG>
    
    Пример:
    docker push avitotech/android-emulator-29:c0de63a4cd
    

Best practices#

Reproducible image#

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

reproducible-builds.org

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

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