Docker контейнерінде Android жобасын құру

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

Докердің не екенін білмейтіндер үшін, қарапайым тілмен айтқанда, бұл деп аталатынды құру құралы. Қоршаған ортаны сақтай отырып, біз қалаған жерде орналастыра алатын минималды ОЖ ядросы мен қажетті бағдарламалық құрал жиынтығын қамтитын «контейнерлер». Біздің контейнерде нақты не болатыны 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 — контейнердің жұмыс каталогын көрсетеді
android құрастыру: 5.4.1-28-27 — жинаған ыдысымыздың аты
gradle assembleDebug — жобамызды құрастыратын нақты құрастыру тобы

Егер бәрі жақсы болса, бірнеше секундтан/минуттан кейін сіз экранда осындай нәрсені көресіз 8 м 3 секундта ТАБЫСТЫ ҚҰРУ! Ал app/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 пайдаланушы қалыс қалды.

Ақпарат көзі: www.habr.com

пікір қалдыру