Kapag bumubuo ng isang proyekto para sa platform ng Android, kahit na ang pinakamaliit, maaga o huli kailangan mong harapin ang kapaligiran ng pag-unlad. Bilang karagdagan sa Android SDK, kinakailangang magkaroon ng pinakabagong bersyon ng Kotlin, Gradle, platform-tools, build-tools. At kung sa makina ng developer ang lahat ng mga dependency na ito ay malulutas sa mas malaking lawak gamit ang Android Studio IDE, kung gayon sa CI/CD server ang bawat update ay maaaring maging sakit ng ulo. At kung sa web development Docker ay naging karaniwang solusyon sa problema sa kapaligiran, kung gayon bakit hindi subukang lutasin ang isang katulad na problema sa pag-unlad ng Android gamit ito...
Para sa mga hindi alam kung ano ang Docker, upang ilagay ito nang simple, ito ay isang tool para sa paglikha ng tinatawag na. "mga lalagyan" na naglalaman ng kaunting OS kernel at ang kinakailangang hanay ng software na maaari naming i-deploy saanman namin gusto, habang pinapanatili ang kapaligiran. Ano ang eksaktong magiging sa aming lalagyan ay tinutukoy sa Dockerfile, na pagkatapos ay i-assemble sa isang imahe na maaaring ilunsad kahit saan at may mga katangian ng idempotency.
Ang proseso ng pag-install at mga pangunahing kaalaman ng Docker ay perpektong inilarawan sa kanyang
# Π’.ΠΊ. ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ 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"
Ise-save namin ito sa folder gamit ang aming proyekto sa Android at simulan ang pagbuo ng container gamit ang command
docker build -t android-build:5.4-28-27 .
Parametro -t tumutukoy sa tag o pangalan ng aming container, na karaniwang binubuo ng pangalan at bersyon nito. Sa aming kaso, tinawag namin itong android-build at sa bersyon ay nagpahiwatig kami ng isang hanay ng mga bersyon ng gradle, android-sdk at platform-tools. Sa hinaharap, magiging mas madali para sa amin na maghanap para sa imahe na kailangan namin sa pamamagitan ng pangalan gamit ang "bersyon" na ito.
Matapos makumpleto ang pagpupulong, maaari naming gamitin ang aming imahe nang lokal, maaari naming i-download ito gamit ang utos tulak ng docker sa isang pampubliko o pribadong imbakan ng imahe upang i-download ito sa iba pang mga makina.
Bilang halimbawa, bumuo tayo ng isang proyekto sa lokal. Upang gawin ito, sa folder na may proyekto, patakbuhin ang command
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebug
Alamin natin kung ano ang ibig sabihin nito:
docker run - ang image launch command mismo
-rm β nangangahulugan na pagkatapos huminto ang lalagyan, tatanggalin nito ang lahat ng nilikha sa panahon ng buhay nito
-v "$PWD":/home/gradle/ β ini-mount ang kasalukuyang folder kasama ang aming proyekto sa Android sa panloob na folder ng container /home/gradle/
-w /home/gradle β tumutukoy sa gumaganang direktoryo ng lalagyan
android-build:5.4.1-28-27 β ang pangalan ng aming lalagyan na aming nakolekta
gradle assembleDebug β ang aktwal na pangkat ng pagpupulong na nagtitipon ng aming proyekto
Kung maayos ang lahat, pagkatapos ay sa loob ng ilang segundo/minuto makikita mo sa iyong screen ang isang katulad MAGBUO NG MATAGUMPAY sa 8m 3s! At ang folder ng app/build/output/apk ay maglalaman ng naka-assemble na application.
Maaari kang magsagawa ng iba pang mga gawain sa gradle sa katulad na paraan - suriin ang proyekto, magpatakbo ng mga pagsubok, atbp. Ang pangunahing bentahe ay kung kailangan nating buuin ang proyekto sa anumang iba pang makina, hindi natin kailangang mag-alala tungkol sa pag-install ng buong kapaligiran at sapat na upang i-download ang kinakailangang imahe at patakbuhin ang build dito.
Ang lalagyan ay hindi nag-iimbak ng anumang mga pagbabago, at ang bawat pagpupulong ay inilunsad mula sa simula, na, sa isang banda, ginagarantiyahan ang pagkakakilanlan ng pagpupulong kahit saan ito ilunsad, sa kabilang banda, sa bawat oras na kailangan mong i-download ang lahat ng mga dependency at i-compile muli ang lahat ng code, at ito ay maaaring tumagal ng makabuluhang oras. Samakatuwid, bilang karagdagan sa karaniwang "malamig" na pagsisimula, mayroon kaming opsyon na simulan ang build habang ini-save ang tinatawag na. "cache", kung saan ise-save namin ang ~/.gradle folder sa pamamagitan lamang ng pagkopya nito sa gumaganang folder ng proyekto, at sa simula ng susunod na build ibinabalik namin ito. Inilipat namin ang lahat ng mga pamamaraan sa pagkopya sa magkakahiwalay na mga script at ang utos ng paglunsad mismo ay nagsimulang magmukhang ganito
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"
Bilang resulta, ang aming average na oras ng pagbuo ng proyekto ay nabawasan nang maraming beses (depende sa bilang ng mga dependency sa proyekto, ngunit ang average na proyekto ay nagsimulang tipunin sa loob ng 1 minuto sa halip na 5 minuto).
Ang lahat ng ito, siyempre, ay may katuturan lamang kung mayroon kang sariling panloob na CI/CD server, na sinusuportahan mo ang iyong sarili. Ngunit ngayon mayroong maraming mga serbisyo sa ulap kung saan ang lahat ng mga problemang ito ay nalutas at hindi mo kailangang mag-alala tungkol dito, at ang mga kinakailangang katangian ng pagpupulong ay maaari ding tukuyin sa mga setting ng proyekto.
Ang mga rehistradong user lamang ang maaaring lumahok sa survey.
In-house mo ba ang iyong CI/CD system o gumagamit ng third party na serbisyo?
-
Gumagamit kami ng panloob na server
-
Gumagamit kami ng panlabas na serbisyo
-
Hindi kami gumagamit ng CI/CD
-
Iba
42 na user ang bumoto. 16 user ang umiwas.
Pinagmulan: www.habr.com