Xây dựng dự án Android trong vùng chứa Docker

Khi phát triển một dự án cho nền tảng Android, dù là dự án nhỏ nhất, sớm hay muộn bạn cũng phải đối phó với môi trường phát triển. Ngoài Android SDK thì cần phải có Kotlin, Gradle, platform-tools, build-tools phiên bản mới nhất. Và nếu trên máy của nhà phát triển, tất cả các phụ thuộc này được giải quyết ở mức độ lớn hơn bằng cách sử dụng Android Studio IDE, thì trên máy chủ CI / CD, mỗi bản cập nhật có thể trở thành một vấn đề đau đầu. Và nếu trong phát triển web, Docker đã trở thành giải pháp tiêu chuẩn cho vấn đề môi trường, thì tại sao bạn không thử giải quyết vấn đề tương tự với nó trong phát triển Android ...

Đối với những người không biết Docker là gì - nếu nó khá đơn giản, thì đây là một công cụ để tạo cái gọi là. "Các thùng chứa" chứa nhân hệ điều hành tối thiểu và bộ phần mềm cần thiết mà chúng tôi có thể triển khai ở bất cứ đâu chúng tôi muốn trong khi vẫn duy trì môi trường. Chính xác những gì sẽ có trong vùng chứa của chúng tôi được xác định trong Dockerfile, tệp này sau đó được tập hợp thành một hình ảnh có thể được khởi chạy ở bất kỳ đâu và có các thuộc tính bình thường.

Quá trình cài đặt và kiến ​​thức cơ bản về Docker được mô tả rất hay trên trang web chính thức. Do đó, nhìn về phía trước một chút, chúng ta có một Dockerfile như vậy

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

Chúng tôi lưu nó vào thư mục với dự án Android của chúng tôi và bắt đầu xây dựng vùng chứa bằng lệnh

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

Thông số -t đặt thẻ hoặc tên vùng chứa của chúng tôi, thường bao gồm tên và phiên bản của nó. Trong trường hợp của chúng tôi, chúng tôi gọi nó là android-build và trong phiên bản chúng tôi đã chỉ định kết hợp các phiên bản gradle, android-sdk và công cụ nền tảng. Trong tương lai, chúng tôi sẽ dễ dàng tìm kiếm hình ảnh mình cần theo tên hơn bằng cách sử dụng một “phiên bản” như vậy.

Sau khi quá trình xây dựng hoàn tất, chúng tôi có thể sử dụng hình ảnh của mình cục bộ, chúng tôi có thể tải xuống bằng lệnh đẩy docker đến một kho lưu trữ hình ảnh công khai hoặc riêng tư để tải nó xuống các máy khác.

Ví dụ, hãy xây dựng một dự án cục bộ. Để làm điều này, trong thư mục dự án, hãy chạy lệnh

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

Hãy tìm hiểu ý nghĩa của nó:

bến tàu chạy - chính lệnh khởi chạy hình ảnh
-rm - có nghĩa là sau khi dừng vùng chứa, nó sẽ xóa mọi thứ đã được tạo trong suốt vòng đời của nó
-v "$PWD":/home/gradle/ - gắn thư mục hiện tại với dự án Android của chúng ta vào thư mục bên trong của bộ chứa /home/gradle/
-w /nhà/lớp - đặt thư mục làm việc của vùng chứa
android-build:5.4.1-28-27 - tên của container của chúng tôi mà chúng tôi đã thu thập
gradle lắp rápDebug - chính nhóm xây dựng, nhóm lắp ráp dự án của chúng tôi

Nếu mọi thứ suôn sẻ, thì sau vài giây/phút, bạn sẽ thấy một cái gì đó giống như XÂY DỰNG THÀNH CÔNG trong 8 phút 3 giây! Và trong thư mục app/build/output/apk sẽ có một ứng dụng đã được lắp ráp.

Tương tự, bạn có thể thực hiện các tác vụ cấp độ khác - kiểm tra dự án, chạy thử nghiệm, v.v. Ưu điểm chính là nếu chúng ta cần xây dựng dự án trên bất kỳ máy nào khác, chúng ta không cần phải lo lắng về việc cài đặt toàn bộ môi trường và chỉ cần tải xuống hình ảnh cần thiết và chạy bản dựng trong đó là đủ.

Vùng chứa không lưu trữ bất kỳ thay đổi nào và mỗi tập hợp được khởi chạy từ đầu, điều này một mặt đảm bảo danh tính của tập hợp bất kể nó được khởi chạy ở đâu, mặt khác, mỗi khi bạn phải tải xuống tất cả các phụ thuộc và biên dịch lại tất cả mã và điều này đôi khi có thể mất một lượng thời gian đáng kể. Do đó, ngoài khởi động "nguội" thông thường, chúng tôi có tùy chọn khởi động lắp ráp trong khi duy trì cái gọi là. "bộ đệm", nơi chúng tôi lưu thư mục ~/.gradle bằng cách sao chép nó vào thư mục làm việc của dự án và khi bắt đầu bản dựng tiếp theo, chúng tôi sẽ trả lại thư mục đó. Chúng tôi đã chuyển tất cả các quy trình sao chép thành các tập lệnh riêng biệt và bản thân lệnh khởi chạy bắt đầu trông như thế này

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"

Do đó, thời gian xây dựng dự án trung bình đã giảm đi nhiều lần (tùy thuộc vào số lượng phụ thuộc vào dự án, nhưng do đó, dự án trung bình bắt đầu xây dựng trong 1 phút thay vì 5 phút).

Bản thân tất cả điều này chỉ có ý nghĩa nếu bạn có máy chủ CI / CD nội bộ của riêng mình do chính bạn hỗ trợ. Nhưng hiện nay có rất nhiều dịch vụ đám mây trong đó tất cả những vấn đề này đều được giải quyết và bạn không phải lo lắng về điều đó, đồng thời các thuộc tính bản dựng cần thiết cũng có thể được chỉ định trong cài đặt dự án.

Chỉ những người dùng đã đăng ký mới có thể tham gia khảo sát. Đăng nhập, xin vui lòng.

Bạn giữ hệ thống CI/CD của mình bên trong hay sử dụng dịch vụ của bên thứ ba

  • Sử dụng máy chủ nội bộ

  • Sử dụng dịch vụ bên ngoài

  • Chúng tôi không sử dụng CI/CD

  • Khác

42 người dùng bình chọn. 16 người dùng bỏ phiếu trắng.

Nguồn: www.habr.com

Thêm một lời nhận xét