Ketika mengembangkan proyek untuk platform Android, bahkan yang terkecil, cepat atau lambat, harus berurusan dengan lingkungan pengembangan. Selain Android SDK, Anda memerlukan versi terbaru Kotlin, Gradle, platform-tools, build-tools. Dan jika pada mesin pengembang semua dependensi ini diselesaikan sebagian besar menggunakan Android Studio IDE, maka pada server CI / CD setiap pembaruan dapat berubah menjadi sakit kepala. Dan jika dalam pengembangan web, Docker menjadi solusi standar untuk masalah lingkungan, lalu mengapa tidak mencoba untuk memecahkan masalah serupa dengan itu dalam pengembangan Android ...
Bagi mereka yang tidak tahu apa itu Docker - jika itu cukup sederhana, maka ini adalah alat yang disebut-buat βContainersβ di mana kernel OS minimum dan set perangkat lunak yang diperlukan terkandung, yang dapat kami sebarkan di mana pun kami inginkan, sambil menjaga lingkungan. Apa tepatnya yang akan ada dalam wadah kami didefinisikan dalam Dockerfile, yang kemudian dirakit menjadi gambar yang diluncurkan di mana saja dan memiliki properti idempotensi.
Proses instalasi dan dasar-dasar Docker dijelaskan dengan sempurna di
situs resminya . Oleh karena itu, berjalan sedikit di depan, di sini kita memiliki 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"
Kami menyimpannya di folder dengan proyek Android kami dan memulai perakitan wadah dengan perintah
docker build -t android-build:5.4-28-27 .
Opsi -t menentukan tag atau nama kontainer kami, yang biasanya terdiri dari nama dan versinya. Dalam kasus kami, kami menyebutnya android-build, dan dalam versi tersebut kami menentukan satu set versi gradle, android-SDK dan platform-tools. Di masa mendatang, akan lebih mudah bagi kita untuk mencari gambar yang kita butuhkan dengan nama menggunakan "versi" ini.
Setelah perakitan berlalu, kita dapat menggunakan gambar kita secara lokal, kita dapat mengunggahnya dengan
perintah push docker ke repositori gambar publik atau pribadi untuk mengunduhnya ke mesin lain.
Sebagai contoh, kami mengumpulkan proyek secara lokal. Untuk melakukan ini, jalankan perintah di folder proyek
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebug
Mari kita lihat apa artinya:
docker run - perintah peluncuran gambar itu sendiri
-rm - berarti setelah menghentikan wadah, ia menghilangkan semua yang diciptakan dalam proses kehidupannya
-v "$ PWD": / home / gradle / -
me -mount folder saat ini dengan proyek Android kami ke folder internal wadah / home / gradle /
-w / home / gradle - mengatur direktori kerja container
android-build: 5.4.1-28-27 - nama wadah kami yang kami kumpulkan
gradle assembleDebug - sebenarnya tim pembangun yang membangun proyek kami
Jika semuanya berjalan dengan baik, maka setelah beberapa detik / menit Anda akan melihat sesuatu di layar seperti
BUILD SUCCESSFUL dalam 8m 3s ! Dan di folder aplikasi / build / output / apk akan menjadi aplikasi yang dirakit.
Dengan cara yang sama, Anda dapat melakukan tugas gradle lainnya - periksa proyek, jalankan tes, dll. Keuntungan utama adalah bahwa jika Anda perlu membangun proyek di mesin lain, kami tidak perlu khawatir tentang menginstal seluruh lingkungan dan itu akan cukup untuk mengunduh gambar yang diperlukan dan menjalankan perakitan di dalamnya.
Kontainer tidak menyimpan perubahan apa pun, dan setiap perakitan dimulai dari awal, yang di satu sisi menjamin identitas perakitan terlepas dari di mana diluncurkan, di sisi lain, setiap kali Anda harus mengunduh semua dependensi dan mengkompilasi semua kode lagi, dan ini kadang-kadang bisa memakan waktu yang cukup lama. Oleh karena itu, selain start "dingin" yang biasa, kami memiliki opsi untuk memulai perakitan sambil mempertahankan yang disebut. "Cache", tempat kita menyimpan folder ~ / .gradle hanya dengan menyalinnya ke folder kerja proyek, dan di awal bangunan selanjutnya kita mengembalikannya. Kami menempatkan semua prosedur penyalinan ke dalam skrip terpisah dan perintah peluncuran itu sendiri mulai terlihat 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, waktu perakitan proyek rata-rata untuk kami berkurang beberapa kali (tergantung pada jumlah dependensi pada proyek, tetapi proyek rata-rata dengan demikian mulai berkumpul dalam 1 menit, bukannya 5 menit).
Semua ini dengan sendirinya masuk akal hanya jika Anda memiliki server CI / CD internal Anda sendiri, yang mana Anda sendiri terlibat. Tetapi sekarang ada banyak layanan cloud di mana semua masalah ini telah diselesaikan dan Anda tidak perlu khawatir tentang hal ini dan Anda juga dapat menentukan properti perakitan yang diperlukan dalam pengaturan proyek.