ڈوکر کنٹینر میں اینڈرائیڈ پروجیکٹ بنانا

اینڈرائیڈ پلیٹ فارم کے لیے کوئی پروجیکٹ تیار کرتے وقت، یہاں تک کہ سب سے چھوٹا بھی، جلد یا بدیر کسی کو ترقیاتی ماحول سے نمٹنا پڑتا ہے۔ اینڈرائیڈ SDK کے علاوہ، کوٹلن، گریڈل، پلیٹ فارم ٹولز، بلڈ ٹولز کا تازہ ترین ورژن ہونا ضروری ہے۔ اور اگر ڈویلپر کی مشین پر یہ تمام انحصار اینڈرائیڈ اسٹوڈیو IDE کا استعمال کرتے ہوئے زیادہ حد تک حل کر دیا جاتا ہے، تو CI/CD سرور پر، ہر اپ ڈیٹ سر درد میں بدل سکتا ہے۔ اور اگر ویب ڈویلپمنٹ میں، ڈوکر ماحولیات کے مسئلے کا معیاری حل بن گیا ہے، تو کیوں نہ اینڈرائیڈ ڈویلپمنٹ میں اس کے ساتھ اسی طرح کا مسئلہ حل کرنے کی کوشش کی جائے...

ان لوگوں کے لئے جو نہیں جانتے کہ ڈوکر کیا ہے - اگر یہ بہت آسان ہے، تو یہ نام نہاد بنانے کا ایک ٹول ہے۔ "کنٹینرز" جس میں کم از کم OS کرنل اور سافٹ ویئر کا ضروری سیٹ ہوتا ہے جسے ہم ماحول کو برقرار رکھتے ہوئے جہاں چاہیں تعینات کر سکتے ہیں۔ ہمارے کنٹینر میں بالکل کیا ہوگا اس کا تعین 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/ - ہمارے اینڈرائیڈ پروجیکٹ کے ساتھ موجودہ فولڈر کو کنٹینر کے اندرونی فولڈر /home/gradle/ میں ماؤنٹ کرتا ہے۔
-w/home/gradle - کنٹینر کی ورکنگ ڈائرکٹری سیٹ کرتا ہے۔
android-build:5.4.1-28-27 - ہمارے کنٹینر کا نام جو ہم نے جمع کیا ہے۔
gradle assembleDebug - خود ساختہ ٹیم، جو ہمارے پروجیکٹ کو جمع کرتی ہے۔

اگر سب کچھ ٹھیک ہو جاتا ہے، تو چند سیکنڈ/منٹ کے بعد آپ کو کچھ ایسا نظر آئے گا۔ 8m 3s میں کامیاب بنیں۔! اور app/build/output/apk فولڈر میں ایک اسمبل ایپلی کیشن ہوگی۔

اسی طرح، آپ گریڈل کے دوسرے کام انجام دے سکتے ہیں - پروجیکٹ کو چیک کریں، ٹیسٹ چلائیں وغیرہ۔ اہم فائدہ یہ ہے کہ اگر ہمیں کسی دوسری مشین پر پروجیکٹ بنانے کی ضرورت ہے، تو ہمیں پورے ماحول کو انسٹال کرنے کے بارے میں فکر کرنے کی ضرورت نہیں ہے، اور یہ ضروری تصویر ڈاؤن لوڈ کرنے اور اس میں تعمیر کو چلانے کے لئے کافی ہوگا۔

کنٹینر کسی قسم کی تبدیلیوں کو محفوظ نہیں کرتا ہے، اور ہر اسمبلی کو شروع سے لانچ کیا جاتا ہے، جو کہ ایک طرف، اسمبلی کی شناخت کی ضمانت دیتا ہے چاہے اسے کہاں سے شروع کیا گیا ہو، دوسری طرف، ہر بار آپ کو تمام انحصارات کو ڈاؤن لوڈ کرنا پڑتا ہے۔ اور تمام کوڈ دوبارہ مرتب کریں، اور اس میں بعض اوقات کافی وقت لگ سکتا ہے۔ لہذا، معمول کے "سرد" آغاز کے علاوہ، ہمارے پاس نام نہاد کو برقرار رکھتے ہوئے اسمبلی شروع کرنے کا اختیار ہے. "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"

نتیجے کے طور پر، اوسط پروجیکٹ کی تعمیر کا وقت کئی گنا کم ہو گیا تھا (منحصر پراجیکٹ پر انحصار کی تعداد پر، لیکن اس طرح اوسط پروجیکٹ 1 منٹ کی بجائے 5 منٹ میں بننا شروع ہوا)۔

یہ سب بذات خود سمجھ میں آتا ہے اگر آپ کا اپنا اندرونی CI/CD سرور ہے، جس کی آپ خود حمایت کرتے ہیں۔ لیکن اب بہت سی کلاؤڈ سروسز موجود ہیں جن میں یہ تمام مسائل حل ہو جاتے ہیں اور آپ کو اس کے لیے پریشان ہونے کی ضرورت نہیں ہے اور پراجیکٹ کی سیٹنگز میں ضروری بلڈ پراپرٹیز بھی بتائی جا سکتی ہیں۔

سروے میں صرف رجسٹرڈ صارفین ہی حصہ لے سکتے ہیں۔ سائن ان، برائے مہربانی.

کیا آپ اپنے CI/CD سسٹم کو اندرونی رکھتے ہیں یا تھرڈ پارٹی سروس استعمال کرتے ہیں۔

  • اندرونی سرور کا استعمال

  • ایک بیرونی سروس کا استعمال کرتے ہوئے

  • ہم CI/CD استعمال نہیں کرتے

  • دیگر

42 صارفین نے ووٹ دیا۔ 16 صارفین غیر حاضر رہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں