Vytvoření projektu pro Android v kontejneru Docker

Při vývoji projektu pro platformu Android, byť sebemenšího, se dříve nebo později musíte vypořádat s vývojovým prostředím. Kromě Android SDK je potřeba mít nejnovější verzi Kotlin, Gradle, platform-tools, build-tools. A pokud jsou na vývojářském stroji všechny tyto závislosti vyřešeny ve větší míře pomocí Android Studio IDE, pak se na serveru CI / CD může každá aktualizace změnit v bolest hlavy. A pokud se ve vývoji webu stal Docker standardním řešením problému životního prostředí, tak proč s ním nezkusit vyřešit podobný problém ve vývoji Android ...

Pro ty, kteří nevědí, co je Docker – pokud je to celkem jednoduché, tak se jedná o nástroj pro tvorbu tzv. „Kontejnery“, které obsahují minimální jádro operačního systému a potřebnou sadu softwaru, který můžeme nasadit, kdekoli chceme, při zachování prostředí. Co přesně bude v našem kontejneru, je určeno v Dockerfile, který se pak sestaví do obrazu, který lze spustit kdekoli a má vlastnosti idempotence.

Proces instalace a základy Dockeru jsou na něm krásně popsány oficiální stránky. Proto, když se podíváme trochu dopředu, máme takový Dockerfile

# Т.к. основным инструментом для сборки Android-проектов является Gradle, 
# и по счастливому стечению обстоятельств есть официальный Docker-образ 
# мы решили за основу взять именно его с нужной нам версией Gradle
FROM gradle:5.4.1-jdk8

# Задаем переменные с локальной папкой для Android SDK и 
# версиями платформы и инструментария
ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" 
    ANDROID_HOME="/usr/local/android-sdk" 
    ANDROID_VERSION=28 
    ANDROID_BUILD_TOOLS_VERSION=28.0.3

# Создаем папку, скачиваем туда SDK и распаковываем архив,
# который после сборки удаляем
RUN mkdir "$ANDROID_HOME" .android 
    && cd "$ANDROID_HOME" 
    && curl -o sdk.zip $SDK_URL 
    && unzip sdk.zip 
    && rm sdk.zip 
# В следующих строчках мы создаем папку и текстовые файлы 
# с лицензиями. На оф. сайте Android написано что мы 
# можем копировать эти файлы с машин где вручную эти 
# лицензии подтвердили и что автоматически 
# их сгенерировать нельзя
    && mkdir "$ANDROID_HOME/licenses" || true 
    && echo "24333f8a63b6825ea9c5514f83c2829b004d1" > "$ANDROID_HOME/licenses/android-sdk-license" 
    && echo "84831b9409646a918e30573bab4c9c91346d8" > "$ANDROID_HOME/licenses/android-sdk-preview-license"    

# Запускаем обновление SDK и установку build-tools, platform-tools
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" 
    "platforms;android-${ANDROID_VERSION}" 
    "platform-tools"

Uložíme jej do složky s naším projektem pro Android a začneme sestavovat kontejner pomocí příkazu

docker build -t android-build:5.4-28-27 .

Parametr -t nastavuje značku nebo název našeho kontejneru, který se obvykle skládá z jeho názvu a verze. V našem případě jsme to nazvali android-build a ve verzi jsme specifikovali kombinaci verzí gradle, android-sdk a platform-tools. V budoucnu pro nás bude snazší vyhledat požadovaný obrázek podle názvu pomocí takové „verze“.

Po dokončení sestavení můžeme použít náš obrázek lokálně, můžeme si jej stáhnout pomocí příkazu docker push do veřejného nebo soukromého úložiště obrázků za účelem stažení do jiných počítačů.

Jako příklad si postavme místní projekt. Chcete-li to provést, ve složce projektu spusťte příkaz

docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebug

Pojďme zjistit, co to znamená:

docker run - samotný příkaz pro spuštění obrazu
-rm - znamená, že po zastavení kontejner smaže vše, co za dobu jeho životnosti vzniklo
-v "$PWD":/home/gradle/ - připojí aktuální složku s naším projektem Android do vnitřní složky kontejneru /home/gradle/
-w /home/gradle - nastaví pracovní adresář kontejneru
sestavení androidu: 5.4.1-28-27 - název našeho kontejneru, který jsme shromáždili
gradle assembleDebug - samotný stavební tým, který sestavuje náš projekt

Pokud vše půjde dobře, po několika sekundách / minutách uvidíte něco podobného POSTAVENÍ ÚSPĚŠNĚ za 8m 3s! A ve složce app/build/output/apk bude sestavená aplikace.

Podobně můžete provádět další gradle úkoly - kontrolovat projekt, spouštět testy atd. Hlavní výhodou je, že pokud potřebujeme projekt postavit na jakémkoli jiném stroji, nemusíme se starat o instalaci celého prostředí a bude stačit stáhnout potřebný image a v něm build spustit.

Kontejner neukládá žádné změny a každá sestava se spouští od nuly, což na jedné straně zaručuje identitu sestavy bez ohledu na to, kde je spuštěno, na druhé straně pokaždé, když musíte stáhnout všechny závislosti a znovu zkompilujte celý kód, což může někdy trvat značnou dobu. Máme tedy kromě běžného „studeného“ startu možnost spuštění montáže při zachování tzv. "cache", kde složku ~/.gradle jednoduchým zkopírováním do pracovní složky projektu uložíme a na začátku dalšího sestavení ji vrátíme zpět. Všechny kopírovací procedury jsme přesunuli do samostatných skriptů a samotný příkaz ke spuštění začal vypadat takto

docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 /bin/bash -c "./pre.sh; gradle assembleDebug; ./post.sh"

V důsledku toho se průměrná doba sestavení projektu několikanásobně zkrátila (v závislosti na počtu závislostí na projektu, ale průměrný projekt se tak začal stavět za 1 minutu místo 5 minut).

To vše samo o sobě dává smysl pouze v případě, že máte vlastní interní CI/CD server, který sami podporujete. Nyní však existuje mnoho cloudových služeb, ve kterých jsou všechny tyto problémy vyřešeny a nemusíte se o to starat, a potřebné vlastnosti sestavení lze také zadat v nastavení projektu.

Průzkumu se mohou zúčastnit pouze registrovaní uživatelé. Přihlásit se, prosím.

Ponecháváte si systém CI/CD interní nebo používáte službu třetí strany?

  • Použití interního serveru

  • Pomocí externí služby

  • Nepoužíváme CI/CD

  • Další

Hlasovalo 42 uživatelů. 16 uživatelů se zdrželo hlasování.

Zdroj: www.habr.com

Přidat komentář