Når man udvikler et projekt til Android-platformen, uanset hvor lille det er, må man før eller senere stå over for udviklingsmiljøet. Udover Android SDK er det nødvendigt at have den nyeste version af Kotlin, Gradle, platform-tools og build-tools. Og mens disse afhængigheder på udviklerens maskine i høj grad håndteres ved hjælp af Android Studio IDE, kan hver opdatering på CI/CD-serveren blive en hovedpine. Og hvis Docker er blevet standardløsningen på problemet med miljøet i webudvikling, hvorfor ikke også prøve at løse et lignende problem i Android-udvikling...
For dem, der ikke ved, hvad Docker er — helt simpelt, er det et værktøj til oprettelse af såkaldte "containere", der indeholder et minimum af OS-kernen og det nødvendige software, som vi kan implementere, hvor som helst, samtidig med at vi bevarer miljøet. Hvad der præcist vil være i vores container defineres i Dockerfile, som derefter samles til et billede, der kan køres hvor som helst og har egenskaberne ved idempotens.
Processen til installation og grundlæggende brug af Docker er beskrevet godt på dens websted. Derfor, for at springe lidt fremad, her er sådan en Dockerfile, vi har fået frem.
# Т.к. основным инструментом для сборки 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"
Vi gemmer den i mappen med vores Android-projekt og starter containerbygningen med kommandoen
docker build -t android-build:5.4-28-27 .Parameter -t angiver tag eller navn på vores container, som normalt består af dens navn og version. I vores tilfælde kaldte vi det android-build og i versionen angav vi en kombination af versionerne gradle, android-sdk og platform-tools. Fremover vil det være nemmere for os at finde det ønskede billede efter navn ved hjælp af sådan en "version".
Når byggeriet er færdigt, kan vi bruge vores billede lokalt, eller vi kan uploade det med kommandoen docker push til et offentligt eller privat billede-repository, så vi kan downloade det til andre maskiner.
Som et eksempel vil vi lokalt bygge projektet. For at gøre dette udfører vi kommandoen i mappen med projektet
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebugLad os gennemgå, hvad den betyder:
docker run — selve kommandoen til at starte billedet
-rm — betyder, at når containeren stopper, sletter den alt, hvad der blev oprettet i løbet af dens livscyklus
-v "$PWD":/home/gradle/ — mount den nuværende mappe med vores Android-projekt til den interne mappe i containeren /home/gradle/
-w /home/gradle — angiver containerens arbejdsmappe
android-build:5.4.1-28-27 — navnet på vores container, som vi har bygget
gradle assembleDebug — selve build-kommandoen, der bygger vores projekt
Hvis alt går godt, vil du om et par sekunder/minutter se noget som dette på din skærm BUILD SUCCESSFUL på 8m 3s! Og i mappen app/build/output/apk vil den byggede applikation ligge.
På samme måde kan andre gradle-opgaver udføres — kontrollere projektet, køre tests osv. Den store fordel er, at når projektet skal bygges på en anden maskine, behøver vi ikke bekymre os om at installere hele miljøet, og vi kan blot downloade det nødvendige billede og starte bygningen i det.
Containeren gemmer ikke nogen ændringer, og hver build starter fra bunden, hvilket på den ene side garanterer ensartethed i bygningen uanset hvor den startes fra, mens det på den anden side betyder, at man hver gang må downloade alle afhængighederne og kompilere hele koden igen, hvilket nogle gange kan tage betydelig tid. Derfor har vi udover det almindelige 'kolde' opstart også mulighed for at starte bygningen med bevarelse af den såkaldte 'cache', hvor vi gemmer mappen ~/ .gradle ved blot at kopiere den til projektets arbejdsmappe, og i starten af den næste bygning returnerer vi den. Alle kopieringsprocedurer har vi samlet i separate scripts, og selve opstartskommanden ser nu sådan ud
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"Som et resultat er den gennemsnitlige tid til at bygge projektet blevet reduceret flere gange (afhængigt af antallet af afhængigheder i projektet, men det gennemsnitlige projekt kan nu bygges på 1 minut i stedet for 5 minutter).
Alt dette giver selvfølgelig kun mening, hvis du har din egen interne CI/CD-server, som du selv vedligeholder. Men der er mange cloud-tjenester nu, hvor alle disse problemer er løst, og du ikke behøver at bekymre dig om det, da de nødvendige byggeegenskaber også kan angives i projektindstillingerne.
Kun registrerede brugere kan deltage i undersøgelsen. , please.
Har du CI/CD-systemet internt, eller bruger du en ekstern service?
Bruger den interne server
Bruger eksterne service
Bruger ikke CI/CD
Andet
42 brugere har stemt. 16 brugere har undladt at stemme.
Kilde: habr.com
