پرو ہوسٹر > بلاگ > انتظامیہ > موبائل CICD کا تجربہ: بہت سی موبائل ایپلی کیشنز کے لیے ایک فاسٹ لین کا معیار
موبائل CICD کا تجربہ: بہت سی موبائل ایپلی کیشنز کے لیے ایک فاسٹ لین کا معیار
میں فاسٹ لین کا استعمال کرتے ہوئے موبائل ایپس کے لیے مسلسل انضمام اور ترسیل کے بارے میں بات کرنا چاہوں گا۔ ہم تمام موبائل ایپلیکیشنز پر CI/CD کو کیسے نافذ کرتے ہیں، ہم وہاں کیسے پہنچے اور آخر میں کیا ہوا۔
ٹول پر نیٹ ورک پر پہلے سے ہی کافی مواد موجود ہے، جس کی ہمارے پاس شروع میں کمی تھی، اس لیے میں جان بوجھ کر اس ٹول کو تفصیل سے بیان نہیں کروں گا، لیکن صرف اس کا حوالہ دوں گا جو ہمارے پاس تھا:
این ایپلی کیشنز کے لیے CI/CD کو رول آؤٹ کرنے کے لیے تکنیکی حل
پہلا حصہ پرانے دنوں کے لیے زیادہ پرانی یادوں کا ہے، اور دوسرا ایک ایسا تجربہ ہے جس کا اطلاق آپ خود کر سکتے ہیں۔
تاریخی طور پر ایسا ہی ہوا۔
سال 2015
ہم نے ابھی موبائل ایپلیکیشنز تیار کرنا شروع کی ہیں، تب ہمیں مسلسل انضمام، DevOps اور دیگر فیشن ایبل چیزوں کے بارے میں کچھ نہیں معلوم تھا۔ ہر ایپلیکیشن اپ ڈیٹ کو ڈویلپر نے خود اپنی مشین سے رول آؤٹ کیا تھا۔ اور اگر اینڈرائیڈ کے لیے یہ بہت آسان ہے - جمع، دستخط شدہ .apk اور اسے Google Developer Console پر اپ لوڈ کیا، پھر iOS کے لیے Xcode کے ذریعے اس وقت کے ڈسٹری بیوشن ٹول نے ہمیں بڑی شاموں کے ساتھ چھوڑ دیا - آرکائیو کو ڈاؤن لوڈ کرنے کی کوششیں اکثر غلطیوں پر ختم ہوئیں اور ہمیں دوبارہ کوشش کرنی پڑی۔ معلوم ہوا کہ جدید ترین ڈویلپر مہینے میں کئی بار کوڈ نہیں لکھتا، بلکہ ایپلیکیشن جاری کرتا ہے۔
سال 2016
ہم بڑے ہوئے، ہمارے پاس پہلے سے ہی اس بارے میں خیالات تھے کہ کس طرح ڈویلپرز کو ریلیز کے لیے پورے دن سے آزاد کیا جائے، اور ایک دوسری ایپلیکیشن بھی سامنے آئی، جس نے ہمیں صرف آٹومیشن کی طرف مزید دھکیل دیا۔ اسی سال، ہم نے پہلی بار جینکنز کو انسٹال کیا اور خوفناک اسکرپٹس کا ایک گروپ لکھا، جو کہ فاسٹ لین اپنی دستاویزات میں دکھاتا ہے۔
بدقسمتی سے، اب تک صرف ہمارے ڈویلپرز کو معلوم تھا کہ یہ اسکرپٹ کیسے کام کرتی ہیں اور کنیز کے اس لامتناہی اسٹیک کی ضرورت کیوں ہے، اور جب کچھ دوبارہ ٹوٹ گیا، تو انہیں لاگز کا تجزیہ کرنے کے لیے "خوبصورت شامیں" ملیں۔
سال 2017
اس سال ہم نے سیکھا کہ فاسٹ لین جیسی چیز بھی ہے۔ اتنی معلومات نہیں تھی جتنی کہ اب ہے - کیسے شروع کی جائے، اسے کیسے استعمال کیا جائے۔ اور یہ آلہ خود اس وقت بھی خام تھا: مسلسل غلطیوں نے صرف ہمیں مایوس کیا اور اس جادوئی آٹومیشن پر یقین کرنا مشکل تھا جس کا انہوں نے وعدہ کیا تھا۔
تاہم، فاسٹ لین کور میں شامل اہم افادیتیں ہیں۔ gym и pilot، ہم اسے شروع کرنے میں کامیاب ہوگئے۔
انہیں بہتر کیا گیا ہے، اگر صرف اس لیے کہ تمام پیرامیٹرز کے لیے ضروری نہیں۔ xcodebuild، آپ کو اشارہ کرنا ہوگا - gym آزادانہ طور پر سمجھے گا کہ کہاں اور کیا ہے۔ اور مزید ٹھیک ٹیوننگ کے لیے، آپ وہی کلیدیں بتا سکتے ہیں جو کہ میں ہیں۔ xcodebuild، صرف چابیاں کا نام واضح ہے۔
اس بار، جم اور بلٹ ان xcpretty فارمیٹر کی بدولت، بلڈ لاگز بہت زیادہ پڑھنے کے قابل ہو گئے ہیں۔ اس سے ٹوٹی ہوئی اسمبلیوں کو ٹھیک کرنے میں وقت کی بچت ہونے لگی، اور بعض اوقات ریلیز ٹیم خود ہی اس کا پتہ لگا سکتی تھی۔
بدقسمتی سے، اسمبلی کی رفتار کی پیمائش xcodebuild и gym ہم نے ایسا نہیں کیا، لیکن ہم دستاویزات پر بھروسہ کریں گے - 30% اسپیڈ اپ تک۔
تمام درخواستوں کے لیے واحد عمل
سال 2018 اور موجودہ
2018 تک، ایپلی کیشنز کو بنانے اور رول آؤٹ کرنے کا عمل مکمل طور پر جینکنز میں چلا گیا، ڈویلپرز نے اپنی مشینوں سے ریلیز کرنا بند کر دیا، اور ریلیز کرنے کا حق صرف ریلیز ٹیم کے پاس تھا۔
ہم پہلے سے ہی ٹیسٹوں کے آغاز اور جامد تجزیہ کو بہتر بنانا چاہتے تھے، اور ہمارے اسکرپٹ میں اضافہ ہوتا گیا۔ ہماری ایپلی کیشنز کے ساتھ ساتھ بڑھے اور تبدیل ہوئے۔ اس وقت، تقریباً 10 ایپلی کیشنز تھیں۔ غور کرتے ہوئے کہ ہمارے پاس دو پلیٹ فارم ہیں، یہ تقریباً 20 "زندہ" اسکرپٹ ہیں۔
جب بھی ہم اسکرپٹ میں ایک نیا مرحلہ شامل کرنا چاہتے تھے، ہمیں تمام شیل اسکرپٹس میں ٹکڑوں کو کاپی پیسٹ کرنا پڑتا تھا۔ شاید ہم زیادہ احتیاط سے کام کر سکتے تھے، لیکن اکثر ایسی تبدیلیاں ٹائپنگ کی غلطیوں پر ختم ہو جاتی ہیں، جو ریلیز ٹیم کے لیے اسکرپٹ کو ٹھیک کرنے اور یہ معلوم کرنے کے لیے شام میں تبدیل ہو جاتی ہیں کہ کس ذہین آدمی نے یہ کمانڈ شامل کی ہے اور یہ اصل میں کیا کرتا ہے۔ عام طور پر، یہ نہیں کہا جا سکتا کہ ایک پلیٹ فارم کے لیے اسمبلی کے اسکرپٹ کم از کم کسی حد تک ملتے جلتے تھے۔ حالانکہ انہوں نے یقیناً ایسا ہی کیا۔
ایک نئی ایپلیکیشن کے لیے عمل شروع کرنے کے لیے، ان اسکرپٹس کے "تازہ" ورژن کو منتخب کرنے کے لیے ایک دن گزارنا، اسے ڈیبگ کرنا اور کہنا کہ "ہاں، یہ کام کرتا ہے۔"
2018 کے موسم گرما میں، ہم نے ایک بار پھر ترقی پذیر فاسٹ لین کی طرف دیکھا۔
ٹاسک نمبر 1: اسکرپٹ کے تمام مراحل کا خلاصہ کریں اور انہیں فاسٹ فائل میں دوبارہ لکھیں۔
جب ہم نے شروع کیا، تو ہمارے اسکرپٹ ایک فٹ کلاتھ کی طرح لگ رہے تھے جس میں جینکنز میں ایک شیل اسکرپٹ میں تمام مراحل اور بیساکھییں شامل تھیں۔ ہم ابھی تک پائپ لائن اور اسٹیج کے لحاظ سے تقسیم نہیں ہوئے ہیں۔
ہم نے دیکھا کہ ہمارے پاس کیا ہے اور 4 مراحل کی نشاندہی کی جو ہمارے CI/CD کی وضاحت کے مطابق ہیں:
تعمیر - انحصار کو انسٹال کرنا، محفوظ شدہ دستاویزات کو جمع کرنا،
ٹیسٹ - ڈویلپر یونٹ ٹیسٹ چلانا، کوریج کا حساب لگانا،
سونار - تمام لنٹرز لانچ کرتا ہے اور سونار کیوب کو رپورٹ بھیجتا ہے،
deploy — الفا (TestFlight) کو ایک نمونہ بھیجنا۔
اور اگر آپ کارروائیوں میں استعمال ہونے والی کلیدوں کو چھوڑ کر تفصیلات میں نہیں جاتے ہیں، تو آپ کو یہ Fastfile ملے گی:
default_platform(:ios)
platform :ios do
before_all do
unlock
end
desc "Build stage"
lane :build do
match
prepare_build
gym
end
desc "Prepare build stage: carthage and cocoapods"
lane :prepare_build do
pathCartfile = ""
Dir.chdir("..") do
pathCartfile = File.join(Dir.pwd, "/Cartfile")
end
if File.exist?(pathCartfile)
carthage
end
pathPodfile = ""
Dir.chdir("..") do
pathPodfile = File.join(Dir.pwd, "/Podfile")
end
if File.exist?(pathPodfile)
cocoapods
end
end
desc "Test stage"
lane :test do
scan
xcov
end
desc "Sonar stage (after run test!)"
lane :run_sonar do
slather
lizard
swiftlint
sonar
end
desc "Deploy to testflight stage"
lane :deploy do
pilot
end
desc "Unlock keychain"
private_lane :unlock do
pass = ENV['KEYCHAIN_PASSWORD']
unlock_keychain(
password: pass
)
end
end
درحقیقت، ہماری پہلی فاسٹ فائل شیطانی نکلی، کچھ بیساکھیوں پر غور کرتے ہوئے جن کی ہمیں اب بھی ضرورت تھی اور ان پیرامیٹرز کی تعداد جو ہم نے تبدیل کی:
lane :build do
carthage(
command: "update",
use_binaries: false,
platform: "ios",
cache_builds: true)
cocoapods(
clean: true,
podfile: "./Podfile",
use_bundle_exec: false)
gym(
workspace: "MyApp.xcworkspace",
configuration: "Release",
scheme: "MyApp",
clean: true,
output_directory: "/build",
output_name: "my-app.ipa")
end
lane :deploy do
pilot(
username: "[email protected]",
app_identifier: "com.example.app",
dev_portal_team_id: "TEAM_ID_NUMBER_DEV",
team_id: "ITS_TEAM_ID")
end
مندرجہ بالا مثال میں، پیرامیٹرز کا صرف ایک حصہ جس کی ہمیں وضاحت کرنے کی ضرورت ہے: یہ تعمیراتی پیرامیٹرز ہیں - اسکیما، کنفیگریشن، پروویژن پروفائل کے نام، نیز تقسیم کے پیرامیٹرز - ڈویلپر اکاؤنٹ کی ایپل آئی ڈی، پاس ورڈ، ایپلیکیشن آئی ڈی، اور اسی طرح پر پہلے تخمینے کے طور پر، ہم نے ان تمام کلیدوں کو خصوصی فائلوں میں ڈال دیا - Gymfile, Matchfile и Appfile.
اب جینکنز میں آپ مختصر کمانڈز کو کال کر سکتے ہیں جو منظر کو دھندلا نہیں کرتے اور آنکھ سے آسانی سے پڑھ سکتے ہیں:
آپ کو کیا ملا؟ ہر قدم کے لیے کمانڈ صاف کریں۔ اسکرپٹس کو صاف کیا گیا، فاسٹ لین فائلوں میں صفائی کے ساتھ ترتیب دیا گیا۔ خوش ہو کر، ہم ڈویلپرز کے پاس بھاگے اور ان سے اپنے ذخیروں میں اپنی ضرورت کی ہر چیز شامل کرنے کو کہا۔
لیکن ہم نے وقت پر محسوس کیا کہ ہمیں انہی مشکلات کا سامنا کرنا پڑے گا - ہمارے پاس اب بھی 20 اسمبلی اسکرپٹ ہوں گے جو کسی نہ کسی طریقے سے اپنی زندگی گزارنے لگیں گے، ان میں ترمیم کرنا زیادہ مشکل ہوگا، کیونکہ اسکرپٹ ذخیرہ خانوں میں منتقل ہو جائیں گے، اور ہمیں وہاں تک رسائی حاصل نہیں تھی۔ اور، عام طور پر، ہمارے درد کو اس طرح حل کرنا ممکن نہیں ہوگا۔
ٹاسک #2: N ایپلیکیشنز کے لیے ایک فاسٹ فائل حاصل کریں۔
اب ایسا لگتا ہے کہ مسئلہ کو حل کرنا اتنا مشکل نہیں ہے - متغیرات کو سیٹ کریں، اور چلیں. جی ہاں، حقیقت میں، اس طرح مسئلہ حل کیا گیا تھا. لیکن اس وقت جب ہم اسے خراب کر رہے تھے، ہمیں نہ تو خود فاسٹ لین میں مہارت تھی، نہ روبی میں، جس میں فاسٹ لین لکھا گیا ہے، اور نہ ہی نیٹ ورک پر کارآمد مثالیں - ہر وہ شخص جس نے فاسٹ لین کے بارے میں لکھا تب صرف ایک ایپلی کیشن کے لیے ایک مثال تک محدود تھا۔ ایک ڈویلپر کے لیے۔
فاسٹ لین ماحولیاتی متغیرات کو سنبھال سکتا ہے، اور ہم نے پہلے ہی کیچین پاس ورڈ ترتیب دے کر اس کی کوشش کی ہے۔
ENV['KEYCHAIN_PASSWORD']
اپنے اسکرپٹ کو دیکھنے کے بعد، ہم نے مشترکہ حصوں کی نشاندہی کی:
#for build, test and deploy
APPLICATION_SCHEME_NAME=appScheme
APPLICATION_PROJECT_NAME=app.xcodeproj
APPLICATION_WORKSPACE_NAME=app.xcworkspace
APPLICATION_NAME=appName
OUTPUT_IPA_NAME=appName.ipa
#app info
APP_BUNDLE_IDENTIFIER=com.example.appName
[email protected]
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789
اب، فاسٹ لین فائلوں میں ان کیز کا استعمال شروع کرنے کے لیے، ہمیں یہ معلوم کرنا تھا کہ انہیں وہاں کیسے پہنچایا جائے۔ فاسٹلین کے پاس اس کا حل ہے: dotenv کے ذریعے متغیرات کو لوڈ کرنا. دستاویزات میں کہا گیا ہے کہ اگر آپ کے لیے مختلف مقاصد کے لیے کیز لوڈ کرنا ضروری ہے تو فاسٹ لین ڈائرکٹری میں کئی کنفیگریشن فائلیں بنائیں۔ .env, .env.default, .env.development.
اور پھر ہم نے اس لائبریری کو تھوڑا مختلف طریقے سے استعمال کرنے کا فیصلہ کیا۔ آئیے ڈویلپرز کے ذخیرے میں فاسٹ لین اسکرپٹس اور اس کی میٹا معلومات کو نہیں بلکہ فائل میں اس ایپلی کیشن کی منفرد چابیاں رکھیں۔ .env.appName.
خود Fastfile, Appfile, Matchfile и Gymfile، ہم نے اسے ایک الگ ذخیرہ میں چھپا دیا۔ دوسری سروسز سے پاس ورڈ کیز کے ساتھ ایک اضافی فائل وہاں چھپی ہوئی تھی۔ .env.
آپ ایک مثال دیکھ سکتے ہیں۔ یہاں.
CI پر، کال زیادہ تبدیل نہیں ہوئی ہے؛ ایک مخصوص ایپلیکیشن کے لیے کنفیگریشن کلید شامل کی گئی ہے:
اس حل کو ابھی کے لیے چھوڑ دیا، حالانکہ فاسٹ لین کے پاس فاسٹ فائل کے ذریعے ڈاؤن لوڈ کرنے کا حل موجود ہے۔ کارروائیimport_from_git، لیکن یہ صرف Fastfile کے لیے کام کرتا ہے، لیکن دوسری فائلوں کے لیے نہیں۔ اگر آپ "واقعی خوبصورت" چاہتے ہیں، تو آپ خود لکھ سکتے ہیں۔ action.
اسی طرح کا سیٹ اینڈرائیڈ ایپلی کیشنز اور ReactNative کے لیے بنایا گیا تھا، فائلیں ایک ہی ذخیرہ میں ہیں، لیکن مختلف شاخوں میں iOS, android и react_native.
جب ریلیز ٹیم کچھ نیا مرحلہ شامل کرنا چاہتی ہے، اسکرپٹ میں تبدیلیاں گٹ میں MR کے ذریعے ریکارڈ کی جاتی ہیں، ٹوٹے ہوئے اسکرپٹ کے مجرموں کو تلاش کرنے کی اب کوئی ضرورت نہیں ہے، اور عام طور پر، اب آپ کو اسے توڑنے کی کوشش کرنی ہوگی۔
اب یہ یقینی ہے۔
پہلے، ہم تمام اسکرپٹس کو برقرار رکھنے، ان کو اپ ڈیٹ کرنے اور اپ ڈیٹس کے تمام نتائج کو ٹھیک کرنے میں وقت صرف کرتے تھے۔ یہ بہت مایوس کن تھا جب ریلیز میں غلطیوں اور ڈاؤن ٹائم کی وجوہات سادہ ٹائپ کی غلطیاں تھیں جن کو شیل اسکرپٹس کی گڑبڑ میں ٹریک کرنا بہت مشکل تھا۔ اب ایسی غلطیوں کو کم سے کم کر دیا گیا ہے۔ تبدیلیاں ایک ساتھ تمام ایپلیکیشنز میں متعارف کرائی جاتی ہیں۔ اور اس عمل میں ایک نئی ایپلیکیشن ڈالنے میں 15 منٹ لگتے ہیں - CI پر ایک ٹیمپلیٹ پائپ لائن سیٹ کریں اور ڈویلپر کے ریپوزٹری میں چابیاں شامل کریں۔
ایسا لگتا ہے کہ فاسٹ فائل فار اینڈروئیڈ اور ایپلیکیشن کے دستخط کے ساتھ نکتہ واضح نہیں ہے؛ اگر مضمون دلچسپ ہے تو میں ایک تسلسل لکھوں گا۔ مجھے آپ کے سوالات یا تجاویز "آپ اس مسئلے کو کیسے حل کریں گے" تبصروں میں یا ٹیلی گرام پر دیکھ کر خوشی ہوگی bashkirova.