Gradnja projekta Android v vsebniku Docker

Pri razvoju projekta za platformo Android, tudi najmanjšega, se moraš prej ali slej soočiti z razvojnim okoljem. Poleg Android SDK je potrebno imeti najnovejšo različico Kotlina, Gradle, platform-tools, build-tools. In če so na stroju razvijalca vse te odvisnosti v večji meri rešene s pomočjo Android Studio IDE, potem se lahko na strežniku CI/CD vsaka posodobitev spremeni v glavobol. In če je v spletnem razvoju Docker postal standardna rešitev problema okolja, zakaj potem ne bi poskusili rešiti podobnega problema v razvoju Android z njegovo pomočjo ...

Za tiste, ki ne vedo, kaj je Docker, poenostavljeno povedano, je orodje za ustvarjanje t.i. »kontejnerji«, ki vsebujejo minimalno jedro OS in potreben nabor programske opreme, ki jo lahko namestimo kamor koli želimo, pri tem pa ohranjamo okolje. Kaj natančno bo v našem vsebniku, določimo v datoteki Dockerfile, ki se nato sestavi v sliko, ki jo lahko zaženemo kjerkoli in ima lastnosti idempotence.

Postopek namestitve in osnove Dockerja so popolnoma opisani v njegovem uradna spletna stran. Torej, če pogledamo malo naprej, smo na koncu dobili to datoteko Docker:

# Т.к. основным инструментом для сборки 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"

Shranimo ga v mapo z našim Android projektom in z ukazom začnemo graditi vsebnik

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

Parameter -t določa oznako ali ime našega vsebnika, ki je običajno sestavljen iz njegovega imena in različice. V našem primeru smo to poimenovali android-build in v različici smo navedli nabor različic gradle, android-sdk in platform-tools. V prihodnosti bomo s to »različico« lažje iskali sliko, ki jo potrebujemo, po imenu.

Po končanem sestavljanju lahko svojo sliko uporabimo lokalno, prenesemo jo z ukazom Docker push v javno ali zasebno repozitorij slik, da jih prenesete na druge stroje.

Na primer, zgradimo projekt lokalno. Če želite to narediti, v mapi s projektom zaženite ukaz

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

Ugotovimo, kaj to pomeni:

Docker teče - sam ukaz za zagon slike
-rm — pomeni, da ko se vsebnik ustavi, izbriše vse, kar je bilo ustvarjeno v njegovem življenju
-v "$PWD":/home/gradle/ — priklopi trenutno mapo z našim projektom Android v mapo notranjega vsebnika /home/gradle/
-w /home/gradle — določa delovni imenik vsebnika
android-build: 5.4.1-28-27 — ime našega vsebnika, ki smo ga zbrali
gradle assembleDebug — dejanska montažna ekipa, ki sestavi naš projekt

Če gre vse v redu, boste čez nekaj sekund/minut na zaslonu videli nekaj podobnega GRADNJA USPEŠNA v 8m 3s! In mapa app/build/output/apk bo vsebovala sestavljeno aplikacijo.

Na podoben način lahko izvajate druge naloge gradle - preverite projekt, zaženete teste itd. Glavna prednost je, da če moramo zgraditi projekt na katerem koli drugem stroju, nam ni treba skrbeti za namestitev celotnega okolja in bo dovolj, da prenesemo potrebno sliko in v njej zaženemo gradnjo.

Vsebnik ne shranjuje nobenih sprememb in vsak sklop se zažene iz nič, kar po eni strani zagotavlja identiteto sklopa ne glede na to, kje je zagnan, po drugi strani pa morate vsakič prenesti vse odvisnosti in znova prevedite vso kodo, kar lahko včasih traja precej časa. Zato imamo poleg običajnega “hladnega” zagona možnost zagona gradnje ob shranjevanju t.i. “cache”, kamor mapo ~/.gradle shranimo tako, da jo enostavno prekopiramo v delovno mapo projekta in jo na začetku naslednje gradnje vrnemo nazaj. Vse postopke kopiranja smo premaknili v ločene skripte in sam ukaz za zagon je začel izgledati takole

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"

Posledično se je naš povprečni čas gradnje projekta večkrat zmanjšal (odvisno od števila odvisnosti od projekta, vendar se je povprečni projekt tako začel sestavljati v 1 minuti namesto v 5 minutah).

Vse to je seveda smiselno le, če imate svoj interni CI/CD strežnik, ki ga podpirate sami. Toda zdaj obstaja veliko storitev v oblaku, v katerih so vse te težave rešene in vam ni treba skrbeti, potrebne lastnosti sklopa pa lahko določite tudi v nastavitvah projekta.

V anketi lahko sodelujejo samo registrirani uporabniki. Prijaviti se, prosim.

Ali imate svoj sistem CI/CD doma ali uporabljate storitev tretje osebe?

  • Uporabljamo interni strežnik

  • Uporabljamo zunanjo storitev

  • Ne uporabljamo CI/CD

  • Drugo

Glasovalo je 42 uporabnikov. 16 uporabnikov se je vzdržalo.

Vir: www.habr.com

Dodaj komentar