สร้างโครงการ Android ในคอนเทนเนอร์ Docker

เมื่อพัฒนาโครงการสำหรับแพลตฟอร์ม Android แม้แต่โครงการที่เล็กที่สุดไม่ช้าก็เร็วคุณต้องจัดการกับสภาพแวดล้อมการพัฒนา นอกจาก Android SDK แล้ว จำเป็นต้องมีเวอร์ชันล่าสุดของ Kotlin, Gradle, platform-tools, build-tools และหากในเครื่องของผู้พัฒนาการพึ่งพาเหล่านี้ทั้งหมดได้รับการแก้ไขในระดับที่มากขึ้นโดยใช้ Android Studio IDE จากนั้นบนเซิร์ฟเวอร์ CI / CD การอัปเดตแต่ละครั้งอาจทำให้ปวดหัวได้ และถ้าในการพัฒนาเว็บ Docker กลายเป็นวิธีแก้ปัญหาสภาพแวดล้อมมาตรฐานแล้วทำไมไม่ลองแก้ปัญหาที่คล้ายกันในการพัฒนา Android ...

สำหรับผู้ที่ไม่ทราบว่า Docker คืออะไร - ถ้ามันค่อนข้างง่ายนี่เป็นเครื่องมือสำหรับสร้างสิ่งที่เรียกว่า "คอนเทนเนอร์" ซึ่งบรรจุเคอร์เนล OS ขั้นต่ำและชุดซอฟต์แวร์ที่จำเป็น ซึ่งเราสามารถนำไปใช้ได้ทุกที่ที่ต้องการ ในขณะที่ยังคงรักษาสภาพแวดล้อม สิ่งที่จะอยู่ในคอนเทนเนอร์ของเรานั้นถูกกำหนดใน Dockerfile ซึ่งจะประกอบเป็นอิมเมจที่สามารถเปิดใช้งานได้ทุกที่และมีคุณสมบัติ idempotency

ขั้นตอนการติดตั้งและพื้นฐานของ 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 ในอนาคต เราจะค้นหาภาพที่ต้องการโดยใช้ชื่อโดยใช้ "เวอร์ชัน" ดังกล่าวได้ง่ายขึ้น

หลังจาก build เสร็จ เราสามารถใช้ image ของเราในเครื่องได้ โดยเราสามารถดาวน์โหลดได้ด้วยคำสั่ง นักเทียบท่า ไปยังที่เก็บรูปภาพสาธารณะหรือส่วนตัวเพื่อดาวน์โหลดไปยังเครื่องอื่น

ตัวอย่างเช่น ลองสร้างโครงการในพื้นที่ เมื่อต้องการทำเช่นนี้ ในโฟลเดอร์โครงการ ให้รันคำสั่ง

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

ลองหาความหมาย:

เรือเทียบท่า - คำสั่งเปิดภาพเอง
-rm - หมายความว่าหลังจากหยุดคอนเทนเนอร์ มันจะลบทุกอย่างที่สร้างขึ้นในช่วงอายุของมัน
-v "$PWD":/home/gradle/ - ติดตั้งโฟลเดอร์ปัจจุบันกับโครงการ Android ของเราไปยังโฟลเดอร์ภายในของคอนเทนเนอร์ /home/gradle/
-w /home/gradle - ตั้งค่าไดเร็กทอรีการทำงานของคอนเทนเนอร์
android-build:5.4.1-28-27 - ชื่อคอนเทนเนอร์ของเราที่เรารวบรวมไว้
gradle ประกอบดีบั๊ก - ทีมสร้างเองซึ่งรวบรวมโครงการของเรา

หากทุกอย่างเป็นไปด้วยดีหลังจากนั้นสองสามวินาที / นาทีคุณจะเห็นสิ่งนี้ สร้างสำเร็จใน 8 นาที 3 วินาที! และในโฟลเดอร์ app/build/output/apk จะมีแอพพลิเคชั่นประกอบ

ในทำนองเดียวกัน คุณสามารถดำเนินการไล่ระดับสีอื่นๆ ได้ เช่น ตรวจสอบโครงการ รันการทดสอบ ฯลฯ ข้อได้เปรียบหลักคือหากเราต้องการสร้างโปรเจ็กต์บนเครื่องอื่น เราไม่จำเป็นต้องกังวลเกี่ยวกับการติดตั้งสภาพแวดล้อมทั้งหมด และการดาวน์โหลดอิมเมจที่จำเป็นและเรียกใช้บิลด์ในนั้นก็เพียงพอแล้ว

คอนเทนเนอร์ไม่ได้เก็บการเปลี่ยนแปลงใดๆ และแต่ละแอสเซมบลีจะถูกเรียกใช้ตั้งแต่เริ่มต้น ซึ่งในแง่หนึ่ง รับประกันตัวตนของแอสเซมบลีไม่ว่าจะเปิดใช้งานที่ใด ในทางกลับกัน ทุกครั้งที่คุณต้องดาวน์โหลดการอ้างอิงทั้งหมดและคอมไพล์โค้ดทั้งหมดอีกครั้ง และบางครั้งอาจใช้เวลานานพอสมควร ดังนั้นนอกเหนือจากการสตาร์ทแบบ "เย็น" ตามปกติแล้ว เรายังมีทางเลือกในการเริ่มการประกอบในขณะที่ยังคงรักษาสิ่งที่เรียกว่า "แคช" ที่เราบันทึกโฟลเดอร์ ~/.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 รายงดออกเสียง

ที่มา: will.com

เพิ่มความคิดเห็น