„Android“ projekto kūrimas „Docker“ konteineryje

Kuriant projektą Android platformai, net ir mažiausią, anksčiau ar vėliau tenka susitvarkyti su kūrimo aplinka. Be Android SDK, būtina turėti naujausią Kotlin, Gradle, platform-tools, build-tools versiją. Ir jei kūrėjo kompiuteryje visos šios priklausomybės yra labiau išspręstos naudojant „Android Studio IDE“, tada CI / CD serveryje kiekvienas atnaujinimas gali virsti galvos skausmu. Ir jei kuriant žiniatinklio svetainę „Docker“ tapo standartiniu aplinkos problemos sprendimu, tai kodėl gi nepabandžius išspręsti panašios „Android“ kūrimo problemos naudojant jį...

Nežinantiems, kas yra Docker, paprasčiau tariant, tai įrankis, skirtas sukurti vadinamąjį. „konteineriai“, kuriuose yra minimalus OS branduolys ir reikalingas programinės įrangos rinkinys, kurį galime įdiegti kur tik norime, kartu tausojant aplinką. Kas tiksliai bus mūsų konteineryje, nustatoma Dockerfile, kuris vėliau surenkamas į vaizdą, kurį galima paleisti bet kur ir kuris turi idempotencijos savybes.

„Docker“ diegimo procesas ir pagrindai puikiai aprašyti jo dokumente oficiali svetainė. Todėl, žvelgiant šiek tiek į priekį, tai yra Dockerfile, su kuriuo mes baigėsi:

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

Išsaugome jį aplanke su „Android“ projektu ir pradedame kurti konteinerį su komanda

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

Parametras -t nurodo mūsų sudėtinio rodinio žymą arba pavadinimą, kurį paprastai sudaro jo pavadinimas ir versija. Mūsų atveju mes tai pavadinome „android-build“, o versijoje nurodėme „gradle“, „android-sdk“ ir platformos įrankių rinkinį. Ateityje mums bus lengviau ieškoti reikalingo vaizdo pagal pavadinimą, naudojant šią „versiją“.

Baigę surinkimą, galime naudoti savo atvaizdą vietoje, galime jį atsisiųsti naudodami komandą doko stumti į viešą ar privačią vaizdų saugyklą, kad atsisiųstumėte jį į kitus įrenginius.

Pavyzdžiui, sukurkime projektą vietoje. Norėdami tai padaryti, aplanke su projektu paleiskite komandą

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

Išsiaiškinkime, ką tai reiškia:

Docker paleisti - pati vaizdo paleidimo komanda
-rm — reiškia, kad konteineriui sustojus jis ištrina viską, kas buvo sukurta per jo gyvavimo laikotarpį
-v "$PWD":/home/gradle/ - prijungia dabartinį aplanką su mūsų Android projektu į vidinį konteinerio aplanką /home/gradle/
-w /namai/gradle — nurodo konteinerio darbinį katalogą
Android-build:5.4.1-28-27 - mūsų surinkto konteinerio pavadinimas
gradle assembleDebug - tikroji surinkimo komanda, kuri surenka mūsų projektą

Jei viskas klostysis gerai, po poros sekundžių/minučių ekrane pamatysite kažką panašaus SĖKMINGAI PASTATYK per 8m 3s! O aplanke programa/build/output/apk bus surinkta programa.

Panašiai galite atlikti ir kitas gradle užduotis – patikrinti projektą, vykdyti testus ir pan. Pagrindinis privalumas yra tas, kad jei mums reikia kurti projektą bet kurioje kitoje mašinoje, mums nereikia rūpintis visos aplinkos įdiegimu ir užteks atsisiųsti reikiamą vaizdą ir paleisti statybą jame.

Konteineris nesaugo jokių pakeitimų, o kiekvienas agregatas paleidžiamas nuo nulio, o tai, viena vertus, garantuoja agregato tapatybę nepriklausomai nuo to, kur jis paleidžiamas, kita vertus, kiekvieną kartą, kai reikia atsisiųsti visas priklausomybes. ir dar kartą sukompiliuokite visą kodą, o tai kartais gali užtrukti daug laiko. Todėl, be įprasto „šalto“ paleidimo, turime galimybę pradėti statybą išsaugant vadinamąjį. „cache“, kur išsaugome ~/.gradle aplanką tiesiog nukopijuodami jį į projekto darbo aplanką, o kitos versijos pradžioje grąžiname jį atgal. Visas kopijavimo procedūras perkėlėme į atskirus scenarijus ir pati paleidimo komanda pradėjo atrodyti taip

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"

Dėl to mūsų vidutinis projekto kūrimo laikas sutrumpėjo kelis kartus (priklausomai nuo priklausomybių nuo projekto skaičiaus, tačiau vidutinis projektas buvo pradėtas surinkti per 1 minutę, o ne per 5 minutes).

Visa tai, žinoma, prasminga tik tuo atveju, jei turite savo vidinį CI/CD serverį, kurį palaikote patys. Tačiau dabar yra daugybė debesų paslaugų, kuriose visos šios problemos yra išspręstos ir jums nereikia dėl to rūpintis, o reikiamas surinkimo savybes taip pat galima nurodyti projekto nustatymuose.

Apklausoje gali dalyvauti tik registruoti vartotojai. Prisijungti, Prašau.

Ar laikote savo CI/CD sistemą savo viduje ar naudojatės trečiosios šalies paslaugomis?

  • Mes naudojame vidinį serverį

  • Naudojamės išorine paslauga

  • Mes nenaudojame CI / CD

  • Kitas

Balsavo 42 vartotojai. 16 vartotojų susilaikė.

Šaltinis: www.habr.com

Добавить комментарий