Membina projek Android dalam bekas Docker

Apabila membangunkan projek untuk platform Android, walaupun yang kecil, lambat laun anda perlu berurusan dengan persekitaran pembangunan. Selain SDK Android, versi terkini Kotlin, Gradle, platform-tools, build-tools adalah perlu. Dan jika pada mesin pembangun semua kebergantungan ini diselesaikan dengan lebih banyak menggunakan Android Studio IDE, maka pada pelayan CI/CD setiap kemas kini boleh bertukar menjadi sakit kepala. Dan jika dalam pembangunan web Docker telah menjadi penyelesaian standard kepada masalah persekitaran, maka mengapa tidak cuba menyelesaikan masalah yang sama dalam pembangunan Android menggunakannya...

Bagi mereka yang tidak tahu apa itu Docker, secara ringkasnya, ia adalah alat untuk mencipta apa yang dipanggil. "bekas" yang mengandungi kernel OS minimum dan set perisian yang diperlukan yang boleh kami gunakan di mana sahaja kami mahu, sambil memelihara alam sekitar. Apa sebenarnya yang akan ada dalam bekas kami ditentukan dalam Dockerfile, yang kemudiannya dipasang ke dalam imej yang boleh dilancarkan di mana-mana sahaja dan mempunyai sifat mati pucuk.

Proses pemasangan dan asas Docker diterangkan dengan sempurna dalam beliau laman web rasmi. Oleh itu, melihat ke hadapan sedikit, ini adalah Dockerfile yang kami miliki:

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

Kami menyimpannya dalam folder dengan projek Android kami dan mula membina bekas dengan arahan

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

Parameter -t menentukan teg atau nama bekas kami, yang biasanya terdiri daripada nama dan versinya. Dalam kes kami, kami memanggilnya android-build dan dalam versi kami menunjukkan satu set versi gradle, android-sdk dan platform-tools. Pada masa hadapan, lebih mudah untuk kita mencari imej yang kita perlukan dengan nama menggunakan "versi" ini.

Selepas pemasangan selesai, kami boleh menggunakan imej kami secara tempatan, kami boleh memuat turunnya dengan arahan tolak buruh pelabuhan ke repositori imej awam atau peribadi untuk memuat turunnya ke mesin lain.

Sebagai contoh, mari kita bina projek secara tempatan. Untuk melakukan ini, dalam folder dengan projek, jalankan arahan

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

Mari kita fahami maksudnya:

berlari docker - arahan pelancaran imej itu sendiri
-rm β€” bermakna selepas bekas berhenti, ia memadamkan semua yang dicipta semasa hayatnya
-v "$PWD":/home/gradle/ β€” memasang folder semasa dengan projek Android kami ke dalam folder bekas dalaman /home/gradle/
-w /home/gradle β€” menentukan direktori kerja bekas
android-build:5.4.1-28-27 β€” nama bekas kami yang kami kumpulkan
gradle assembleDebug β€” pasukan pemasangan sebenar yang memasang projek kami

Jika semuanya berjalan lancar, maka dalam beberapa saat/minit anda akan melihat sesuatu seperti pada skrin anda MEMBINA BERJAYA dalam 8m 3s! Dan folder app/build/output/apk akan mengandungi aplikasi yang dipasang.

Anda boleh melaksanakan tugas gradle lain dengan cara yang sama - semak projek, jalankan ujian, dsb. Kelebihan utama ialah jika kita perlu membina projek pada mana-mana mesin lain, kita tidak perlu risau tentang memasang keseluruhan persekitaran dan ia akan mencukupi untuk memuat turun imej yang diperlukan dan menjalankan binaan di dalamnya.

Bekas tidak menyimpan sebarang perubahan, dan setiap pemasangan dilancarkan dari awal, yang, dalam satu tangan, menjamin identiti pemasangan tanpa mengira di mana ia dilancarkan, sebaliknya, setiap kali anda perlu memuat turun semua kebergantungan dan susun semula semua kod, dan ini kadangkala boleh mengambil masa yang ketara. Oleh itu, sebagai tambahan kepada permulaan "sejuk" biasa, kami mempunyai pilihan untuk memulakan binaan sambil menyimpan yang dipanggil. "cache", di mana kami menyimpan folder ~/.gradle dengan hanya menyalinnya ke folder kerja projek, dan pada permulaan binaan seterusnya kami mengembalikannya semula. Kami memindahkan semua prosedur penyalinan ke dalam skrip berasingan dan arahan pelancaran itu sendiri mula kelihatan seperti ini

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"

Akibatnya, purata masa binaan projek kami telah dikurangkan beberapa kali (bergantung pada bilangan kebergantungan pada projek, tetapi purata projek mula dipasang dalam 1 minit dan bukannya 5 minit).

Semua ini, sudah tentu, hanya masuk akal jika anda mempunyai pelayan CI/CD dalaman anda sendiri, yang anda sokong sendiri. Tetapi kini terdapat banyak perkhidmatan awan di mana semua masalah ini diselesaikan dan anda tidak perlu risau mengenainya, dan sifat pemasangan yang diperlukan juga boleh ditentukan dalam tetapan projek.

Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Log masuk, Sama-sama.

Adakah anda menyimpan sistem CI/CD anda secara dalaman atau menggunakan perkhidmatan pihak ketiga?

  • Kami menggunakan pelayan dalaman

  • Kami menggunakan perkhidmatan luaran

  • Kami tidak menggunakan CI/CD

  • Lain-lain

42 pengguna telah mengundi. 16 pengguna berpantang.

Sumber: www.habr.com

Tambah komen