Custruì un prughjettu Android in un containeru Docker

Quandu si sviluppa un prughjettu per a piattaforma Android, ancu u più chjucu, prima o dopu avete da trattà cù l'ambiente di sviluppu. In più di u SDK Android, hè necessariu avè l'ultima versione di Kotlin, Gradle, platform-tools, build-tools. È se in a macchina di u sviluppatore tutte queste dipendenze sò risolte in una misura più grande utilizendu l'IDE Android Studio, allora nantu à u servore CI / CD, ogni aghjurnamentu pò trasfurmà in un mal di testa. E se in u sviluppu web, Docker hè diventatu a suluzione standard per u prublema di l'ambiente, allora perchè ùn pruvate micca di risolve un prublema simili in u sviluppu Android ...

Per quelli chì ùn sanu micca ciò chì Docker hè - s'ellu hè abbastanza simplice, allora questu hè un strumentu per creà u cusì chjamatu. "Containers" chì cuntenenu u minimu kernel OS è u settore necessariu di software chì pudemu implementà induve vulemu, mantenendu l'ambiente. Ciò chì serà esattamente in u nostru cuntinuu hè determinatu in u Dockerfile, chì hè poi assemblatu in una maghjina chì pò esse lanciata in ogni locu è hà proprietà di idempotenza.

U prucessu di stallazione è i principii di Docker sò belli descritti nantu à u so situ ufficiali. Dunque, fighjendu un pocu avanti, avemu un tali 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"

Salvemu à u cartulare cù u nostru prughjettu Android è cumincià à custruisce u cuntinuu cù u cumandamentu

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

Parameter -t stabilisce l'etichetta o u nome di u nostru containeru, chì generalmente hè custituitu da u so nome è a versione. In u nostru casu, avemu chjamatu android-build è in a versione avemu specificatu una cumminazione di versioni di gradle, android-sdk è platform-tools. In u futuru, serà più faciule per noi di circà l'imaghjini chì avemu bisognu per nome cù una tale "versione".

Dopu chì a custruzione hà passatu, pudemu usà a nostra maghjina in u locu, pudemu scaricà cù u cumandamentu spinta di docker à un repository d'imaghjini publicu o privatu per scaricà lu in altre macchine.

Per esempiu, custruemu un prughjettu lucale. Per fà questu, in u cartulare di u prughjettu, eseguite u cumandimu

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

Scupritemu ciò chì significa:

docker run - u cumandamentu di lanciamentu di l'imagine stessu
- rm - significa chì dopu avè firmatu u cuntinuu, sguassate tuttu ciò chì hè statu creatu durante a so vita
-v "$PWD":/home/gradle/ - monta u cartulare attuale cù u nostru prughjettu Android à u cartulare internu di u containeru /home/gradle/
-w /casa/gradle - stabilisce u cartulare di travagliu di u containeru
Android-build: 5.4.1-28-27 - u nome di u nostru containeru chì avemu cullatu
gradle assembleDebug - a squadra di custruzzione stessu, chì assemble u nostru prughjettu

Se tuttu va bè, dopu un paru di sicondi / minuti vi vede qualcosa cum'è COSTRUIRE SUCCESSU in 8m 3s! È in u cartulare app/build/output/apk ci sarà una applicazione assemblata.

In listessu modu, pudete eseguisce altre attività gradle - verificate u prughjettu, eseguite testi, etc. U vantaghju principali hè chì, se avemu bisognu di custruisce u prughjettu nantu à qualsiasi altra macchina, ùn avemu micca bisognu di preoccupassi di installà tuttu l'ambiente, è basta à scaricà l'imaghjini necessarii è eseguisce a custruzzione in questu.

U cuntinuu ùn guardà micca cambiamenti, è ogni assemblea hè lanciata da zero, chì, da una banda, guarantisci l'identità di l'assemblea indipendendu da induve hè lanciata, da l'altra banda, ogni volta chì avete da scaricà tutte e dipendenze. è compilà tuttu u codice di novu, è questu pò piglià qualchì volta una quantità significativa di tempu. Per quessa, in più di l'iniziu "freddu" di solitu, avemu l'opzione di principià l'assemblea mentre mantene u cusì chjamatu. "cache", induve salvemu u cartulare ~/.gradle simpliciamente cupiendu in u cartulare di travagliu di u prughjettu, è à u principiu di a prossima custruzzione, u turnemu torna. Avemu spustatu tutte e prucedure di copia in script separati è u cumandamentu di lanciamentu stessu hà cuminciatu à vede cusì

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"

In u risultatu, u tempu mediu di custruzzione di u prughjettu hè stata ridutta da parechje volte (sicondu u numeru di dependenzii nantu à u prugettu, ma u prughjettu mediu cusì hà cuminciatu à custruisce in 1 minutu invece di 5 minuti).

Tuttu chistu per sè stessu hè sensu solu s'ellu avete u vostru propiu servitore CI / CD internu, chì voi stessu sustene. Ma avà ci sò parechji servizii di nuvola in quale tutti issi prublemi sò risolti è ùn avete micca bisognu di preoccupari, è e pruprietà di custruzzione necessarie ponu ancu esse specificate in i paràmetri di u prugettu.

Solu l'utilizatori registrati ponu participà à l'indagine. Firmà lu, per piacè.

Mantene u vostru sistema CI / CD internu o utilizate un serviziu di terzu

  • Utilizà un servitore internu

  • Utilizà un serviziu esternu

  • Ùn avemu micca aduprà CI / CD

  • Altru

42 utilizatori anu vutatu. 16 utilizatori si sò astenuti.

Source: www.habr.com

Add a comment