Vytvorenie projektu pre Android v kontajneri Docker

Pri vývoji projektu pre platformu Android, aj toho najmenšieho, sa skôr či neskôr musíte popasovať s vývojovým prostredím. Okrem Android SDK je potrebné mať najnovšiu verziu Kotlin, Gradle, platform-tools, build-tools. A ak sa na vývojárskom stroji všetky tieto závislosti riešia vo väčšej miere pomocou Android Studio IDE, potom sa na serveri CI / CD môže každá aktualizácia zmeniť na bolesť hlavy. A ak sa pri vývoji webu Docker stal štandardným riešením problému životného prostredia, tak prečo sa s ním nepokúsiť vyriešiť podobný problém vo vývoji Android ...

Pre tých, ktorí nevedia, čo je Docker – ak je to celkom jednoduché, tak toto je nástroj na vytváranie tzv. „Kontajnery“, ktoré obsahujú minimálne jadro OS a potrebnú sadu softvéru, ktorý môžeme nasadiť kdekoľvek chceme, pri zachovaní prostredia. Čo presne bude v našom kontajneri, sa určuje v súbore Dockerfile, ktorý sa potom zostaví do obrazu, ktorý sa dá spustiť kdekoľvek a má vlastnosti idempotencie.

Proces inštalácie a základy Dockera sú na ňom krásne popísané oficiálne internetové stránky. Preto, keď sa pozrieme trochu dopredu, máme taký 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"

Uložíme ho do priečinka s naším projektom pre Android a pomocou príkazu začneme zostavovať kontajner

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

Parameter -t nastavuje značku alebo názov nášho kontajnera, ktorý sa zvyčajne skladá z jeho názvu a verzie. V našom prípade sme to nazvali android-build a vo verzii sme špecifikovali kombináciu verzií gradle, android-sdk a platform-tools. V budúcnosti bude pre nás jednoduchšie vyhľadať požadovaný obrázok podľa názvu pomocou takejto „verzie“.

Po dokončení zostavy môžeme náš obrázok použiť lokálne, môžeme si ho stiahnuť príkazom docker push do verejného alebo súkromného úložiska obrázkov, aby ste ich mohli stiahnuť do iných počítačov.

Ako príklad si postavme lokálny projekt. Ak to chcete urobiť, v priečinku projektu spustite príkaz

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

Poďme zistiť, čo to znamená:

docker run - samotný príkaz na spustenie obrázka
-rm - znamená, že po zastavení nádoba vymaže všetko, čo počas jej životnosti vzniklo
-v "$PWD":/home/gradle/ - pripojí aktuálny priečinok s naším projektom Android do interného priečinka kontajnera /home/gradle/
-w /home/gradle - nastaví pracovný adresár kontajnera
zostava pre android: 5.4.1-28-27 - názov našej nádoby, ktorú sme nazbierali
gradle assembleDebug - samotný stavebný tím, ktorý zostavuje náš projekt

Ak všetko pôjde dobre, po niekoľkých sekundách / minútach uvidíte niečo podobné VYSTAVAŤ ÚSPEŠNE za 8m 3s! A v priečinku app/build/output/apk bude zostavená aplikácia.

Podobne môžete vykonávať ďalšie gradle úlohy – kontrolovať projekt, spúšťať testy atď. Hlavnou výhodou je, že ak potrebujeme projekt postaviť na akomkoľvek inom stroji, nemusíme sa starať o inštaláciu celého prostredia a bude stačiť stiahnuť potrebný obraz a spustiť build v ňom.

Kontajner neukladá žiadne zmeny a každá zostava sa spúšťa od začiatku, čo na jednej strane zaručuje identitu zostavy bez ohľadu na to, kde je spustená, na druhej strane zakaždým, keď si musíte stiahnuť všetky závislosti a znova skompilovať celý kód, čo môže niekedy trvať veľa času. Preto máme okrem bežného „studeného“ štartu možnosť spustenia montáže pri zachovaní tzv. „cache“, kde priečinok ~/.gradle jednoduchým skopírovaním do pracovného priečinka projektu uložíme a na začiatku ďalšieho zostavenia ho vrátime späť. Všetky procedúry kopírovania sme presunuli do samostatných skriptov a samotný príkaz na spustenie začal vyzerať takto

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"

V dôsledku toho sa priemerný čas výstavby projektu niekoľkonásobne skrátil (v závislosti od počtu závislostí na projekte, ale priemerný projekt sa tak začal stavať za 1 minútu namiesto 5 minút).

To všetko samo osebe má zmysel len vtedy, ak máte vlastný interný CI / CD server, ktorý sami podporujete. Teraz však existuje veľa cloudových služieb, v ktorých sú všetky tieto problémy vyriešené a nemusíte sa o to starať a potrebné vlastnosti zostavy je možné špecifikovať aj v nastaveniach projektu.

Do prieskumu sa môžu zapojiť iba registrovaní užívatelia. Prihlásiť saProsím.

Ponechávate si systém CI/CD interný alebo používate službu tretej strany

  • Použitie interného servera

  • Pomocou externej služby

  • Nepoužívame CI/CD

  • Ďalšie

Hlasovalo 42 užívateľov. 16 užívateľov sa zdržalo hlasovania.

Zdroj: hab.com

Pridať komentár