เมื่อพัฒนาโครงการสำหรับแพลตฟอร์ม Android แม้แต่โครงการที่เล็กที่สุดไม่ช้าก็เร็วคุณต้องจัดการกับสภาพแวดล้อมการพัฒนา นอกจาก Android SDK แล้ว จำเป็นต้องมีเวอร์ชันล่าสุดของ Kotlin, Gradle, platform-tools, build-tools และหากในเครื่องของผู้พัฒนาการพึ่งพาเหล่านี้ทั้งหมดได้รับการแก้ไขในระดับที่มากขึ้นโดยใช้ Android Studio IDE จากนั้นบนเซิร์ฟเวอร์ CI / CD การอัปเดตแต่ละครั้งอาจทำให้ปวดหัวได้ และถ้าในการพัฒนาเว็บ Docker กลายเป็นวิธีแก้ปัญหาสภาพแวดล้อมมาตรฐานแล้วทำไมไม่ลองแก้ปัญหาที่คล้ายกันในการพัฒนา Android ...
สำหรับผู้ที่ไม่ทราบว่า Docker คืออะไร - ถ้ามันค่อนข้างง่ายนี่เป็นเครื่องมือสำหรับสร้างสิ่งที่เรียกว่า "คอนเทนเนอร์" ซึ่งบรรจุเคอร์เนล OS ขั้นต่ำและชุดซอฟต์แวร์ที่จำเป็น ซึ่งเราสามารถนำไปใช้ได้ทุกที่ที่ต้องการ ในขณะที่ยังคงรักษาสภาพแวดล้อม สิ่งที่จะอยู่ในคอนเทนเนอร์ของเรานั้นถูกกำหนดใน Dockerfile ซึ่งจะประกอบเป็นอิมเมจที่สามารถเปิดใช้งานได้ทุกที่และมีคุณสมบัติ idempotency
ขั้นตอนการติดตั้งและพื้นฐานของ Docker มีคำอธิบายไว้อย่างสวยงาม
# Т.к. основным инструментом для сборки 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