Bouwe in Android-projekt yn in Docker-kontener

By it ûntwikkeljen fan in projekt foar it Android-platfoarm, sels de lytste, moatte jo ier of letter omgean mei de ûntwikkelingsomjouwing. Neist de Android SDK is it nedich om de lêste ferzje fan Kotlin, Gradle, platfoarm-ark, build-ark te hawwen. En as op 'e masine fan' e ûntwikkelders al dizze ôfhinklikens yn gruttere mjitte wurde oplost mei de Android Studio IDE, dan kin op 'e CI / CD-tsjinner elke fernijing yn in hoofdpijn wurde. En as Docker yn webûntwikkeling de standertoplossing is wurden foar it miljeuprobleem, wêrom dan net besykje in ferlykber probleem op te lossen yn Android-ûntwikkeling mei it ...

Foar dyjingen dy't net witte wat Docker is, om it gewoan te sizzen, is it in ark foar it meitsjen fan de saneamde. "containers" dy't in minimale OS-kernel befetsje en de nedige set software dy't wy kinne ynsette wêr't wy wolle, wylst it miljeu behâlde. Wat krekt yn ús kontener sil wêze wurdt bepaald yn 'e Dockerfile, dy't dan wurdt gearstald yn in ôfbylding dy't oeral kin wurde lansearre en hat idempotinsje-eigenskippen.

It ynstallaasjeproses en de basis fan Docker binne perfekt beskreaun yn syn offisjele webside. Dêrom, in bytsje foarút sjen, is dit de Dockerfile wêrmei wy einigje:

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

Wy bewarje it yn 'e map mei ús Android-projekt en begjinne de kontener te bouwen mei it kommando

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

Parameter -t spesifisearret de tag of namme fan ús kontener, dy't normaal bestiet út syn namme en ferzje. Yn ús gefal neamden wy it android-build en yn 'e ferzje hawwe wy in set ferzjes oanjûn fan gradle, android-sdk en platfoarm-ark. Yn 'e takomst sil it makliker wêze foar ús om te sykjen nei de ôfbylding dy't wy nedich binne mei namme mei dizze "ferzje".

Nei't de gearstalling foltôge is, kinne wy ​​ús ôfbylding lokaal brûke, wy kinne it downloade mei it kommando docker druk nei in publike of partikuliere ôfbyldingsrepository om it nei oare masines te downloaden.

Litte wy as foarbyld lokaal in projekt bouwe. Om dit te dwaan, fier it kommando yn 'e map mei it projekt

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

Litte wy útfine wat it betsjut:

docker run - it kommando foar it lansearjen fan de ôfbylding sels
-rm - betsjut dat nei't de kontener stoppet, it alles wisket dat is makke yn syn libben
-v "$PWD":/home/gradle/ - monteart de hjoeddeistige map mei ús Android-projekt yn 'e ynterne kontenermap /home/gradle/
-w /home/gradle - spesifisearret de wurkmap fan 'e kontener
android-build: 5.4.1-28-27 - de namme fan ús kontener dy't wy sammele
gradle assembleDebug - it eigentlike gearstallingsteam dat ús projekt gearstalt

As alles goed giet, dan sille jo yn in pear sekonden / minuten soksawat op jo skerm sjen BOUW SUKSESVOL yn 8m 3s! En de map app/build/output/apk sil de gearstalde applikaasje befetsje.

Jo kinne oare gradle-taken op deselde manier útfiere - it projekt kontrolearje, tests útfiere, ensfh. It wichtichste foardiel is dat as wy it projekt moatte bouwe op in oare masine, wy hoege net te soargen oer it ynstallearjen fan 'e heule omjouwing en it sil genôch wêze om de nedige ôfbylding te downloaden en de build deryn út te fieren.

De kontener bewarret gjin feroaringen, en elke gearstalling wurdt fanôf it begjin lansearre, wat oan 'e iene kant de identiteit fan' e gearstalling garandearret, nettsjinsteande wêr't it wurdt lansearre, oan 'e oare kant, elke kear as jo alle ôfhinklikens moatte downloade en kompilearje alle koade wer, en dit kin soms nimme wichtige tiid. Dêrom, neist de gewoane "kâlde" start, wy hawwe de mooglikheid om te begjinnen de bou wylst it bewarjen fan de saneamde. "cache", wêr't wy de ~/.gradle-map bewarje troch it gewoan te kopiearjen nei de wurkmap fan it projekt, en oan it begjin fan 'e folgjende build jouwe wy it werom. Wy ferpleatse alle kopiearjeprosedueres yn aparte skripts en it startkommando sels begon der sa út te sjen

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"

As resultaat waard ús gemiddelde projektboutiid ferskate kearen fermindere (ôfhinklik fan it oantal ôfhinklikens fan it projekt, mar it gemiddelde projekt begon dus yn 1 minút te sammeljen ynstee fan 5 minuten).

Dit alles makket fansels allinich sin as jo jo eigen ynterne CI / CD-tsjinner hawwe, dy't jo sels stypje. Mar no binne d'r in protte wolktsjinsten wêryn al dizze problemen binne oplost en jo hoege der gjin soargen oer te hawwen, en de nedige assemblage-eigenskippen kinne ek oantsjutte wurde yn 'e projektynstellingen.

Allinnich registrearre brûkers kinne meidwaan oan 'e enkête. Ynlogge, asjebleaft.

Hâld jo CI/CD-systeem yn eigen hûs of brûke jo in tsjinst fan tredden?

  • Wy brûke in ynterne tsjinner

  • Wy brûke in eksterne tsjinst

  • Wy brûke gjin CI / CD

  • Oare

42 brûkers stimden. 16 brûkers ûntholden har.

Boarne: www.habr.com

Add a comment