Docker konteynerində Android layihəsinin qurulması

Android platforması üçün bir layihə hazırlayarkən, hətta ən kiçik olsa da, gec-tez inkişaf mühiti ilə məşğul olmalısınız. Android SDK ilə yanaşı, Kotlin, Gradle, platform-tools, build-tools-un ən son versiyasına sahib olmaq lazımdır. Əgər tərtibatçının maşınında bütün bu asılılıqlar daha çox Android Studio IDE istifadə edərək həll edilirsə, CI/CD serverində hər yeniləmə baş ağrısına çevrilə bilər. Əgər veb-inkişafda Docker ətraf mühit probleminin standart həllinə çevrilibsə, onda niyə ondan istifadə edərək Android inkişafında oxşar problemi həll etməyə çalışmayaq...

Dockerin nə olduğunu bilməyənlər üçün, sadə dillə desək, sözdə olanı yaratmaq üçün bir vasitədir. Minimal OS nüvəsini və ətraf mühiti qoruyaraq istədiyimiz yerdə yerləşdirə biləcəyimiz lazımi proqram dəstini ehtiva edən "konteynerlər". Konteynerimizdə dəqiq nə olacağı Dockerfile-də müəyyən edilir, daha sonra istənilən yerdə işə salına bilən və identifikasiya xüsusiyyətlərinə malik bir şəkilə yığılır.

Docker-in quraşdırma prosesi və əsasları onun kitabında mükəmməl təsvir edilmişdir rəsmi sayt. Buna görə də, bir az irəliyə baxsaq, bu Dockerfile-dir:

# Т.к. основным инструментом для сборки 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"

Onu Android layihəmizlə qovluqda saxlayırıq və əmrlə konteyneri qurmağa başlayırıq

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

Parametr -t adətən adı və versiyasından ibarət olan konteynerimizin etiketini və ya adını müəyyən edir. Bizim vəziyyətimizdə biz bunu android-build adlandırdıq və versiyada gradle, android-sdk və platforma alətlərinin bir sıra versiyalarını göstərdik. Gələcəkdə bu “versiyadan” istifadə edərək adla bizə lazım olan şəkli axtarmaq daha asan olacaq.

Montaj başa çatdıqdan sonra şəklimizi lokal olaraq istifadə edə bilərik, əmrlə yükləyə bilərik docker push digər maşınlara yükləmək üçün ictimai və ya şəxsi şəkil deposuna.

Nümunə olaraq, yerli olaraq bir layihə quraq. Bunu etmək üçün layihənin olduğu qovluqda əmri işə salın

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

Bunun nə demək olduğunu anlayaq:

docker run - təsvirin işə salınması əmrinin özü
-rm — o deməkdir ki, konteyner dayandıqdan sonra ömrü boyu yaradılmış hər şeyi silir
-v "$PWD":/home/gradle/ — Android layihəmizlə cari qovluğu daxili konteyner qovluğuna /home/gradle/ bağlayır
-w /home/gradle — konteynerin iş kataloqunu təyin edir
android quruluşu: 5.4.1-28-27 — topladığımız qabımızın adı
gradle assembleDebug — layihəmizi birləşdirən faktiki montaj komandası

Hər şey qaydasındadırsa, bir neçə saniyə/dəqiqədən sonra ekranınızda belə bir şey görəcəksiniz 8m 3s-də UĞURLU TİKİN! Və app/build/output/apk qovluğunda yığılmış proqram olacaq.

Digər gradle tapşırıqlarını oxşar şəkildə yerinə yetirə bilərsiniz - layihəni yoxlayın, testlər keçirin və s. Əsas üstünlüyü ondan ibarətdir ki, əgər layihəni hər hansı başqa maşın üzərində qurmaq lazımdırsa, bütün mühiti quraşdırmaqdan narahat olmaq lazım deyil və bu, lazımi şəkli yükləmək və quruluşu orada işə salmaq üçün kifayət edəcəkdir.

Konteyner heç bir dəyişikliyi saxlamır və hər bir montaj sıfırdan işə salınır, bu, bir tərəfdən harada işə salınmasından asılı olmayaraq montajın şəxsiyyətinə zəmanət verir, digər tərəfdən, hər dəfə bütün asılılıqları yükləməlisiniz. və bütün kodu yenidən tərtib edin və bu, bəzən əhəmiyyətli vaxt apara bilər. Buna görə, adi "soyuq" başlanğıcdan əlavə, sözdə qənaət edərkən tikintiyə başlamaq seçimimiz var. “Keş”, burada ~/.gradle qovluğunu sadəcə layihənin iş qovluğuna köçürməklə yadda saxlayırıq və növbəti quruluşun əvvəlində onu geri qaytarırıq. Bütün kopyalama prosedurlarını ayrı skriptlərə köçürdük və işə salma əmrinin özü belə görünməyə başladı

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"

Nəticə etibarilə, layihənin orta tikinti müddətimiz bir neçə dəfə azaldı (layihədən asılılıqların sayından asılı olaraq, lakin orta layihə beləliklə 1 dəqiqə əvəzinə 5 dəqiqə ərzində yığılmağa başladı).

Bütün bunlar, əlbəttə ki, yalnız özünüzü dəstəklədiyiniz öz daxili CI/CD serveriniz olduqda məna kəsb edir. Ancaq indi bütün bu problemlərin həll edildiyi bir çox bulud xidmətləri var və bu barədə narahat olmaq lazım deyil və lazımi montaj xüsusiyyətləri də layihə parametrlərində göstərilə bilər.

Sorğuda yalnız qeydiyyatdan keçmiş istifadəçilər iştirak edə bilər. Daxil olunxahiş edirəm.

Siz CI/CD sisteminizi evdə saxlayırsınız və ya üçüncü tərəf xidmətindən istifadə edirsiniz?

  • Biz daxili serverdən istifadə edirik

  • Xarici xidmətdən istifadə edirik

  • Biz CI/CD istifadə etmirik

  • Digər

42 istifadəçi səs verib. 16 istifadəçi bitərəf qalıb.

Mənbə: www.habr.com

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