Docker kapsayıcısında Android projesi oluşturma

Android platformu için bir proje geliştirirken, en küçüğü bile olsa, er ya da geç geliştirme ortamıyla uğraşmak zorundasınız. Android SDK'ya ek olarak Kotlin, Gradle, platform-tools, build-tools'un son sürümüne sahip olmak gerekiyor. Ve geliştiricinin makinesinde tüm bu bağımlılıklar Android Studio IDE kullanılarak büyük ölçüde çözülürse, CI/CD sunucusunda her güncelleme baş ağrısına dönüşebilir. Ve eğer web geliştirmede Docker çevre sorununa standart çözüm haline geldiyse, neden Android geliştirmede de benzer bir sorunu onu kullanarak çözmeye çalışmıyorsunuz?

Docker'ın ne olduğunu bilmeyenler için, basitçe söylemek gerekirse, sözde yaratmaya yönelik bir araçtır. Minimum işletim sistemi çekirdeğini ve çevreyi korurken istediğimiz yere dağıtabileceğimiz gerekli yazılım setini içeren “kapsayıcılar”. Konteynerimizde tam olarak ne olacağı Dockerfile'da belirlenir ve bu daha sonra herhangi bir yerde başlatılabilen ve idempotency özelliklerine sahip bir görüntü halinde birleştirilir.

Docker'ın kurulum süreci ve temelleri bu kitapta mükemmel bir şekilde anlatılmıştır. resmi sitesi. Bu nedenle, biraz ileriye baktığımızda, elde ettiğimiz Docker dosyası şu:

# Т.к. основным инструментом для сборки 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 projemizin bulunduğu klasöre kaydediyoruz ve komutuyla konteyneri oluşturmaya başlıyoruz

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

Parametre -t kapsayıcımızın genellikle adı ve sürümünden oluşan etiketini veya adını belirtir. Bizim durumumuzda buna android-build adını verdik ve versiyonda gradle, android-sdk ve platform-tools'un bir dizi versiyonunu belirttik. Gelecekte ihtiyaç duyduğumuz görseli bu "versiyonu" kullanarak isme göre aramamız daha kolay olacak.

Montaj tamamlandıktan sonra imajımızı localde kullanabiliriz komutu ile indirebiliriz liman işçisi itme diğer makinelere indirmek için genel veya özel bir görüntü deposuna.

Örnek olarak localde bir proje oluşturalım. Bunu yapmak için projenin bulunduğu klasörde şu komutu çalıştırın:

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

Bunun ne anlama geldiğini anlayalım:

docker koşmak - görüntü başlatma komutunun kendisi
-rm — konteyner durduktan sonra kullanım ömrü boyunca oluşturulan her şeyin silindiği anlamına gelir
-v "$PWD":/home/gradle/ — Android projemizin bulunduğu geçerli klasörü /home/gradle/ dahili kapsayıcı klasörüne bağlar
-w /home/gradle — kabın çalışma dizinini belirtir
android-derleme:5.4.1-28-27 — topladığımız konteynerimizin adı
gradle assembleDebug — projemizi bir araya getiren asıl montaj ekibi

Her şey yolunda giderse, birkaç saniye/dakika içinde ekranınızda şöyle bir şey göreceksiniz: 8 dk 3 saniyede BAŞARILI İNŞAAT! Ve app/build/output/apk klasörü birleştirilmiş uygulamayı içerecektir.

Diğer kepçe görevlerini de benzer şekilde gerçekleştirebilirsiniz - projeyi kontrol edin, testleri çalıştırın vb. Ana avantajı, projeyi başka bir makinede oluşturmamız gerekirse, tüm ortamı kurma konusunda endişelenmemize gerek olmaması ve gerekli görüntüyü indirip yapıyı onun içinde çalıştırmamız yeterli olacaktır.

Kap herhangi bir değişikliği saklamaz ve her derleme sıfırdan başlatılır; bu, bir yandan nerede başlatıldığına bakılmaksızın derlemenin kimliğini garanti eder, diğer yandan tüm bağımlılıkları her indirmeniz gerektiğinde ve tüm kodu yeniden derleyin; bu bazen oldukça zaman alabilir. Bu nedenle, her zamanki "soğuk" başlatmaya ek olarak, sözde kaydederken yapıyı başlatma seçeneğimiz de var. ~/.gradle klasörünü projenin çalışma klasörüne kopyalayarak kaydettiğimiz “cache” ve bir sonraki yapının başlangıcında onu geri döndürüyoruz. Tüm kopyalama prosedürlerini ayrı komut dosyalarına taşıdık ve başlatma komutunun kendisi şu şekilde görünmeye 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"

Sonuç olarak, ortalama proje inşa süremiz birkaç kat azaldı (projeye bağımlılık sayısına bağlı olarak ancak ortalama proje 1 dakika yerine 5 dakikada monte edilmeye başlandı).

Elbette tüm bunlar, yalnızca kendi desteklediğiniz dahili CI/CD sunucunuz varsa anlamlıdır. Ancak artık tüm bu sorunların çözüldüğü ve endişelenmenize gerek kalmayan birçok bulut hizmeti var ve gerekli montaj özellikleri de proje ayarlarında belirtilebilir.

Ankete sadece kayıtlı kullanıcılar katılabilir. Giriş yapLütfen.

CI/CD sisteminizi şirket içinde mi tutuyorsunuz yoksa üçüncü taraf bir hizmet mi kullanıyorsunuz?

  • Dahili bir sunucu kullanıyoruz

  • Harici bir hizmet kullanıyoruz

  • CI/CD kullanmıyoruz

  • Diğer

42 kullanıcı oy kullandı. 16 kişi çekimser kaldı.

Kaynak: habr.com

Yorum ekle