Android projekta izveide Docker konteinerā

Izstrādājot projektu Android platformai, pat vismazāko, agri vai vēlu nākas saskarties ar izstrādes vidi. Papildus Android SDK ir nepieciešama jaunākā Kotlin versija, Gradle, platformas rīki, veidošanas rīki. Un, ja izstrādātāja mašīnā visas šīs atkarības tiek lielākā mērā atrisinātas, izmantojot Android Studio IDE, tad CI / CD serverī katrs atjauninājums var pārvērsties par galvassāpēm. Un, ja tīmekļa izstrādē Docker ir kļuvis par standarta risinājumu vides problēmai, tad kāpēc gan nemēģināt ar to atrisināt līdzīgu problēmu Android izstrādē ...

Tiem, kas nezina, kas ir Docker – ja tas ir pavisam vienkārši, tad šis ir rīks t.s. "Konteineri", kas satur minimālo OS kodolu un nepieciešamo programmatūras komplektu, ko varam izvietot, kur vien vēlamies, vienlaikus saglabājot vidi. Kas tieši atradīsies mūsu konteinerā, tiek noteikts Dockerfile, kas pēc tam tiek samontēts attēlā, kuru var palaist jebkurā vietā un kuram ir idempotences īpašības.

Instalēšanas process un Docker pamati ir skaisti aprakstīti viņa datorā oficiālā vietne. Tāpēc, nedaudz skatoties uz priekšu, mums ir šāds 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"

Mēs to saglabājam mapē ar mūsu Android projektu un sākam veidot konteineru ar komandu

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

Parametrs -t iestata mūsu konteinera tagu vai nosaukumu, kas parasti sastāv no tā nosaukuma un versijas. Mūsu gadījumā mēs to saucām par android-build un versijā norādījām gradle, android-sdk un platform-tools versiju kombināciju. Nākotnē mums būs vieglāk meklēt vajadzīgo attēlu pēc nosaukuma, izmantojot šādu “versiju”.

Kad būvēšana ir pabeigta, mēs varam izmantot mūsu attēlu lokāli, mēs varam to lejupielādēt ar komandu docker push uz publisku vai privātu attēlu krātuvi, lai to lejupielādētu citās iekārtās.

Piemēram, izveidosim vietējo projektu. Lai to izdarītu, projekta mapē palaidiet komandu

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

Noskaidrosim, ko tas nozīmē:

docker palaist - pati attēla palaišanas komanda
-rm - nozīmē, ka pēc konteinera apturēšanas tas izdzēš visu, kas tika izveidots tā dzīves laikā
-v "$PWD":/home/gradle/ - pievieno pašreizējo mapi ar mūsu Android projektu konteinera iekšējai mapei /home/gradle/
-w /mājas/gradle - iestata konteinera darba direktoriju
android-build: 5.4.1-28-27 - mūsu savāktā konteinera nosaukums
gradle assembleDebug - pati būvēšanas komanda, kas komplektē mūsu projektu

Ja viss iet labi, tad pēc pāris sekundēm/minūtēm jūs redzēsit kaut ko līdzīgu VEIKSMĪGA BŪVE 8 m 3 s! Un mapē app/build/output/apk būs samontēta aplikācija.

Līdzīgi varat veikt citus gradle uzdevumus - pārbaudīt projektu, palaist testus utt. Galvenā priekšrocība ir tā, ka, ja mums projekts ir jāveido uz jebkuras citas mašīnas, mums nav jāuztraucas par visas vides instalēšanu, un pietiks, lai lejupielādētu nepieciešamo attēlu un palaistu būvējumu tajā.

Konteiners neuzglabā nekādas izmaiņas, un katrs komplekts tiek palaists no nulles, kas, no vienas puses, garantē montāžas identitāti neatkarīgi no tā palaišanas vietas, no otras puses, katru reizi, kad jums ir jālejupielādē visas atkarības. un vēlreiz apkopojiet visu kodu, un tas dažkārt var aizņemt ievērojamu laiku. Līdz ar to papildus parastajam "aukstajam" startam mums ir iespēja uzsākt montāžu, saglabājot t.s. "kešatmiņa", kur mēs saglabājam ~/.gradle mapi, vienkārši nokopējot to uz projekta darba mapi, un nākamās versijas sākumā atgriežam to atpakaļ. Mēs pārvietojām visas kopēšanas procedūras atsevišķos skriptos, un pati palaišanas komanda sāka izskatīties šādi

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"

Rezultātā vidējais projekta izveides laiks tika samazināts vairākas reizes (atkarībā no atkarību skaita no projekta, taču vidējais projekts tādējādi sāka būvēt 1 minūtē, nevis 5 minūtēs).

Tam visam ir jēga tikai tad, ja jums ir savs iekšējais CI / CD serveris, kuru jūs pats atbalstāt. Taču tagad ir daudz mākoņpakalpojumu, kuros visas šīs problēmas tiek atrisinātas un par to nav jāuztraucas, kā arī projekta iestatījumos var norādīt nepieciešamos būvēšanas rekvizītus.

Aptaujā var piedalīties tikai reģistrēti lietotāji. Ielogoties, lūdzu.

Vai saglabājat savu CI/CD sistēmu vai izmantojat trešās puses pakalpojumu

  • Izmantojot iekšējo serveri

  • Izmantojot ārēju pakalpojumu

  • Mēs neizmantojam CI/CD

  • Cits

Nobalsoja 42 lietotāji. 16 lietotāji atturējās.

Avots: www.habr.com

Pievieno komentāru