Androidi projekti loomine Dockeri konteineris

Androidi platvormile projekti arendades, ka kõige väiksemat, tuleb varem või hiljem tegeleda arenduskeskkonnaga. Lisaks Android SDK-le on vajalik Kotlini, Gradle'i, platform-tööriistade, ehitustööriistade uusim versioon. Ja kui arendaja masinas lahendatakse kõik need sõltuvused suuremal määral Android Studio IDE abil, siis CI / CD serveris võib iga värskendus muutuda peavaluks. Ja kui veebiarenduses on Dockerist saanud keskkonnaprobleemi standardlahendus, siis miks mitte proovida sellega sarnast probleemi Androidi arenduses lahendada...

Neile, kes ei tea, mis on Docker - kui see on üsna lihtne, siis see on tööriist nn. "Konteinerid", mis sisaldavad minimaalset OS-i tuuma ja vajalikku tarkvarakomplekti, mida saame juurutada kõikjal, kus soovime, säilitades samal ajal keskkonda. Mis täpselt meie konteinerisse saab, määratakse Dockerfile'is, mis seejärel koondatakse kujutiseks, mida saab käivitada kõikjal ja millel on idempotentsuse omadused.

Installimisprotsess ja Dockeri põhitõed on tema peal ilusti kirjeldatud ametlikul kodulehel. Seega, vaadates veidi ettepoole, on meil selline Dockerfile

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

Salvestame selle oma Androidi projektiga kausta ja alustame käsuga konteineri ehitamist

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

Parameeter -t määrab meie konteineri sildi või nime, mis tavaliselt koosneb selle nimest ja versioonist. Meie puhul nimetasime seda android-buildiks ja versioonis määrasime kombinatsiooni gradle, android-sdk ja platform-tools versioonidest. Edaspidi on meil sellise “versiooni” abil lihtsam endale vajalikku pilti nime järgi otsida.

Pärast ehituse läbimist saame oma pilti kasutada kohapeal, saame selle käsuga alla laadida doki lükkamine avalikku või privaatsesse pildihoidlasse, et see teistesse masinatesse alla laadida.

Näiteks ehitame kohaliku projekti. Selleks käivitage projekti kaustas käsk

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

Mõelgem välja, mida see tähendab:

dock käivitada - pildi käivitamise käsk ise
-rm - tähendab, et pärast konteineri seiskamist kustutab see kõik, mis selle eluea jooksul loodi
-v "$PWD":/home/gradle/ - ühendab praeguse kausta meie Androidi projektiga konteineri sisemisse kausta /home/gradle/
-w /kodu/klass - määrab konteineri töökataloogi
android-build: 5.4.1-28-27 - meie kogutud konteineri nimi
gradle assembleDebug - ehitusmeeskond ise, kes paneb meie projekti kokku

Kui kõik läheb hästi, näete mõne sekundi / minuti pärast midagi sellist EHITUS EDUKALT 8m 3s! Ja kaustas app/build/output/apk on kokkupandud rakendus.

Samamoodi saate teha muid gradle'i ülesandeid - kontrollida projekti, käivitada teste jne. Peamine eelis on see, et kui meil on vaja projekt ehitada mõnele teisele masinale, ei pea me muretsema kogu keskkonna installimise pärast ja piisab, kui laadime alla vajaliku pildi ja käivitame selles build.

Konteiner ei salvesta muudatusi ja iga koost käivitatakse nullist, mis ühest küljest tagab koostu identiteedi sõltumata selle käivitamise kohast, teisalt iga kord, kui peate kõik sõltuvused alla laadima ja kompileerige kogu kood uuesti ning see võib mõnikord võtta palju aega. Seetõttu on meil lisaks tavapärasele "külmkäivitamisele" võimalus käivitada montaaž, säilitades nn. "vahemälu", kuhu salvestame kausta ~/.gradle, kopeerides selle lihtsalt projekti töökausta ja järgmise järgu alguses tagastame selle tagasi. Teisaldasime kõik kopeerimisprotseduurid eraldi skriptidesse ja käivituskäsk ise hakkas välja nägema selline

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"

Selle tulemusena vähenes projekti keskmine ehitamise aeg mitu korda (olenevalt projektist sõltuvate sõltuvuste arvust, kuid keskmine projekt hakkas seega 1 minuti asemel 5 minutiga valmima).

See kõik on iseenesest mõttekas ainult siis, kui teil on oma sisemine CI / CD server, mida te ise toetate. Kuid nüüd on palju pilveteenuseid, milles kõik need probleemid on lahendatud ja te ei pea selle pärast muretsema ning vajalikud ehitusomadused saab määrata ka projekti seadetes.

Küsitluses saavad osaleda ainult registreerunud kasutajad. Logi sissepalun.

Kas hoiate oma CI/CD süsteemi sees või kasutate kolmanda osapoole teenust?

  • Siseserveri kasutamine

  • Välise teenuse kasutamine

  • Me ei kasuta CI/CD-d

  • muu

42 kasutajat hääletas. 16 kasutajat jäi erapooletuks.

Allikas: www.habr.com

Lisa kommentaar