Сохтани лоиҳаи Android дар контейнери Docker

Ҳангоми таҳияи лоиҳа барои платформаи Android, ҳатто хурдтарин лоиҳа, дер ё зуд шумо бояд бо муҳити рушд мубориза баред. Илова ба Android SDK, шумо бояд версияи охирини Kotlin, Gradle, platform-tools, build-tools дошта бошед. Ва агар дар мошини таҳиягар ҳамаи ин вобастагӣ ба андозаи бештар бо истифода аз Android Studio IDE ҳал карда шаванд, пас дар сервери CI/CD ҳар як навсозӣ метавонад ба дарди сар табдил ёбад. Ва агар дар таҳияи веб Docker ҳалли стандартии мушкилоти муҳити зист шуда бошад, пас чаро кӯшиш накунед, ки мушкилоти шабеҳро дар таҳияи Android бо истифода аз он ҳал кунед...

Барои онҳое, ки намедонанд, ки Докер чист, агар содда карда гӯем, ин асбобест барои эҷоди ба ном. "контейнерҳо", ки дорои ҳадди ақалли ядрои OS ва маҷмӯи зарурии нармафзор мебошанд, ки мо метавонем дар ҳар ҷое, ки мо хоҳем, ҳангоми нигоҳ доштани муҳити зист ҷойгир кунем. Чӣ маҳз дар контейнери мо хоҳад буд, дар Dockerfile муайян карда мешавад, ки пас аз он ба тасвир ҷамъ карда мешавад, ки дар ҳама ҷо оғоз карда мешавад ва дорои хосиятҳои номуносиб аст.

Раванди насбкунӣ ва асосҳои Docker дар ӯ комилан тавсиф шудааст сомонаи расмӣ. Аз ин рӯ, каме ба пеш нигоҳ карда, ин 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

Биёед бифаҳмем, ки ин чӣ маъно дорад:

давидан докер - худи фармони оғози тасвир
-рм — маънои онро дорад, ки пас аз боздоштани контейнер ҳама чизеро, ки дар давоми ҳаёташ офарида шудааст, нест мекунад
-v "$PWD":/home/gradle/ — папкаи ҷорӣро бо лоиҳаи Android-и мо ба ҷузвдони дохилии контейнер /home/gradle/ васл мекунад
-w /home/gradle — каталоги кории контейнерро муайян мекунад
андроид-сохта: 5.4.1-28-27 — номи зарфи мо, ки чамъоварй карда будем
gradle assembleDebug — коллективи монтажчиёне, ки лоихаи моро монтаж мекунад

Агар ҳама чиз хуб бошад, пас дар як чанд сония/дақиқа шумо дар экрани худ чунин чизе хоҳед дид ДАР 8м 3 сония МУВАФФАКИЯТ СОХТМЕД! Ва ҷузвдони app/build/output/apk замимаи ҷамъшударо дар бар мегирад.

Шумо метавонед дигар вазифаҳои gradle-ро бо ҳамин тарз иҷро кунед - лоиҳаро тафтиш кунед, санҷишҳоро иҷро кунед ва ғайра. Бартарии асосӣ дар он аст, ки агар ба мо лозим аст, ки лоиҳаро дар ягон мошини дигар созем, ба мо лозим нест, ки дар бораи насб кардани тамоми муҳити атроф хавотир нашавем ва барои зеркашии тасвири зарурӣ ва иҷро кардани сохтмон дар он кифоя хоҳад буд.

Контейнер ҳеҷ гуна тағиротро нигоҳ намедорад ва ҳар як маҷмӯа аз сифр оғоз мешавад, ки аз як тараф, новобаста аз он ки дар куҷо оғоз карда шудааст, шахсияти маҷлисро кафолат медиҳад, аз тарафи дигар, ҳар дафъа шумо бояд ҳама вобастагиҳоро зеркашӣ кунед ва ҳама рамзро дубора тартиб диҳед ва ин баъзан метавонад вақти зиёдро талаб кунад. Аз ин рӯ, ба ғайр аз оғози муқаррарии "сард", мо имкон дорем, ки сохтмонро ҳангоми сарфа кардани ба ном оғоз кунем. "Кэш", ки дар он мо ҷузвдони ~/.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 корбар худдорӣ карданд.

Манбаъ: will.com

Илова Эзоҳ