Při vývoji projektu pro platformu Android, i ten nejmenší, se dříve nebo později setkáte s vývojovým prostředím. Kromě Android SDK je nezbytné mít nejnovější verzi Kotlin, Gradle, platform-tools a build-tools. A pokud se na stroji vývojáře všechny tyto závislosti většinou řeší pomocí Android Studio IDE, pak na serveru CI/CD může každá aktualizace představovat velkou bolest hlavy. A pokud se ve webovém vývoji stalo řešením problému s prostředím standardem Docker, proč nezkusit vyřešit podobný problém i v Android vývoji...
Pro ty, kteří nevědí, co je Docker — pokud to řekneme jednoduše, je to nástroj pro vytváření tzv. "kontejnerů", ve kterých je obsaženo minimální jádro OS a potřebný souborový software, které můžeme nasadit kdekoli, přičemž si uchováváme prostředí. Co přesně bude v našem kontejneru, se určuje v Dockerfile, který se pak sestavuje do obrazu, jenž může být spuštěn kdekoli a má vlastnosti idempotence.
Proces instalace a základy Dockeru jsou skvěle popsány na jeho . Takže, abychom se posunuli dál, tady je náš Dockerfile, který jsme vytvořili
# Т.к. основным инструментом для сборки 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 ho do složky s naším Android projektem a spustíme sestavení kontejneru příkazem
docker build -t android-build:5.4-28-27 .Parameter -t určuje tag nebo název našeho kontejneru, který se obvykle skládá z jeho názvu a verze. V našem případě jsme ho nazvali android-build a ve verzi jsme uvedli souhrn verzí gradle, android-sdk a platform-tools. V budoucnu pro nás bude snazší vyhledávat potřebný obraz podle názvu pomocí takové "verze".
Jakmile proběhne sestavení, můžeme náš obraz použít lokálně, můžeme ho nahrát příkazem docker push do veřejného nebo soukromého repozitáře obrazů, abychom ho mohli stahovat na jiné stroje.
Jako příklad sestavíme projekt lokálně. K tomu v adresáři s projektem provedeme příkaz
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebugPodívejme se, co to znamená:
docker run — samotný příkaz pro spuštění obrazu
-rm — znamená, že po zastavení kontejneru odstraní vše, co bylo vytvořeno během jeho života
-v "$PWD":/home/gradle/ — připojuje aktuální složku s naším Android projektem k vnitřní složce kontejneru /home/gradle/
-w /home/gradle — určuje pracovní adresář kontejneru
android-build:5.4.1-28-27 — název našeho kontejneru, který jsme sestavili
gradle assembleDebug — vlastně je to sestavovací příkaz, který sestavuje náš projekt
Pokud všechno půjde dobře, za pár sekund/minut na obrazovce uvidíte něco jako BUILD SUCCESSFUL za 8m 3s! A ve složce app/build/output/apk se bude nacházet sestavená aplikace.
Podobně lze provádět i další úkoly gradle — kontrolovat projekt, spouštět testy atd. Hlavní výhodou je, že pokud potřebujeme sestavit projekt na jakémkoli jiném stroji, nemusíme se starat o instalaci celého prostředí a stačí stáhnout potřebný obraz a spustit v něm sestavení.
Kontejner neukládá žádné změny a každé sestavení začíná od nuly, což na jedné straně zaručuje identičnost sestavení bez ohledu na místo jeho spuštění, na druhé straně se každýkrát musí stahovat všechny závislosti a kompilovat celý kód znovu, což může někdy zabrat značný čas. Proto kromě běžného "studeného" spuštění máme možnost spuštění sestavení se zachováním tzv. "cache", kde uložíme složku ~/ .gradle prostě jejím zkopírováním do pracovní složky projektu a na začátku dalšího sestavení ji vrátíme zpět. Všechny procedury kopírování jsme vyvedli do samostatných skriptů a samotný příkaz pro spuštění nyní vypadá 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 zkrátila několikanásobně (v závislosti na počtu závislostí v projektu, ale průměrný projekt se takto začal sestavovat za 1 minutu místo 5 minut).
To všechno dává smysl pouze v případě, že máte vlastní interní CI/CD server, o jehož podporu se sami staráte. Dnes již 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, přičemž potřebné vlastnosti sestavení lze také uvést v nastavení projektu.
Pouze registrovaní uživatelé se mohou účastnit ankety. , prosím.
Držíte systém CI/CD uvnitř, nebo používáte externí službu
Používáme interní server
Používáme externí službu
Nepoužíváme CI/CD
Jiné
Hlasovali 42 uživatelé. Zdrželo se 16 uživatelů.
Zdroj: habr.com
