在 Docker 容器中構建 Android 項目

在為 Android 平台開發項目時,即使是最小的項目,遲早您都必須處理開發環境。 除了Android SDK之外,還需要有最新版本的Kotlin、Gradle、platform-tools、build-tools。 如果在開發人員的機器上使用 Android Studio IDE 更大程度地解決了所有這些依賴關係,那麼在 CI/CD 服務器上,每次更新都會變得令人頭疼。 如果在 Web 開發中,Docker 已經成為環境問題的標準解決方案,那麼為什麼不在 Android 開發中嘗試用它來解決類似的問題......

對於那些不知道 Docker 是什麼的人 - 如果它非常簡單,那麼這是一個用於創建所謂的工具。 “容器”包含最小的操作系統內核和必要的軟件集,我們可以將其部署到任何我們想要的地方,同時維護環境。 我們的容器中到底包含什麼內容由 Dockerfile 決定,然後將其組裝成一個可以在任何地方啟動並具有冪等性的鏡像。

他的網站上對 Docker 的安裝過程和基礎知識進行了精彩的描述 官方網站。 因此,稍微往前看,我們就有了這樣一個 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"

我們將其保存到 Android 項目所在的文件夾中,並使用以下命令開始構建容器

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

參數 -t 設置容器的標籤或名稱,通常由其名稱和版本組成。 在我們的例子中,我們將其稱為 android-build,並在版本中指定了 gradle、android-sdk 和 platform-tools 版本的組合。 未來,我們使用這樣的“版本”,可以更方便地通過名字來搜索我們需要的圖片。

構建通過後,我們就可以在本地使用我們的鏡像了,我們可以使用命令下載它 碼頭工人推 到公共或私有映像存儲庫,以便將其下載到其他計算機。

作為示例,讓我們構建一個本地項目。 為此,請在項目文件夾中運行命令

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

讓我們弄清楚它的含義:

碼頭運行 - 圖像啟動命令本身
-R M - 意味著停止容器後,它會刪除其生命週期中創建的所有內容
-v“$PWD”:/home/gradle/ - 將當前的 Android 項目文件夾掛載到容器的內部文件夾 /home/gradle/
-w /home/gradle - 設置容器的工作目錄
android-build:5.4.1-28-27 - 我們收集的容器的名稱
gradle assemble調試 - 構建團隊本身,負責組裝我們的項目

如果一切順利,那麼幾秒鐘/分鐘後你會看到類似的內容 在 8 米 3 秒內成功構建! 在 app/build/output/apk 文件夾中將會有一個組裝的應用程序。

同樣,您可以執行其他 gradle 任務 - 檢查項目、運行測試等。 主要優點是,如果我們需要在任何其他機器上構建項目,我們不需要擔心安裝整個環境,下載必要的映像並在其中運行構建就足夠了。

容器不存儲任何更改,每個程序集都是從頭開始啟動的,這樣一方面保證了程序集的身份,無論在哪裡啟動,另一方面每次都必須下載所有依賴項並再次編譯所有代碼,這有時會花費大量時間。 因此,除了通常的“冷”啟動之外,我們還可以選擇在保持所謂的狀態的同時啟動組裝。 “cache”,我們通過簡單地將 ~/.gradle 文件夾複製到項目的工作文件夾來保存它,並在下一個構建開始時將其返回。 我們將所有復製過程移至單獨的腳本中,啟動命令本身開始如下所示

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"

結果,平均項目構建時間減少了數倍(取決於項目的依賴項數量,但平均項目因此開始在 1 分鐘內構建,而不是 5 分鐘)。

僅當您擁有自己支持的內部 CI/CD 服務器時,所有這一切本身才有意義。 但現在有很多雲服務,所有這些問題都得到了解決,你不必擔心,而且還可以在項目設置中指定必要的構建屬性。

只有註冊用戶才能參與調查。 登入, 請。

您將 CI/CD 系統保留在內部還是使用第三方服務

  • 使用內部服務器

  • 使用外部服務

  • 我們不使用 CI/CD

  • 其他

42 位用戶投票。 16 名用戶棄權。

來源: www.habr.com

添加評論