Izgradnja Android projekta u Docker kontejneru

Prilikom razvoja projekta za Android platformu, čak i najmanjeg, prije ili kasnije morate se pozabaviti razvojnim okruženjem. Pored Android SDK-a, potrebno je imati najnoviju verziju Kotlina, Gradlea, platform-tools, build-tools. A ako se na stroju programera sve ove ovisnosti rješavaju u većoj mjeri pomoću Android Studio IDE, onda se na CI/CD serveru svako ažuriranje može pretvoriti u glavobolju. A ako je u web razvoju Docker postao standardno rješenje problema okruženja, zašto onda ne biste pokušali riješiti sličan problem u razvoju Androida koristeći ga...

Za one koji ne znaju šta je Docker, pojednostavljeno rečeno, to je alat za kreiranje tzv. “kontejneri” koji sadrže minimalno jezgro OS-a i neophodan set softvera koji možemo postaviti gdje god želimo, uz očuvanje okoline. Šta će tačno biti u našem kontejneru određuje se u Dockerfile-u, koji se zatim sklapa u sliku koja se može pokrenuti bilo gde i ima svojstva idempotencije.

Proces instalacije i osnove Dockera savršeno su opisani u njegovom službena web stranica. Stoga, gledajući malo unaprijed, ovo je Dockerfile s kojim smo završ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"

Spremamo ga u fasciklu sa našim Android projektom i počinjemo da pravimo kontejner pomoću naredbe

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

Parametar -t specificira oznaku ili naziv našeg kontejnera, koji se obično sastoji od njegovog imena i verzije. U našem slučaju smo ga nazvali android-build, au verziji smo naveli skup verzija gradle, android-sdk i platform-tools. U budućnosti će nam biti lakše tražiti sliku koja nam je potrebna po imenu koristeći ovu „verziju“.

Nakon što je sklapanje završeno, našu sliku možemo koristiti lokalno, možemo je preuzeti naredbom docker push u javno ili privatno spremište slika da ga preuzmete na druge mašine.

Kao primjer, napravimo projekt lokalno. Da biste to učinili, u fascikli s projektom pokrenite naredbu

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

Hajde da shvatimo šta to znači:

docker run - sama komanda za pokretanje slike
-rm — znači da nakon što se kontejner zaustavi, briše sve što je stvoreno tokom svog života
-v "$PWD":/home/gradle/ — montira trenutni folder sa našim Android projektom u interni folder kontejnera /home/gradle/
-w /home/gradle — specificira radni direktorij kontejnera
android-build:5.4.1-28-27 — naziv našeg kontejnera koji smo prikupili
gradle assembleDebug — stvarni montažni tim koji sastavlja naš projekat

Ako sve prođe kako treba, onda ćete za par sekundi/minuta na svom ekranu vidjeti nešto slično USPJEŠNA GRADNJA za 8m 3s! A app/build/output/apk folder će sadržavati sastavljenu aplikaciju.

Na sličan način možete obavljati i druge gradle zadatke - provjeriti projekat, pokrenuti testove itd. Glavna prednost je da ako trebamo da izgradimo projekat na bilo kojoj drugoj mašini, ne moramo da brinemo o instalaciji čitavog okruženja i biće dovoljno da preuzmemo potrebnu sliku i pokrenemo build u njoj.

Kontejner ne pohranjuje nikakve promjene, a svaki sklop se pokreće od nule, što s jedne strane garantuje identitet sklopa bez obzira gdje je pokrenut, s druge strane svaki put kada morate preuzeti sve ovisnosti i ponovo kompajlirajte sav kod, a to ponekad može potrajati dosta vremena. Stoga, pored uobičajenog “hladnog” starta, imamo mogućnost pokretanja build-a uz spremanje tzv. “cache”, gdje spremamo ~/.gradle folder jednostavnim kopiranjem u radni folder projekta, a na početku sljedeće gradnje ga vraćamo nazad. Premjestili smo sve procedure kopiranja u zasebne skripte i sama naredba za pokretanje počela je izgledati ovako

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"

Kao rezultat toga, naše prosječno vrijeme izrade projekta je smanjeno nekoliko puta (u zavisnosti od broja zavisnosti od projekta, ali je prosječan projekat tako počeo da se sklapa za 1 minut umjesto za 5 minuta).

Sve ovo, naravno, ima smisla samo ako imate svoj interni CI/CD server, koji sami podržavate. Ali sada postoji mnogo usluga u oblaku u kojima su svi ovi problemi riješeni i ne morate brinuti o tome, a potrebna svojstva sklopa također se mogu odrediti u postavkama projekta.

Samo registrovani korisnici mogu učestvovati u anketi. Prijavite semolim.

Da li svoj CI/CD sistem držite u kući ili koristite uslugu treće strane?

  • Koristimo interni server

  • Koristimo eksterni servis

  • Ne koristimo CI/CD

  • Ostalo

Glasalo je 42 korisnika. Uzdržano je bilo 16 korisnika.

izvor: www.habr.com

Dodajte komentar