Izstrādājot projektu Android platformai, pat vismazākajā projektā agrāk vai vēlāk ir jāsaskaras ar izstrādes vidi. Papildus Android SDK nepieciešams, lai būtu jaunākā versija Kotlin, Gradle, platform-tools, build-tools. Un, ja izstrādātāja datorā visas šīs atkarības lielākajā daļā tiek risinātas galvenokārt ar Android Studio IDE, tad CI/CD serverī katra atjaunināšana var pārvērsties par galvassāpes. Un, ja tīmekļa izstrādē risinājums vidēm ir kļuvis par standartu - Docker, tad kāpēc gan neizmēģināt atrisināt līdzīgu problēmu arī Android izstrādē...
Pavisam vienkārši — Docker ir rīks, lai izveidotu tā sauktos «konteinerus», kuros ir minimāla operētājsistēmas kodols un nepieciešamais programmatūras komplekts, ko mēs varam izvietot, kur vēlamies, saglabājot vidi. Kas tieši būs mūsu konteinerā tiek noteikts Dockerfile, kas pēc tam tiek savākts attēlā, kuru var palaist jebkur un kas ir ar idempotences īpašībām.
Docker instalācijas process un pamati ir lieliski aprakstīti tā . Tāpēc, nedaudz izvērtējot, šāds Dockerfile mums sanāca
# Т.к. основным инструментом для сборки 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"
Saglabājam to mūsu Android projekta mapē un uzsākam konteineru būvi ar komandu
docker build -t android-build:5.4-28-27 .Parametrs -t nosaka mūsu konteineru tagu jeb nosaukumu, kas parasti sastāv no tā nosaukuma un versijas. Mūsu gadījumā mēs to noskaidrojām kā android-build, bet versijā norādījām gradle, android-sdk un platform-tools kopumu. Turpmāk mums būs vieglāk meklēt nepieciešamo attēlu pēc nosaukuma, izmantojot šādu «versiju».
Pēc tam, kad būvniecība ir pabeigta, varam izmantot mūsu attēlu lokāli, varam to augšupielādēt ar komandu docker push publiskā vai privātā attēlu repozitorijā, lai to lejuplādētu uz citām mašīnām.
Kā piemēru, apkoposim projektu lokāli. Tāpēc projekta mapē izpildīsim komandu
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebugIzpratīsim, ko tā nozīmē:
$ docker-compose up — pati komanda palaiž attēlu
-rm — nozīmē, ka pēc konteineru apstāšanās tas izdzēš visu, kas tika izveidots tā dzīves laikā
-v "$PWD":/home/gradle/ — piekļauj pašreizējo mapi ar mūsu Android projektu iekšējai mapei konteinerā /home/gradle/
-w /home/gradle — nosaka konteineru darba direktoriju
android-build:5.4.1-28-27 — mūsu konteineru nosaukums, kuru mēs izveidojām
gradle assembleDebug — pati komanda, kas apkopo mūsu projektu
Ja viss izdosies, tad pēc dažām sekundēm/minūtēm jūs redzēsiet ekrānā kaut ko līdzīgu BUILD SUCCESSFUL in 8m 3s! Un mapē app/build/output/apk atradīsies saliktais lietojums.
Līdzīgā veidā var veikt citus gradle uzdevumus — pārbaudīt projektu, palaist testus utt. Galvenā priekšrocība ir tāda, ka, ja projekta salikšanai ir nepieciešams cits dators, mums nav jāpārbauda visa vide, pietiek ar to, ka jālejupielādē nepieciešamais attēls un jāsāk salikšana.
Konteiners nesaglabā nekādas izmaiņas, un katra salikšana sākas no nulles, kas no vienas puses garantē salikšanas identitāti neatkarīgi no vietas, kur tā tiek uzsākta, bet no otras puses, katru reizi jālejupielādē visas atkarības un jāsagatavo viss kods no jauna, un tas dažreiz var aizņemt ievērojamu laiku. Tāpēc, izņemot parasto "auksto" palaišanu, mums ir iespēja uzsākt salikšanu, saglabājot tā dēvēto "kešu", kur mēs saglabājam mapi ~/ .gradle, vienkārši kopējot to projekta darba mapē, un nākamās salikšanas sākumā atgriežam to atpakaļ. Visas kopēšanas procedūras mēs esam izdalījuši atsevišķos skriptos, un pati palaišanas komanda mums izskatās tā
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"Kopumā vidējais projekta salikšanas laiks ir samazinājies vairākas reizes (atkarībā no atkarību skaita projektā, bet vidējais projekts tādā veidā sāka salikties 1 minūtes laikā, nevis 5 minūšu).
Visas šīs lietas noteikti ir jēgpilnas tikai tad, ja jums ir savs iekšējais CI/CD servers, par kuru jūs paši rūpējaties. Bet šobrīd ir daudz mākoņpakalpojumu, kur visus šos jautājumus atrisina, un jums par to nevajag uztraukties, un nepieciešamās salikšanas īpašības var arī norādīt projekta iestatījumos.
Tikai reģistrētie lietotāji var piedalīties aptaujā. , lūdzu.
Vai jūs turat CI/CD sistēmu iekšēji vai izmantojat trešo pušu pakalpojumu
Izmantojam iekšējo serveri
Izmatojam ārējo pakalpojumu
Neizmantojam CI/CD
Cits
Balsojuši 42 lietotāji. Atturējušies 16 lietotāji.
Avots: habr.com
