Izrada Android projekta u Docker spremniku

Kada razvijate projekt za Android platformu, čak i onaj najmanji, prije ili kasnije morate se suočiti s razvojnim okruženjem. Uz Android SDK potrebno je imati najnoviju verziju Kotlina, Gradle, platform-tools, build-tools. A ako se na stroju programera sve te ovisnosti u većoj mjeri rješavaju pomoću Android Studio IDE-a, tada se na CI/CD poslužitelju svako ažuriranje može pretvoriti u glavobolju. A ako je u web razvoju Docker postao standardno rješenje za problem okruženja, zašto onda ne pokušati riješiti sličan problem u Android razvoju pomoću njega...

Za one koji ne znaju što je Docker, pojednostavljeno rečeno, to je alat za kreiranje tzv. “kontejnera” koji sadrže minimalnu jezgru OS-a i potreban set softvera koji možemo postaviti gdje god želimo, a da pritom sačuvamo okoliš. Što će se točno nalaziti u našem spremniku određuje se u Dockerfileu, koji se potom sastavlja u sliku koja se može pokrenuti bilo gdje i ima svojstva idempotencije.

Proces instalacije i osnove Dockera savršeno su opisani u njegovom službene web stranice. 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 mapu s našim Android projektom i počinjemo graditi spremnik s naredbom

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

Parametar -t specificira oznaku ili naziv našeg spremnika, koji se obično sastoji od njegovog naziva i verzije. U našem slučaju, nazvali smo ga android-build i u verziji smo naznačili skup verzija gradle, android-sdk i platform-tools. Ubuduće će nam biti lakše tražiti sliku koja nam je potrebna po imenu pomoću ove "verzije".

Nakon što je montaža završena, našu sliku možemo koristiti lokalno, možemo je preuzeti naredbom docker push u javno ili privatno spremište slika kako biste ih preuzeli na druga računala.

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

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

Shvatimo što to znači:

vožnja dvoranom - sama naredba za pokretanje slike
-rm — znači da nakon što se spremnik zaustavi, briše sve što je stvoreno tijekom njegovog života
-v "$PWD":/home/gradle/ — montira trenutnu mapu s našim Android projektom u internu mapu spremnika /home/gradle/
-w /home/gradle — specificira radni direktorij spremnika
android-build: 5.4.1-28-27 — naziv našeg kontejnera koji smo prikupili
gradle assembleDebug — stvarni montažni tim koji sastavlja naš projekt

Ako sve bude u redu, za nekoliko sekundi/minuta vidjet ćete na ekranu nešto poput IZGRADNJA USPJEŠNA za 8m 3s! A mapa app/build/output/apk sadržavat će sastavljenu aplikaciju.

Na sličan način možete izvršiti i druge gradle zadatke - provjeriti projekt, pokrenuti testove itd. Glavna prednost je da ako trebamo izgraditi projekt na bilo kojem drugom stroju, ne moramo brinuti o instaliranju cijele okoline i bit će dovoljno preuzeti potrebnu sliku i pokrenuti izgradnju u njoj.

Kontejner ne pohranjuje nikakve promjene, a svaki sklop se pokreće ispočetka, što s jedne strane jamči identitet sklopa bez obzira na to gdje je pokrenut, s druge strane, svaki put kada morate preuzeti sve ovisnosti i ponovno kompajlirajte sav kod, a to ponekad može potrajati dosta vremena. Dakle, osim uobičajenog “hladnog” starta, imamo mogućnost pokretanja izgradnje uz spremanje tzv. “cache”, gdje spremamo mapu ~/.gradle jednostavnim kopiranjem u radnu mapu projekta, te je na početku sljedećeg builda vraćamo natrag. Premjestili smo sve postupke 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 izgradnje projekta smanjeno je nekoliko puta (ovisno o broju ovisnosti o projektu, ali se prosječni projekt tako počeo sastavljati za 1 minutu umjesto za 5 minuta).

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

U anketi mogu sudjelovati samo registrirani korisnici. Prijaviti se, molim.

Držite li svoj CI/CD sustav kod kuće ili koristite uslugu treće strane?

  • Koristimo interni poslužitelj

  • Koristimo vanjsku uslugu

  • Ne koristimo CI/CD

  • Drugi

Glasovalo je 42 korisnika. Suzdržano je bilo 16 korisnika.

Izvor: www.habr.com

Dodajte komentar