ساخت پروژه اندروید در کانتینر Docker

هنگام توسعه یک پروژه برای پلتفرم اندروید، حتی کوچکترین آن، دیر یا زود باید با محیط توسعه دست و پنجه نرم کنید. علاوه بر Android SDK، داشتن آخرین نسخه Kotlin، Gradle، platform-tools، build-tools ضروری است. و اگر در دستگاه توسعه دهنده تمام این وابستگی ها با استفاده از Android Studio IDE به میزان بیشتری حل شود، در سرور CI / CD، هر به روز رسانی می تواند به یک سردرد تبدیل شود. و اگر در توسعه وب، Docker به راه حل استاندارد برای مشکل محیطی تبدیل شده است، پس چرا سعی نکنید مشکل مشابهی را با آن در توسعه اندروید حل کنید ...

برای کسانی که نمی دانند Docker چیست - اگر کاملاً ساده است ، این ابزاری برای ایجاد به اصطلاح است. "Containers" که حاوی حداقل هسته سیستم عامل و مجموعه نرم افزارهای لازم است که می توانیم با حفظ محیط، هر کجا که بخواهیم مستقر کنیم. اینکه دقیقاً چه چیزی در ظرف ما خواهد بود، در 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"

با پروژه اندروید خود آن را در پوشه ذخیره می کنیم و با دستور شروع به ساخت کانتینر می کنیم

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

بیایید بفهمیم معنی آن چیست:

دكتر اجرا كننده - خود فرمان راه اندازی تصویر
-رم - به این معنی است که پس از توقف ظرف، هر آنچه در طول عمر خود ایجاد شده است را حذف می کند
-v "$PWD":/home/gradle/ - پوشه فعلی را با پروژه Android ما در پوشه داخلی کانتینر /home/gradle/ نصب می کند
-w /home/gradle - دایرکتوری کاری کانتینر را مشخص می کند
اندروید بیلد: 5.4.1-28-27 - نام ظرف ما که جمع آوری کردیم
gradle assembleDebug - تیم مونتاژ واقعی که پروژه ما را مونتاژ می کند

اگر همه چیز خوب پیش برود، پس از چند ثانیه / دقیقه چیزی شبیه به آن را خواهید دید ساخت موفقیت آمیز در 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"

در نتیجه، میانگین زمان ساخت پروژه چندین برابر کاهش یافت (بسته به تعداد وابستگی‌های پروژه، اما متوسط ​​پروژه به جای ۵ دقیقه در ۱ دقیقه شروع به ساخت کرد).

همه اینها به خودی خود فقط در صورتی منطقی است که سرور CI / CD داخلی خود را داشته باشید که خودتان از آن پشتیبانی می کنید. اما در حال حاضر بسیاری از سرویس های ابری وجود دارند که تمام این مشکلات در آنها حل شده است و نیازی به نگرانی در مورد آن نیست و ویژگی های ساخت لازم را نیز می توان در تنظیمات پروژه مشخص کرد.

فقط کاربران ثبت نام شده می توانند در نظرسنجی شرکت کنند. ورود، لطفا.

آیا سیستم CI/CD خود را در خانه نگه می دارید یا از خدمات شخص ثالث استفاده می کنید؟

  • ما از سرور داخلی استفاده می کنیم

  • استفاده از سرویس خارجی

  • ما از CI/CD استفاده نمی کنیم

  • دیگر

42 کاربر رای دادند. 16 کاربر رای ممتنع دادند.

منبع: www.habr.com

اضافه کردن نظر