Docker контейнеринде Android долбоорун куруу

Android платформасы үчүн долбоорду иштеп чыгууда, ал тургай эң кичинеси, эртеби-кечпи, сиз иштеп чыгуу чөйрөсү менен күрөшүүгө туура келет. Android SDKдан тышкары, Kotlin, Gradle, платформа куралдары, куруу куралдарынын акыркы версиясы болушу керек. Ал эми иштеп чыгуучунун машинасында бул көз карандылыктын бардыгы көбүрөөк деңгээлде Android Studio IDE аркылуу чечилсе, CI/CD серверинде ар бир жаңыртуу баш ооруга айланышы мүмкүн. Ал эми веб-иштеп чыгууда Docker айлана-чөйрө көйгөйүнүн стандарттуу чечими болуп калса, анда эмне үчүн Android иштеп чыгуусунда ушул сыяктуу көйгөйдү аны колдонуу менен чечүүгө аракет кылбайт...

Докер деген эмне экенин билбегендер үчүн, жөнөкөй тил менен айтканда, бул деп аталганды түзүү куралы. Минималдуу ОС ядросун камтыган "контейнерлер" жана биз айлана-чөйрөнү сактап, биз каалаган жерде орното алабыз. Биздин контейнерде так эмне болору Dockerfileде аныкталат, ал андан кийин каалаган жерде ишке киргизиле турган жана импотенттик касиеттерге ээ болгон сүрөткө чогултулат.

Докердин орнотуу процесси жана негиздери анын китебинде эң сонун сүрөттөлгөн расмий сайты. Ошондуктан, бир аз алдыга карап, бул биз аяктаган 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"

Биз аны Android долбоорубуз менен папкага сактап, буйрук менен контейнерди кура баштайбыз

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

параметр -t адатта анын аталышынан жана версиясынан турган биздин контейнердин теги же атын аныктайт. Биздин учурда, биз аны android-build деп атадык жана версияда биз gradle, android-sdk жана platform-tools версияларынын топтомун көрсөттүк. Келечекте бул "версия" аркылуу аты боюнча керектүү сүрөттү издөө бизге жеңил болот.

Чогултуу аяктагандан кийин, биз сүрөтүбүздү жергиликтүү түрдө колдоно алабыз, биз аны буйрук менен жүктөй алабыз докер түртүү башка машиналарга жүктөп алуу үчүн жалпыга ачык же жеке сүрөт репозиторийине.

Мисал катары жер-жерлерде долбоор куралы. Бул үчүн, долбоор менен папкага буйрукту иштетиңиз

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

Бул эмнени билдирерин аныктап көрөлү:

докер чуркоо - сүрөттү ишке киргизүү буйругунун өзү
-rm — дегенди билдирет, контейнер токтогондон кийин, ал өмүрүндө жаралган нерселердин баарын жок кылат
-v "$PWD":/home/gradle/ — учурдагы папканы биздин Android долбоорубуз менен ички контейнер папкасына орнотот /home/gradle/
-w /home/gradle — контейнердин жумушчу каталогун белгилейт
android-Build: 5.4.1-28-27 — биз чогулткан идишибиздин аты
gradle assembleDebug — биздин долбоорду монтаждоочу чыныгы монтаждоо бригадасы

Эгер баары ойдогудай болсо, анда бир нече секундадан/мүнөттөн кийин сиз экраныңызда ушундай нерсени көрөсүз 8м 3сек ичинде ИЙГИЛИКТҮҮ КУРУ! Ал эми колдонмо/Build/output/apk папкасы чогулган тиркемени камтыйт.

Ушундай эле жол менен сиз башка класстык тапшырмаларды аткара аласыз - долбоорду текшериңиз, тесттерди өткөрүңүз, ж.б. Негизги артыкчылыгы, эгерде биз долбоорду башка машинага куруу керек болсо, анда биз бүтүндөй чөйрөнү орнотуу жөнүндө тынчсыздануунун кереги жок жана керектүү сүрөттү жүктөп алып, андагы курууну иштетүү үчүн жетиштүү болот.

Контейнер эч кандай өзгөртүүлөрдү сактабайт жана ар бир жыйын нөлдөн баштап ишке киргизилет, бул, бир жагынан, кайсы жерде ишке киргизилгенине карабастан, жыйындын иденттүүлүгүнө кепилдик берет, экинчи жагынан, бардык көз карандылыктарды жүктөп алуу керек болгон сайын жана бардык кодду кайра түзүңүз жана бул кээде олуттуу убакытты талап кылышы мүмкүн. Ошондуктан, кадимки "муздак" баштоодон тышкары, биз деп аталгандарды сактап жатканда курууну баштоо мүмкүнчүлүгү бар. “Кэш”, мында ~/.gradle папкасын жөн гана долбоордун жумушчу папкасына көчүрүү менен сактайбыз жана кийинки куруунун башында биз аны кайра кайтарабыз. Биз бардык көчүрүү процедураларын өзүнчө скрипттерге көчүрдүк жана ишке киргизүү буйругунун өзү ушундай боло баштады

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"

Натыйжада, биздин долбоордун орточо куруу убактысы бир нече эсеге кыскарды (долбоордогу көз карандылыктын санына жараша, бирок орточо долбоор 1 мүнөттүн ордуна 5 мүнөттө чогултула баштады).

Мунун баары, албетте, сизде өзүңүздүн ички CI/CD сервериңиз болсо гана мааниси бар. Бирок азыр көптөгөн булут кызматтары бар, аларда бул көйгөйлөрдүн баары чечилет жана бул жөнүндө кабатыр болбоңуз, ошондой эле зарыл болгон монтаждык касиеттери долбоордун жөндөөлөрүндө да көрсөтүлүшү мүмкүн.

Сурамжылоого катталган колдонуучулар гана катыша алышат. Кирүү, өтүнөмүн.

Сиз CI/CD тутумуңузду үйүңүздө сактайсызбы же үчүнчү тараптын кызматын колдоносузбу?

  • Биз ички серверди колдонобуз

  • Биз тышкы кызматты колдонобуз

  • Биз CI/CD колдонбойбуз

  • башка

42 колдонуучу добуш берди. 16 колдонуучу добуш берүүдөн баш тартты.

Source: www.habr.com

Комментарий кошуу