Android-projektin rakentaminen Docker-säilöön

Kun kehität projektia Android-alustalle, jopa pienintä, joudut ennemmin tai myöhemmin käsittelemään kehitysympäristöä. Android SDK:n lisäksi tarvitaan uusin versio Kotlinista, Gradlesta, alusta-työkaluista, rakennustyökaluista. Ja jos kehittäjän koneessa kaikki nämä riippuvuudet ratkaistaan ​​suuremmassa määrin Android Studio IDE:n avulla, CI / CD-palvelimella jokainen päivitys voi muuttua päänsärkyksi. Ja jos verkkokehityksessä Dockerista on tullut standardiratkaisu ympäristöongelmaan, niin miksi ei yritä ratkaista samanlaista ongelmaa sen kanssa Android-kehityksessä ...

Niille, jotka eivät tiedä mitä Docker on - jos se on melko yksinkertaista, niin tämä on työkalu ns. "Säilöt", jotka sisältävät vähimmäiskäyttöjärjestelmän ytimen ja tarvittavat ohjelmistot, joita voimme ottaa käyttöön missä tahansa, ympäristöä ylläpitäen. Se, mitä kontissamme tarkalleen tulee olemaan, määritetään Docker-tiedostossa, joka sitten kootaan kuvaksi, joka voidaan käynnistää missä tahansa ja jolla on idempotenssiominaisuudet.

Dockerin asennusprosessi ja perusteet on kuvattu täydellisesti hänen teoksessaan virallisilla verkkosivuilla. Siksi, katsoen hieman eteenpäin, tämä on Docker-tiedosto, johon päädyimme:

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

Tallennamme sen Android-projektimme kansioon ja aloitamme kontin rakentamisen komennolla

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

Parametri -t määrittää säilömme tagin tai nimen, joka yleensä koostuu sen nimestä ja versiosta. Meidän tapauksessamme kutsuimme sitä android-buildiksi ja versiossa määritimme yhdistelmän gradle-, android-sdk- ja platform-tools-versioita. Tulevaisuudessa meidän on helpompi etsiä tarvitsemamme kuvaa nimellä käyttämällä tällaista "versiota".

Kun rakenne on ohi, voimme käyttää kuvaamme paikallisesti, voimme ladata sen komennolla telakoitsijan työntö julkiseen tai yksityiseen kuvavarastoon ladataksesi sen muille koneille.

Rakennataanpa esimerkiksi paikallinen projekti. Suorita tämä projektikansiossa komento

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

Selvitetään mitä se tarkoittaa:

telakointi - itse kuvan käynnistyskomento
-rm - tarkoittaa, että kontin pysäyttämisen jälkeen se poistaa kaiken sen käyttöiän aikana luodun
-v "$PWD":/home/gradle/ - liittää nykyisen kansion Android-projektimme kanssa säilön sisäiseen kansioon /home/gradle/
-w /koti/luokka - määrittää kontin työhakemiston
Android-versio: 5.4.1-28-27 - keräämämme säiliömme nimi
gradle assembleDebug - itse rakennustiimi, joka kokoaa projektimme

Jos kaikki menee hyvin, muutaman sekunnin / minuutin kuluttua näet jotain tällaista RAKENTAA MENESTYKSESSÄ 8 m 3 sekunnissa! Ja app/build/output/apk-kansio sisältää kootun sovelluksen.

Vastaavasti voit suorittaa muita gradle-tehtäviä - tarkistaa projektin, suorittaa testejä jne. Suurin etu on, että jos meidän on rakennettava projekti jollekin muulle koneelle, meidän ei tarvitse huolehtia koko ympäristön asentamisesta, vaan riittää, että lataat tarvittavan kuvan ja suoritamme koontiversion siinä.

Säilö ei tallenna muutoksia, ja jokainen kokoonpano käynnistetään tyhjästä, mikä toisaalta takaa kokoonpanon identiteetin riippumatta siitä, missä se käynnistetään, toisaalta aina, kun joudut lataamaan kaikki riippuvuudet ja käännä koko koodi uudelleen, ja tämä voi joskus viedä huomattavasti aikaa. Siksi meillä on tavanomaisen "kylmäkäynnistyksen" lisäksi mahdollisuus käynnistää kokoonpano säilyttäen ns. "välimuisti", johon tallennamme ~/.gradle-kansion yksinkertaisesti kopioimalla sen projektin työkansioon ja seuraavan koontiversion alussa palautamme sen takaisin. Siirsimme kaikki kopiointitoimenpiteet erillisiin skripteihin ja itse käynnistyskomento alkoi näyttää tältä

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"

Tämän seurauksena projektin keskimääräinen rakennusaika lyheni useita kertoja (riippuen projektiriippuvuuksien määrästä, mutta keskimääräinen projekti alkoi siten rakentaa 1 minuutissa 5 minuutin sijaan).

Kaikessa tässä itsessään on järkeä vain, jos sinulla on oma sisäinen CI / CD-palvelin, jota tuet itse. Mutta nyt on monia pilvipalveluita, joissa kaikki nämä ongelmat ratkeavat, eikä sinun tarvitse huolehtia siitä, ja tarvittavat rakennusominaisuudet voidaan myös määrittää projektiasetuksissa.

Vain rekisteröityneet käyttäjät voivat osallistua kyselyyn. Kirjaudu sisään, ole kiltti.

Pidätkö CI/CD-järjestelmäsi talossa vai käytätkö kolmannen osapuolen palvelua?

  • Käytämme sisäistä palvelinta

  • Käytämme ulkopuolista palvelua

  • Emme käytä CI/CD:tä

  • Muut

42 käyttäjää äänesti. 16 käyttäjää pidättyi äänestämästä.

Lähde: will.com

Lisää kommentti