Platforma uchun loyiha ishlab chiqish Android, hatto eng kichigi ham, ertami-kechmi ishlab chiqish muhiti bilan shug'ullanishi kerak. Bundan tashqari Android SDK uchun Kotlin, Gradle, platform-tools va build-tools ning eng so'nggi versiyasi talab qilinadi. Agar ishlab chiquvchining mashinasida bo'lsa, bu bog'liqliklarning barchasi asosan ... yordamida hal qilinadi Android Studio IDE, keyin CI/CD serverida har bir yangilanish bosh og'rig'iga aylanishi mumkin. Agar Docker veb-ishlab chiqishda atrof-muhit muammosining standart yechimiga aylangan bo'lsa, nega uni shunga o'xshash muammoni hal qilish uchun sinab ko'rmaysiz? Android-rivojlanish…
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 . 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 o'zimizdagi papkada saqlaymiz Android-loyihalash va konteyner yaratish buyrug'ini ishga tushirish
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 assembleDebugKeling, 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 biznikiga o'rnatadi Android- konteynerning ichki papkasiga loyiha /home/gradle/
-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. iltimos.
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
