Construir un projecte Android en un contenidor Docker

Quan es desenvolupa un projecte per a la plataforma Android, fins i tot el més petit, tard o d'hora t'has de fer front a l'entorn de desenvolupament. A més de l'SDK d'Android, cal tenir la darrera versió de Kotlin, Gradle, platform-tools, build-tools. I si a la màquina del desenvolupador totes aquestes dependències es resolen en major mesura mitjançant l'IDE d'Android Studio, al servidor CI / CD, cada actualització es pot convertir en un mal de cap. I si en el desenvolupament web, Docker s'ha convertit en la solució estàndard al problema del medi ambient, per què no intentar resoldre un problema similar amb ell en el desenvolupament d'Android...

Per a aquells que no sàpiguen què és Docker, si és bastant senzill, aquesta és una eina per crear l'anomenat. "Contenidors" que contenen el nucli mínim del sistema operatiu i el conjunt de programari necessari que podem desplegar allà on vulguem, mantenint l'entorn. El que hi haurà exactament al nostre contenidor es determina al Dockerfile, que després s'assembla en una imatge que es pot llançar a qualsevol lloc i té propietats d'idempotència.

El procés d'instal·lació i els fonaments bàsics de Docker es descriuen molt bé al seu lloc web oficial. Per tant, mirant una mica endavant, tenim un 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"

El desem a la carpeta amb el nostre projecte Android i comencem a construir el contenidor amb l'ordre

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

Paràmetre -t estableix l'etiqueta o el nom del nostre contenidor, que normalment consta del seu nom i versió. En el nostre cas, l'hem anomenat android-build i a la versió vam especificar una combinació de versions gradle, android-sdk i platform-tools. En el futur, ens serà més fàcil cercar la imatge que necessitem pel nom amb aquesta "versió".

Després de la compilació, podem utilitzar la nostra imatge localment, la podem descarregar amb l'ordre empenta docker a un dipòsit d'imatges públic o privat per descarregar-lo a altres màquines.

Com a exemple, construïm un projecte local. Per fer-ho, a la carpeta del projecte, executeu l'ordre

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

Anem a esbrinar què vol dir:

corredera - l'ordre d'inici de la imatge en si
-rm - significa que després d'aturar el contenidor, elimina tot el que s'ha creat durant la seva vida
-v "$PWD":/home/gradle/ - munta la carpeta actual amb el nostre projecte Android a la carpeta interna del contenidor /home/gradle/
-w /home/gradle - estableix el directori de treball del contenidor
Android-build: 5.4.1-28-27 - el nom del nostre contenidor que hem recollit
gradle assembleDebug - el propi equip de construcció, que munta el nostre projecte

Si tot va bé, després d'un parell de segons / minuts veureu alguna cosa així CONSTRUCCIÓ EXITOSA en 8m 3s! I a la carpeta app/build/output/apk hi haurà una aplicació muntada.

De la mateixa manera, podeu realitzar altres tasques de grau: comprovar el projecte, executar proves, etc. El principal avantatge és que si hem de construir el projecte en qualsevol altra màquina, no ens hem de preocupar d'instal·lar tot l'entorn, i n'hi haurà prou amb descarregar la imatge necessària i executar-hi la compilació.

El contenidor no emmagatzema cap canvi, i cada muntatge es llança des de zero, cosa que, d'una banda, garanteix la identitat del muntatge independentment d'on es llanci, de l'altra, cada vegada que cal descarregar totes les dependències. i compilar tot el codi de nou, i això de vegades pot trigar molt de temps. Per tant, a més de l'habitual arrencada "en fred", tenim l'opció d'iniciar el muntatge mantenint l'anomenat. "cache", on desem la carpeta ~/.gradle simplement copiant-la a la carpeta de treball del projecte, i al començament de la següent compilació la tornem. Vam traslladar tots els procediments de còpia a scripts separats i l'ordre d'inici va començar a semblar així

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"

Com a resultat, el temps mitjà de construcció del projecte es va reduir diverses vegades (segons el nombre de dependències del projecte, però el projecte mitjà va començar a construir-se en 1 minut en lloc de 5 minuts).

Tot això per si sol només té sentit si teniu el vostre propi servidor CI/CD intern, que vosaltres mateixos doneu suport. Però ara hi ha molts serveis al núvol en què tots aquests problemes es resolen i no us haureu de preocupar, i les propietats de construcció necessàries també es poden especificar a la configuració del projecte.

Només els usuaris registrats poden participar en l'enquesta. Inicia sessiósi us plau.

Manteniu el vostre sistema CI/CD intern o utilitzeu un servei de tercers

  • Utilitzant un servidor intern

  • Ús d'un servei extern

  • No fem servir CI/CD

  • Un altre

Han votat 42 usuaris. 16 usuaris es van abstenir.

Font: www.habr.com

Afegeix comentari