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
# Π’.ΠΊ. ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ 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.
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