Android projekti kogumine Docker konteineris

Android platvormi jaoks projekti arendamisel, isegi kõige väiksema, tuleb varem või hiljem kokku puutuda arenduskeskkonnaga. Lisaks Android SDK-le on vajalik ka uusim versioon Kotlinist, Gradleist, platform-tools'ist ja build-tools'ist. Kui arendaja masinas lahendatakse kõik need sõltuvused peamiselt Android Studio IDE abil, siis CI/CD serveris võib iga värskendus muutuda peavaluks. Ja kui veebiarenduses on keskkonna probleemide lahendamise standardiks saanud Docker, siis miks mitte proovida sama probleemi lahendada ka Android-arenduses...

Neile, kes ei tea, mis on Docker — lihtsustatult öeldes on see tööriist, mis loob nn „konteinereid“, kuhu on kokku koondatud minimaalne operatsioonisüsteemi tuum ja vajalik tarkvarapakett, mida saame käivitada kus iganes, säilitades samal ajal keskkonna. Mis täpselt meie konteineris olema peab, määratakse Dockerfile'is, mis hiljem kokku pandakse pildiks, mida saab käitada kus iganes ja millel on idempotentsuse omadused.

Dokeri installimise ja põhialuste protsess on hästi dokumenteeritud selle ametlikul kodulehel. Seega, veidi ettevaatlikult, siin on meie Dockerfile, mis meil välja tuli

# Т.к. основным инструментом для сборки 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 Android-projekti kausta ja käivitame konteineri koostamise käsu

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. Me nimetasime selle android-build ja versioonis märkisime gradle, android-sdk ja platform-tools'i versioonide kogumi. Edaspidi on meil lihtsam otsida vajalikku pilti nime järgi, kasutades sellist „versiooni“.

Pärast edukat koostamist saame kasutada meie pilti kohalikult, saame selle üles laadida käsuga docker push avalikusse või privaatsete piltide hoidlasse, et alla laadida see teistesse masinatesse.

Näiteks, koostame kohaliku projekti. Selleks, projektikaustas käivitame käsu

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

Uurime, mida see tähendab:

docker run — käivitab pildi
-rm — tähistab, et konteineri peatamisel eemaldatakse kõik, mis selle elu jooksul loodi
-v "$PWD":/home/gradle/ — mountib praeguse kausta koos meie Android-projektiga konteineri siseruumidesse /home/gradle/
-w /home/gradle — määrab konteineri töökausta
android-build:5.4.1-28-27 — meie poolt kogutud konteineri nimi
gradle assembleDebug — ise asi, mis koostab meie projekti

Kui kõik läheb hästi, siis mõne sekundi või minuti pärast näete ekraanil midagi sellist BUILD SUCCESSFUL in 8m 3s! Ja kaustas app/build/output/apk on koosolek valmis rakendus.

Sarnaselt saab täita ka teisi gradle ülesandeid — projekti kontrollimist, testide käivitamist jne. Peamine eelis on see, et kui on vaja projekti koostada mõnes teises masinas, ei pea me muretsema kogu keskkonna installimise pärast ning piisab, kui alla laadida vajalik pilt ja käivitada selle sees koostamine.

Konteiner ei salvesta mingeid muudatusi ja iga koostamine algab nullist, mis ühelt poolt tagab koostamise identsuse sõltumata selle käitamise kohast, teiselt poolt tuleb iga kord alla laadida kõik sõltuvused ja kogu kood kompileerida uuesti, mis mõnikord võib võtta märkimisväärselt palju aega. Seetõttu on külma käivitamise kõrval meil ka võimalus käivitada koostamine nn „vahevara“ säilitamisega, kus salvestame kausta ~/ .gradle lihtsalt kopeerides selle projekti töökatalooge, ja järgmise koostamise alguses toome selle tagasi. Kõik kopeerimisprotseduurid oleme viinud eraldi skriptidesse ja meie käivitus käsk on nüüd kujul

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"

Kokkuvõttes on meie projekti keskmine koostamisaeg mitmeid kordi vähenenud (sõltuvalt projekti sõltuvustest, kuid keskmine projekt koostati nüüd 1 minutiga, mitte 5 minutiga).

See kõik on mõtet ainult siis, kui teil on oma sisemine CI/CD server, mille toetamisega te ise tegelete. Kuid praegu on palju pilveteenuseid, kus kõik need probleemid on lahendatud ja Te ei pea selle pärast muretsema ning vajalikud koostamisomadused saab samuti projektis seada.

Ainult registreeritud kasutajad saavad küsitluses osaleda. Logige sisse, palun.

Kas kasutate CI/CD süsteemi sise- või välist teenust?

  • Kasutame sisemist serverit

  • Kasutame välist teenust

  • Ei kasuta CI/CD-d

  • Muu

Hääletas 42 kasutajat. 16 kasutajat jäid erapooletuks.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster