Android նախագիծ կառուցել Docker կոնտեյներով

Android պլատֆորմի համար նախագիծ մշակելիս, նույնիսկ ամենափոքրը, վաղ թե ուշ պետք է գործ ունենալ զարգացման միջավայրի հետ: Բացի Android SDK-ից, անհրաժեշտ է ունենալ Kotlin, Gradle, platform-tools, build-tools-ի վերջին տարբերակը։ Եվ եթե մշակողի մեքենայի վրա այս բոլոր կախվածությունները ավելի մեծ չափով լուծվում են Android Studio IDE-ի միջոցով, ապա CI/CD սերվերի վրա յուրաքանչյուր թարմացում կարող է վերածվել գլխացավանքի: Եվ եթե վեբ մշակման մեջ Docker-ը դարձել է շրջակա միջավայրի խնդրի ստանդարտ լուծում, ապա ինչու չփորձել լուծել նմանատիպ խնդիր Android-ի մշակման մեջ՝ օգտագործելով այն...

Նրանց համար, ովքեր չգիտեն, թե ինչ է Docker-ը, պարզ ասած, դա գործիք է այսպես կոչված ստեղծելու համար. «կոնտեյներներ», որոնք պարունակում են նվազագույն ՕՀ միջուկ և անհրաժեշտ ծրագրային ապահովման փաթեթ, որը մենք կարող ենք տեղակայել որտեղ ուզում ենք՝ պահպանելով շրջակա միջավայրը: Թե կոնկրետ ինչ կլինի մեր կոնտեյներով, որոշվում է 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 .

Parameter -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

Եկեք պարզենք, թե ինչ է դա նշանակում.

docker վազում - պատկերի գործարկման հրամանն ինքնին
-րմ — նշանակում է, որ կոնտեյների կանգից հետո այն ջնջում է այն ամենը, ինչ ստեղծվել է իր կյանքի ընթացքում
-v «$PWD»:/home/gradle/ — տեղադրում է ընթացիկ թղթապանակը մեր Android նախագծի հետ ներքին կոնտեյների պանակում /home/gradle/
-w /home/gradle — սահմանում է կոնտեյների աշխատանքային գրացուցակը
android-build:5.4.1-28-27 — մեր հավաքած տարայի անունը
gradle assembleDebug — իրական հավաքման թիմը, որը հավաքում է մեր նախագիծը

Եթե ​​ամեն ինչ լավ ընթանա, ապա մի քանի վայրկյան/րոպեից ձեր էկրանին կտեսնեք նման բան ԿԱՌՈՒՑԵԼ ՀԱՋՈՂԱԿԱՆ 8 մ 3 վրկ! Իսկ app/build/output/apk թղթապանակը կպարունակի հավաքված հավելվածը։

Դուք կարող եք կատարել այլ gradle առաջադրանքներ նմանատիպ եղանակով` ստուգեք նախագիծը, կատարեք թեստեր և այլն: Հիմնական առավելությունն այն է, որ եթե մենք պետք է նախագիծը կառուցենք որևէ այլ մեքենայի վրա, մենք կարիք չունենք անհանգստանալու ամբողջ միջավայրը տեղադրելու մասին, և բավական կլինի ներբեռնել անհրաժեշտ պատկերը և գործարկել build-ը դրա մեջ:

Կոնտեյները որևէ փոփոխություն չի պահում, և յուրաքանչյուր հավաքույթ գործարկվում է զրոյից, ինչը, մի կողմից, երաշխավորում է հավաքի ինքնությունը՝ անկախ այն բանից, թե որտեղ է այն գործարկվել, մյուս կողմից՝ ամեն անգամ, երբ դուք պետք է ներբեռնեք բոլոր կախվածությունները։ և նորից հավաքեք ամբողջ կոդը, և դա երբեմն կարող է զգալի ժամանակ խլել: Հետևաբար, բացի սովորական «սառը» մեկնարկից, մենք ունենք կառուցումը սկսելու տարբերակ՝ պահպանելով այսպես կոչվածը։ «cache», որտեղ մենք պահում ենք ~/.gradle թղթապանակը՝ պարզապես պատճենելով այն նախագծի աշխատանքային թղթապանակում, իսկ հաջորդ build-ի սկզբում այն ​​հետ ենք վերադարձնում։ Մենք տեղափոխեցինք պատճենման բոլոր ընթացակարգերը առանձին սկրիպտների մեջ, և գործարկման հրամանն ինքնին սկսեց այսպիսի տեսք ունենալ

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

Добавить комментарий