Duke zhvilluar një projekt për platformën Android, madje edhe më i vogli, herët a vonë përballesh me mjedisin për zhvillim. Përveç Android SDK, është e nevojshme të kesh versionin më të fundit të Kotlin, Gradle, platform-tools, dhe build-tools. Dhe nëse në makinën e zhvilluesit këto varësi zgjidhen në masë të madhe me ndihmën e Android Studio IDE, në serverin CI/CD çdo përditësim mund të shndërrohet në një shqetësim. Dhe nëse në zhvillimin web, zgjidhja e problematikës së mjedisit është bërë standard me Docker, pse të mos provohet të zgjidhet një problem i ngjashëm edhe në zhvillimin e Android-it...
Për ata që nuk e dinë se çfarë është Docker — nëse e shpjegojmë thjesht, ajo është një mjet për krijimin e ashtuquajturave "kontejnerë" ku përmban një bërthamë minimale të OS dhe një grup të nevojshëm softuerësh, të cilat ne mund t'i implementojmë kudo, duke ruajtur në të njëjtën kohë mjedisin. Çfarë do të ketë në kontejnerin tonë përcaktohet në Dockerfile, i cili më pas përpunohet në një imazh që mund të ekzekutohet kudo dhe që ka pronat e idempotencës.
Procesi i instalimit dhe bazat e Docker-it janë përshkruar mirë në . Prandaj, duke u hedhur pak përpara, ky është Dockerfile që kemi krijuar
# Т.к. основным инструментом для сборки 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"
E ruajmë atë në dosjen e projektit tonë Android dhe nisëm ndërtimin e kontejnerit me komandën
docker build -t android-build:5.4-28-27 .Parametri -t përcakton tag ose emrin e kontejnerit tonë, i cili zakonisht përbëhet nga emri dhe versioni i tij. Në rastin tonë, ne e quajmë android-build dhe në version caktojmë grumbullin e versioneve të gradle, android-sdk dhe platform-tools. Më vonë do të jetë më e lehtë të gjejmë imazhin që na nevojitet sipas emrit duke përdorur një "version" të tillë.
Pasi ndërtimi të ketë përfunduar, ne mund ta përdorim imazhin tonë lokalisht, mund ta ngarkojmë me komandën docker push në një depo publike ose private imazhe për ta shkarkuar atë në makina të tjera.
Si një shembull, le të ndërtojmë projektin lokalisht. Për këtë në dosjen me projektin ekzekutojmë komandën
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebugLe ta analizojmë se çfarë do të thotë ajo:
docker run — vetë komanda për ekzekutimin e imazhit
-rm — do të thotë se pas ndalimit të kontejnerit ai fshin gjithçka që është krijuar gjatë jetës së tij
-v "$PWD":/home/gradle/ — monton dosjen aktuale me projektin tonë Android në dosjen e brendshme të kontejnerit /home/gradle/
-w /home/gradle — përcakton direktorinë e punës së kontejnerit
android-build:5.4.1-28-27 — emri i kontejnerit tonë që kemi ndërtuar
gradle assembleDebug — komanda e ndërtimit që mbledh projektin tonë
Nëse gjithçka shkon mirë, pas disa sekondash/minutash, do të shihni në ekranin tuaj diçka si NDËRTIM I SUKSESHEM në 8m 3s! Në dosjen app/build/output/apk do të jetë aplikacioni i ndërtuar.
Në mënyrë të ngjashme, mund të kryhen detyra të tjera gradle — të kontrolloni projektin, të ndizni teste etj. Avantazhi kryesor — nëse nevojitet ndërtimi i projektit në një makinë tjetër, nuk na nevojitet të shqetësohemi për instalimin e gjithë ambientit dhe mjafton të shkarkojmë imazhin e nevojshëm dhe ta ndiznim atje.
Kontejneri nuk ruan asnjë ndryshim, dhe çdo ndërtim fillon nga zero, gjë që garanton identitetin e ndërtimit pavarësisht vendit ku ndizet, por nga ana tjetër, çdo herë duhet të shkarkojmë të gjitha varësitë dhe të kompilohet e gjithë kodi nga e para, çka ndonjëherë mund të marrë një kohë të konsiderueshme. Prandaj, përveç ndërtimit të zakonshëm "të ftohtë", kemi një variant të ndërtimit me ruajtjen e ashtuquajturit "cache", ku ruajmë dosjen ~/.gradle thjesht duke e kopjuar në dosjen e punës së projektit, dhe në fillim të ndërtimit të ardhshëm e kthejmë përsëri. Të gjitha procedurat e kopjimit i kemi nxjerrë në skenarë të veçantë dhe vetë komanda e ndezjes është dukur kështu
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"Si rezultat, koha mesatare e ndërtimit të projektit është zvogëluar disa herë (në varësi të numrit të varësive në projekt, por projekti mesatar tani ndërtohet për 1 minutë në vend të 5 minutave).
Të gjitha këto vetëkuptohen vetëm nëse keni një server CI/CD të brendshëm, për të cilin kujdeseni vetë. Por tani ka shumë shërbime cloud në të cilat të gjitha këto probleme janë zgjidhur dhe nuk duhet të shqetësoheni për to, dhe cilësitë e nevojshme të ndërtimit mund t'i specifikoni gjithashtu në cilësimet e projektit.
Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. , ju lutem.
A e mbani sistemin CI/CD brenda apo përdorni një shërbim të jashtëm?
Përdorim serverin e brendshëm
Përdorim shërbimin e jashtëm
Nuk përdorim CI/CD
Tjetër
Votuan 42 përdorues. U përmbajtën 16 përdorues.
Burimi: habr.com
