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
# Π’.ΠΊ. ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ 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.
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