بناء مشروع Android في حاوية Docker

عند تطوير مشروع لمنصة Android، حتى لو كان مشروعًا صغيرًا، سيتعين عليك عاجلاً أم آجلاً التعامل مع بيئة التطوير. بالإضافة إلى Android SDK، من الضروري أن يكون لديك أحدث إصدار من Kotlin وGradle وأدوات النظام الأساسي وأدوات البناء. وإذا تم حل جميع هذه التبعيات على جهاز المطور إلى حد كبير باستخدام Android Studio IDE، فيمكن أن يتحول كل تحديث على خادم CI/CD إلى صداع. وإذا أصبح 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 والمنصة. في المستقبل، سيكون من الأسهل علينا البحث عن الصورة التي نحتاجها بالاسم باستخدام هذا "الإصدار".

بعد اكتمال التجميع، يمكننا استخدام صورتنا محليًا، ويمكننا تنزيلها باستخدام الأمر دفع عامل ميناء إلى مستودع صور عام أو خاص لتنزيله على أجهزة أخرى.

على سبيل المثال، دعونا نبني مشروعًا محليًا. للقيام بذلك، في المجلد مع المشروع، قم بتشغيل الأمر

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 — يحدد دليل العمل للحاوية
بناء الروبوت: 5.4.1-28-27 - اسم الحاوية التي جمعناها
Gradle AssemblyDebug — فريق التجميع الفعلي الذي يقوم بتجميع مشروعنا

إذا سارت الأمور على ما يرام، ففي غضون ثوانٍ/دقائق، سترى شيئًا كهذا على شاشتك بناء ناجح في 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 دقائق).

كل هذا، بالطبع، يكون منطقيًا فقط إذا كان لديك خادم CI/CD داخلي خاص بك، والذي تدعمه بنفسك. ولكن الآن هناك العديد من الخدمات السحابية التي يتم فيها حل كل هذه المشكلات ولا داعي للقلق بشأنها، ويمكن أيضًا تحديد خصائص التجميع الضرورية في إعدادات المشروع.

يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. تسجيل الدخول، من فضلك.

هل تحتفظ بنظام CI/CD الخاص بك داخل الشركة أم تستخدم خدمة طرف ثالث؟

  • نحن نستخدم خادم داخلي

  • نحن نستخدم خدمة خارجية

  • نحن لا نستخدم CI/CD

  • آخر

صوّت 42 مستخدمًا. امتنع 16 مستخدما عن التصويت.

المصدر: www.habr.com

إضافة تعليق