Android պլատֆորմի համար նախագիծ մշակելիս, նույնիսկ ամենափոքրը, վաղ թե ուշ պետք է գործ ունենալ զարգացման միջավայրի հետ: Բացի Android SDK-ից, անհրաժեշտ է ունենալ Kotlin, Gradle, platform-tools, build-tools-ի վերջին տարբերակը։ Եվ եթե մշակողի մեքենայի վրա այս բոլոր կախվածությունները ավելի մեծ չափով լուծվում են Android Studio IDE-ի միջոցով, ապա CI/CD սերվերի վրա յուրաքանչյուր թարմացում կարող է վերածվել գլխացավանքի: Եվ եթե վեբ մշակման մեջ Docker-ը դարձել է շրջակա միջավայրի խնդրի ստանդարտ լուծում, ապա ինչու չփորձել լուծել նմանատիպ խնդիր Android-ի մշակման մեջ՝ օգտագործելով այն...
Նրանց համար, ովքեր չգիտեն, թե ինչ է Docker-ը, պարզ ասած, դա գործիք է այսպես կոչված ստեղծելու համար. «կոնտեյներներ», որոնք պարունակում են նվազագույն ՕՀ միջուկ և անհրաժեշտ ծրագրային ապահովման փաթեթ, որը մենք կարող ենք տեղակայել որտեղ ուզում ենք՝ պահպանելով շրջակա միջավայրը: Թե կոնկրետ ինչ կլինի մեր կոնտեյներով, որոշվում է Dockerfile-ում, որն այնուհետև հավաքվում է պատկերի, որը կարող է գործարկվել ցանկացած վայրում և ունի անզորության հատկություններ:
Docker-ի տեղադրման գործընթացը և հիմունքները հիանալի նկարագրված են նրա մեջ
# Т.к. основным инструментом для сборки 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