Bini ta' proġett Android f'kontenitur Docker

Meta tiżviluppa proġett għall-pjattaforma Android, anke l-iżgħar waħda, illum jew għada trid tittratta l-ambjent tal-iżvilupp. Minbarra l-Android SDK, huwa meħtieġ li jkun hemm l-aħħar verżjoni ta 'Kotlin, Gradle, għodod tal-pjattaforma, għodod tal-bini. U jekk fuq il-magna tal-iżviluppatur dawn id-dipendenzi kollha jiġu solvuti sa ċertu punt bl-użu tal-Android Studio IDE, allura fuq is-server CI/CD kull aġġornament jista 'jinbidel f'uġigħ ta' ras. U jekk fl-iżvilupp tal-web Docker sar is-soluzzjoni standard għall-problema tal-ambjent, allura għaliex ma tippruvax issolvi problema simili fl-iżvilupp tal-Android billi tużaha...

Għal dawk li ma jafux x'inhu Docker, biex ngħiduha sempliċiment, hija għodda għall-ħolqien tal-hekk imsejjaħ. “kontenituri” li jkun fihom kernel OS minimu u s-sett meħtieġ ta’ softwer li nistgħu niskjeraw fejn irridu, filwaqt li nippreservaw l-ambjent. X'se jkun eżatt fil-kontenitur tagħna huwa determinat fid-Dockerfile, li mbagħad jiġi mmuntat f'immaġni li tista 'tiġi mnedija kullimkien u għandha proprjetajiet ta' idempotenza.

Il-proċess ta 'installazzjoni u l-baŜi ta' Docker huma deskritti perfettament fil tiegħu websajt uffiċjali. Għalhekk, inħarsu ftit 'il quddiem, dan huwa d-Dockerfile li spiċċajna bih:

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

Aħna nissejvjah fil-folder bil-proġett Android tagħna u nibdew nibnu l-kontenitur bil-kmand

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

Parametru -t jispeċifika t-tikketta jew l-isem tal-kontenitur tagħna, li normalment jikkonsisti fl-isem u l-verżjoni tiegħu. Fil-każ tagħna, sejjaħnieha android-build u fil-verżjoni indikajna sett ta 'verżjonijiet ta' gradle, android-sdk u platform-tools. Fil-futur, se jkun aktar faċli għalina li nfittxu l-immaġni li għandna bżonn bl-isem billi tuża din il-“verżjoni”.

Wara li l-assemblaġġ ikun lest, nistgħu nużaw l-immaġni tagħna lokalment, nistgħu niżżluha bil-kmand imbotta docker għal repożitorju ta' immaġini pubbliku jew privat biex tniżżlu f'magni oħra.

Bħala eżempju, ejja nibnu proġett lokalment. Biex tagħmel dan, fil-folder bil-proġett, mexxi l-kmand

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

Ejja naraw xi jfisser:

docker run - il-kmand tat-tnedija tal-immaġni innifsu
-rm — ifisser li wara li jieqaf il-kontenitur, iħassar dak kollu li nħoloq matul il-ħajja tiegħu
-v "$PWD":/dar/gradle/ — timmonta l-folder attwali bil-proġett Android tagħna fil-folder tal-kontenitur intern /home/gradle/
-w /dar/gradle — jispeċifika d-direttorju tax-xogħol tal-kontenitur
android-build:5.4.1-28-27 — l-isem tal-kontenitur tagħna li ġbarna
gradle assembleDebug — it-tim tal-assemblaġġ attwali li jiġbor il-proġett tagħna

Jekk kollox imur tajjeb, allura fi ftit sekondi/minuti tara fuq l-iskrin tiegħek xi ħaġa simili BINI SUĊĊESS fi 8m 3s! U l-fowlder app/build/output/apk se jkun fih l-applikazzjoni immuntata.

Tista 'twettaq kompiti gradle oħra b'mod simili - iċċekkja l-proġett, mexxi testijiet, eċċ. Il-vantaġġ ewlieni huwa li jekk ikollna bżonn nibnu l-proġett fuq kwalunkwe magna oħra, m'għandniex għalfejn ninkwetaw dwar l-installazzjoni tal-ambjent kollu u jkun biżżejjed li tniżżel l-immaġni meħtieġa u tmexxi l-bini fiha.

Il-kontenitur ma jaħżen l-ebda tibdil, u kull assemblaġġ huwa mniedi mill-bidu, li, minn naħa waħda, tiggarantixxi l-identità tal-assemblaġġ irrispettivament minn fejn titnieda, min-naħa l-oħra, kull darba li għandek tniżżel id-dipendenzi kollha u kkumpila l-kodiċi kollu mill-ġdid, u dan kultant jista 'jieħu żmien sinifikanti. Għalhekk, minbarra l-bidu "kiesaħ" tas-soltu, għandna l-għażla li nibdew il-bini filwaqt li nsalvaw l-hekk imsejjaħ. "cache", fejn insalvaw il-folder ~/.gradle billi sempliċement nikkupjawh fil-folder tax-xogħol tal-proġett, u fil-bidu tal-bini li jmiss nirritornawha lura. Aħna mċaqalqa l-proċeduri kollha tal-ikkupjar fi skripts separati u l-kmand tat-tnedija innifsu beda jidher bħal dan

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"

Bħala riżultat, il-ħin medju tal-bini tal-proġett tagħna tnaqqas diversi drabi (skond in-numru ta 'dipendenzi fuq il-proġett, iżda l-proġett medju għalhekk beda jiġi mmuntat f'minuta 1 minflok f'5 minuti).

Dan kollu, ovvjament, jagħmel sens biss jekk għandek is-server CI/CD intern tiegħek, li inti tappoġġja lilek innifsek. Imma issa hemm ħafna servizzi tas-sħab li fihom dawn il-problemi kollha jissolvew u m'għandekx għalfejn tinkwieta dwarha, u l-proprjetajiet ta 'assemblaġġ meħtieġa jistgħu wkoll jiġu speċifikati fis-settings tal-proġett.

Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.

Int iżżomm is-sistema CI/CD tiegħek interna jew tuża servizz ta' parti terza?

  • Aħna nużaw server intern

  • Aħna nużaw servizz estern

  • Aħna ma nużawx CI/CD

  • Oħra

42 utent ivvutaw. 16-il utent astjenew.

Sors: www.habr.com

Żid kumment