Atunci când dezvolți un proiect pentru platforma Android, chiar și cel mai mic, mai devreme sau mai târziu, trebuie să te confrunți cu mediul de dezvoltare. Pe lângă Android SDK, trebuie să ai cea mai recentă versiune de Kotlin, Gradle, platform-tools, build-tools. Și dacă pe mașina dezvoltatorului toate aceste dependențe sunt rezolvate în mare parte cu ajutorul Android Studio IDE, pe serverul CI/CD, fiecare actualizare poate deveni o bătaie de cap. Dacă în dezvoltarea web, soluția la problema mediului a devenit standard Docker, de ce să nu încercăm să rezolvăm o problemă similară și în dezvoltarea Android...
Pentru cei care nu știu ce este Docker — pe scurt, aceasta este un instrument de creare a așa-numitelor „containere” în care se află un nucleu minim de sistem de operare și un set necesar de software, pe care le putem desfășura oriunde dorim, păstrând în același timp mediul. Ce va fi exact în containerul nostru este definit în Dockerfile, care apoi este construit într-un imagine care poate fi rulată oriunde și are proprietăți de idempotentă.
Procesul de instalare și conceptele de bază ale Docker sunt descrise excelent pe pagina sa . Așadar, privind puțin înainte, iată ce Dockerfile am obținut.
# Т.к. основным инструментом для сборки 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"
Îl salvăm în folderul cu proiectul nostru Android și lansăm construcția containerului cu comanda
docker build -t android-build:5.4-28-27 .Parametru -t setează tag-ul sau numele containerului nostru, care de obicei se compune din numele și versiunea sa. În cazul nostru, l-am numit android-build și pentru versiune am indicat combinația versiunilor gradle, android-sdk și platform-tools. În continuare, ne va fi mai ușor să căutăm imaginea dorită după nume folosind o astfel de „versiune”.
După ce construcția a fost finalizată, putem folosi imaginea local, sau o putem încărca cu comanda docker push într-un repository public sau privat de imagini pentru a o descărca pe alte mașini.
Ca exemplu, să construim proiectul local. Pentru asta, în folderul cu proiectul, vom executa comanda
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebugSă analizăm ce înseamnă aceasta:
docker run — comanda de lansare a imaginii
-rm — înseamnă că, după oprirea containerului, acesta va șterge tot ce a fost creat în timpul vieții sale
-v "$PWD":/home/gradle/ — montează folderul curent cu proiectul nostru Android în folderul intern al containerului /home/gradle/
-w /home/gradle — setează directorul de lucru al containerului
android-build:5.4.1-28-27 — numele containerului nostru pe care l-am construit
gradle assembleDebug — echipa de construire care asamblează proiectul nostru
Dacă totul decurge bine, în câteva secunde/minute veți vedea pe ecran ceva de genul CONSTRUCȚIE REUȘITĂ în 8m 3s! Iar în folderul app/build/output/apk va fi aplicația construită.
În mod similar, se pot efectua alte sarcini gradle — verificarea proiectului, rularea testelor etc. Principalul avantaj este că, atunci când avem nevoie să construim proiectul pe o altă mașină, nu trebuie să ne facem griji cu privire la instalarea întregului mediu, fiind suficient să descărcăm imaginea necesară și să lansăm construcția în ea.
Containerul nu stochează nicio modificare, iar fiecare construcție pornește de la zero, ceea ce garantează identitatea construcției, indiferent de locul în care este lansată. Pe de altă parte, de fiecare dată trebuie să descărcăm toate dependențele și să compilăm întregul cod din nou, iar asta poate dura uneori un timp considerabil. De aceea, pe lângă lansarea „rece” obișnuită, avem opțiunea de a lansa construcția păstrând așa-numitul „cache”, unde salvăm folderul ~/ .gradle pur și simplu copindu-l în folderul de lucru al proiectului, iar la începutul următoarei construcții îl returnăm înapoi. Toate procedurile de copiere le-am mutat în scripturi separate, iar echipa de lansare arată acum astfel
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"În rezultatul acesta, timpul mediu de construcție a proiectului s-a redus de câteva ori (în funcție de numărul de dependențe ale proiectului, dar un proiect mediu s-a construit astfel în 1 minut în loc de 5 minute).
Toate acestea au sens doar dacă aveți un server CI/CD intern, de care vă ocupați singuri. Însă, în prezent, există multe servicii cloud în care toate aceste probleme sunt rezolvate, iar dumneavoastră nu trebuie să vă faceți griji, iar proprietățile necesare construcției pot fi de asemenea specificate în setările proiectului.
Numai utilizatorii înregistrați pot participa la sondaj. , vă rugăm.
Aveți un sistem CI/CD intern sau folosiți un serviciu extern?
Folosim un server intern
Folosim un serviciu extern
Nu folosim CI/CD
Altele
Au votat 42 de utilizatori. S-au abținut 16 utilizatori.
Sursa: habr.com
