Docker konteynerida Android loyihasini yaratish

Android platformasi uchun loyihani ishlab chiqishda, hatto eng kichik bo'lsa ham, ertami-kechmi siz rivojlanish muhiti bilan shug'ullanishingiz kerak. Android SDK-dan tashqari, Kotlin, Gradle, platforma-asboblar, qurish-asboblarining so'nggi versiyasiga ega bo'lish kerak. Va agar ishlab chiqaruvchining mashinasida ushbu bog'liqliklarning barchasi Android Studio IDE yordamida ko'proq hal qilinsa, CI/CD serverida har bir yangilanish bosh og'rig'iga aylanishi mumkin. Va agar veb-ishlab chiqishda Docker atrof-muhit muammosining standart echimiga aylangan bo'lsa, nega Androidni ishlab chiqishda shunga o'xshash muammoni undan foydalanib hal qilishga urinib ko'rmaysiz?

Docker nima ekanligini bilmaganlar uchun, sodda qilib aytganda, bu so'zlarni yaratish uchun vositadir. Minimal OS yadrosi va kerakli dasturlar to'plamini o'z ichiga olgan "konteynerlar" atrof-muhitni saqlagan holda biz xohlagan joyda joylashtira olamiz. Bizning konteynerimizda aniq nima bo'lishi Dockerfile-da aniqlanadi, keyin u istalgan joyda ishga tushirilishi mumkin bo'lgan va identifikatorlik xususiyatlariga ega bo'lgan tasvirga yig'iladi.

Docker-ning o'rnatish jarayoni va asoslari uning kitobida mukammal tasvirlangan rasmiy veb-sayti. Shuning uchun, bir oz oldinga qarab, bu biz yakunlagan 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"

Biz uni Android loyihamiz bilan papkaga saqlaymiz va buyruq bilan konteynerni qurishni boshlaymiz

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

Parametr -t odatda uning nomi va versiyasidan iborat bo'lgan konteynerimizning tegini yoki nomini belgilaydi. Bizning holatlarimizda biz uni android-build deb nomladik va versiyada biz gradle, android-sdk va platforma-tools versiyalari to'plamini ko'rsatdik. Kelajakda ushbu "versiya" dan foydalanib, bizga kerak bo'lgan tasvirni nom bilan izlash osonroq bo'ladi.

Yig'ish tugagandan so'ng, biz rasmimizni mahalliy sifatida ishlatishimiz mumkin, uni buyruq bilan yuklab olishimiz mumkin docker surish boshqa mashinalarga yuklab olish uchun umumiy yoki shaxsiy rasm omboriga.

Misol tariqasida, mahalliy sharoitda loyiha quramiz. Buning uchun loyiha bilan papkada buyruqni bajaring

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

Keling, bu nimani anglatishini aniqlaymiz:

docker ishlaydi - tasvirni ishga tushirish buyrug'ining o'zi
-rm β€” konteyner toΚ»xtagandan soΚ»ng, uning hayoti davomida yaratilgan barcha narsalarni oΚ»chirib tashlashini bildiradi
-v "$PWD":/home/gradle/ β€” joriy papkani Android loyihamiz bilan ichki konteyner papkasiga /home/gradle/ o'rnatadi.
-w /home/gradle β€” konteynerning ishchi katalogini belgilaydi
android-qurilish: 5.4.1-28-27 - biz yig'gan idishimizning nomi
gradle assembleDebug - loyihamizni yig'adigan haqiqiy montaj guruhi

Agar hamma narsa yaxshi bo'lsa, bir necha soniya / daqiqadan so'ng siz ekraningizda shunga o'xshash narsani ko'rasiz 8 m 3 soniyada MUVAFFAQIYATLI QURISH! Va app/build/output/apk papkasida yig'ilgan dastur bo'ladi.

Siz shunga o'xshash tarzda boshqa darajali vazifalarni bajarishingiz mumkin - loyihani tekshiring, testlarni o'tkazing va hokazo. Asosiy afzallik shundaki, agar biz loyihani boshqa biron-bir mashinada qurishimiz kerak bo'lsa, biz butun muhitni o'rnatish haqida tashvishlanishga hojat yo'q va kerakli tasvirni yuklab olish va unda qurilishni ishga tushirish kifoya qiladi.

Konteyner hech qanday o'zgarishlarni saqlamaydi va har bir yig'ilish noldan ishga tushiriladi, bu bir tomondan, qaerda ishga tushirilganidan qat'i nazar, yig'ilishning identifikatorini kafolatlaydi, boshqa tomondan, har safar barcha bog'liqliklarni yuklab olishingiz kerak bo'ladi. va yana barcha kodlarni kompilyatsiya qiling va bu ba'zan sezilarli vaqt talab qilishi mumkin. Shuning uchun, odatiy "sovuq" boshlashga qo'shimcha ravishda, biz deb ataladigan narsalarni tejash bilan qurishni boshlash imkoniyatiga egamiz. "Kesh", bu erda ~/.gradle jildini loyihaning ishchi papkasiga nusxalash orqali saqlaymiz va keyingi qurish boshida biz uni qaytarib beramiz. Biz barcha nusxa ko'chirish protseduralarini alohida skriptlarga o'tkazdik va ishga tushirish buyrug'ining o'zi shunday ko'rinishni boshladi

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"

Natijada, loyihani qurishning o'rtacha vaqti bir necha marta qisqardi (loyihaga bog'liqliklar soniga qarab, lekin o'rtacha loyiha 1 daqiqa o'rniga 5 daqiqada yig'ila boshladi).

Bularning barchasi, albatta, o'zingiz qo'llab-quvvatlaydigan o'zingizning ichki CI/CD serveringiz bo'lsagina mantiqiy bo'ladi. Ammo endi ko'plab bulutli xizmatlar mavjud bo'lib, ularda bu muammolarning barchasi hal qilinadi va siz bu haqda tashvishlanishingizga hojat yo'q va kerakli yig'ish xususiyatlari ham loyiha sozlamalarida ko'rsatilishi mumkin.

So'rovda faqat ro'yxatdan o'tgan foydalanuvchilar ishtirok etishlari mumkin. tizimga kirishiltimos.

CI/CD tizimingizni uyda saqlaysizmi yoki uchinchi tomon xizmatidan foydalanasizmi?

  • Biz ichki serverdan foydalanamiz

  • Biz tashqi xizmatdan foydalanamiz

  • Biz CI/CD dan foydalanmaymiz

  • boshqa

42 foydalanuvchi ovoz berdi. 16 nafar foydalanuvchi betaraf qoldi.

Manba: www.habr.com

a Izoh qo'shish