موبائل CICD کا تجربہ: بہت سی موبائل ایپلی کیشنز کے لیے ایک فاسٹ لین کا معیار

موبائل CICD کا تجربہ: بہت سی موبائل ایپلی کیشنز کے لیے ایک فاسٹ لین کا معیار
میں فاسٹ لین کا استعمال کرتے ہوئے موبائل ایپس کے لیے مسلسل انضمام اور ترسیل کے بارے میں بات کرنا چاہوں گا۔ ہم تمام موبائل ایپلیکیشنز پر CI/CD کو کیسے نافذ کرتے ہیں، ہم وہاں کیسے پہنچے اور آخر میں کیا ہوا۔

ٹول پر نیٹ ورک پر پہلے سے ہی کافی مواد موجود ہے، جس کی ہمارے پاس شروع میں کمی تھی، اس لیے میں جان بوجھ کر اس ٹول کو تفصیل سے بیان نہیں کروں گا، لیکن صرف اس کا حوالہ دوں گا جو ہمارے پاس تھا:

مضمون دو حصوں پر مشتمل ہے:

  • کمپنی میں موبائل CI/CD کے ظہور کا پس منظر
  • این ایپلی کیشنز کے لیے CI/CD کو رول آؤٹ کرنے کے لیے تکنیکی حل

پہلا حصہ پرانے دنوں کے لیے زیادہ پرانی یادوں کا ہے، اور دوسرا ایک ایسا تجربہ ہے جس کا اطلاق آپ خود کر سکتے ہیں۔

تاریخی طور پر ایسا ہی ہوا۔

سال 2015

ہم نے ابھی موبائل ایپلیکیشنز تیار کرنا شروع کی ہیں، تب ہمیں مسلسل انضمام، DevOps اور دیگر فیشن ایبل چیزوں کے بارے میں کچھ نہیں معلوم تھا۔ ہر ایپلیکیشن اپ ڈیٹ کو ڈویلپر نے خود اپنی مشین سے رول آؤٹ کیا تھا۔ اور اگر اینڈرائیڈ کے لیے یہ بہت آسان ہے - جمع، دستخط شدہ .apk اور اسے Google Developer Console پر اپ لوڈ کیا، پھر iOS کے لیے Xcode کے ذریعے اس وقت کے ڈسٹری بیوشن ٹول نے ہمیں بڑی شاموں کے ساتھ چھوڑ دیا - آرکائیو کو ڈاؤن لوڈ کرنے کی کوششیں اکثر غلطیوں پر ختم ہوئیں اور ہمیں دوبارہ کوشش کرنی پڑی۔ معلوم ہوا کہ جدید ترین ڈویلپر مہینے میں کئی بار کوڈ نہیں لکھتا، بلکہ ایپلیکیشن جاری کرتا ہے۔

سال 2016

ہم بڑے ہوئے، ہمارے پاس پہلے سے ہی اس بارے میں خیالات تھے کہ کس طرح ڈویلپرز کو ریلیز کے لیے پورے دن سے آزاد کیا جائے، اور ایک دوسری ایپلیکیشن بھی سامنے آئی، جس نے ہمیں صرف آٹومیشن کی طرف مزید دھکیل دیا۔ اسی سال، ہم نے پہلی بار جینکنز کو انسٹال کیا اور خوفناک اسکرپٹس کا ایک گروپ لکھا، جو کہ فاسٹ لین اپنی دستاویزات میں دکھاتا ہے۔

$ xcodebuild clean archive -archivePath build/MyApp 
    -scheme MyApp

$ xcodebuild -exportArchive 
                        -exportFormat ipa 
                        -archivePath "build/MyApp.xcarchive" 
                        -exportPath "build/MyApp.ipa" 
                        -exportProvisioningProfile "ProvisioningProfileName"

$ cd /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/

$ ./altool —upload-app 
-f {abs path to your project}/build/{release scheme}.ipa  
-u "[email protected]" 
-p "PASS_APPLE_ID"

بدقسمتی سے، اب تک صرف ہمارے ڈویلپرز کو معلوم تھا کہ یہ اسکرپٹ کیسے کام کرتی ہیں اور کنیز کے اس لامتناہی اسٹیک کی ضرورت کیوں ہے، اور جب کچھ دوبارہ ٹوٹ گیا، تو انہیں لاگز کا تجزیہ کرنے کے لیے "خوبصورت شامیں" ملیں۔

سال 2017

اس سال ہم نے سیکھا کہ فاسٹ لین جیسی چیز بھی ہے۔ اتنی معلومات نہیں تھی جتنی کہ اب ہے - کیسے شروع کی جائے، اسے کیسے استعمال کیا جائے۔ اور یہ آلہ خود اس وقت بھی خام تھا: مسلسل غلطیوں نے صرف ہمیں مایوس کیا اور اس جادوئی آٹومیشن پر یقین کرنا مشکل تھا جس کا انہوں نے وعدہ کیا تھا۔

تاہم، فاسٹ لین کور میں شامل اہم افادیتیں ہیں۔ gym и pilot، ہم اسے شروع کرنے میں کامیاب ہوگئے۔

ہمارے اسکرپٹ کو تھوڑا بہتر کیا گیا ہے۔

$ fastlane gym  —-workspace "Example.xcworkspace" 
                --scheme "AppName" 
                —-buildlog_path "/tmp" 
                -—clean

انہیں بہتر کیا گیا ہے، اگر صرف اس لیے کہ تمام پیرامیٹرز کے لیے ضروری نہیں۔ 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.

اب جینکنز میں آپ مختصر کمانڈز کو کال کر سکتے ہیں جو منظر کو دھندلا نہیں کرتے اور آنکھ سے آسانی سے پڑھ سکتے ہیں:

# fastlane ios <lane_name>

$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy

ہیرے، ہم بہت اچھے ہیں۔

آپ کو کیا ملا؟ ہر قدم کے لیے کمانڈ صاف کریں۔ اسکرپٹس کو صاف کیا گیا، فاسٹ لین فائلوں میں صفائی کے ساتھ ترتیب دیا گیا۔ خوش ہو کر، ہم ڈویلپرز کے پاس بھاگے اور ان سے اپنے ذخیروں میں اپنی ضرورت کی ہر چیز شامل کرنے کو کہا۔

لیکن ہم نے وقت پر محسوس کیا کہ ہمیں انہی مشکلات کا سامنا کرنا پڑے گا - ہمارے پاس اب بھی 20 اسمبلی اسکرپٹ ہوں گے جو کسی نہ کسی طریقے سے اپنی زندگی گزارنے لگیں گے، ان میں ترمیم کرنا زیادہ مشکل ہوگا، کیونکہ اسکرپٹ ذخیرہ خانوں میں منتقل ہو جائیں گے، اور ہمیں وہاں تک رسائی حاصل نہیں تھی۔ اور، عام طور پر، ہمارے درد کو اس طرح حل کرنا ممکن نہیں ہوگا۔

موبائل CICD کا تجربہ: بہت سی موبائل ایپلی کیشنز کے لیے ایک فاسٹ لین کا معیار

ٹاسک #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.
آپ ایک مثال دیکھ سکتے ہیں۔ یہاں.

موبائل CICD کا تجربہ: بہت سی موبائل ایپلی کیشنز کے لیے ایک فاسٹ لین کا معیار

CI پر، کال زیادہ تبدیل نہیں ہوئی ہے؛ ایک مخصوص ایپلیکیشن کے لیے کنفیگریشن کلید شامل کی گئی ہے:

# fastlane ios <lane_name> --env appName

$ fastlane ios build --env appName
$ fastlane ios test --env appName
$ fastlane ios run_sonar --env appName
$ fastlane ios deploy --env appName

کمانڈز چلانے سے پہلے، ہم اسکرپٹس کے ساتھ اپنے ذخیرے کو لوڈ کرتے ہیں۔ اتنا اچھا نہیں لگتا:

git clone [email protected]/FastlaneCICD.git fastlane_temp

cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.env

اس حل کو ابھی کے لیے چھوڑ دیا، حالانکہ فاسٹ لین کے پاس فاسٹ فائل کے ذریعے ڈاؤن لوڈ کرنے کا حل موجود ہے۔ کارروائی import_from_git، لیکن یہ صرف Fastfile کے لیے کام کرتا ہے، لیکن دوسری فائلوں کے لیے نہیں۔ اگر آپ "واقعی خوبصورت" چاہتے ہیں، تو آپ خود لکھ سکتے ہیں۔ action.

اسی طرح کا سیٹ اینڈرائیڈ ایپلی کیشنز اور ReactNative کے لیے بنایا گیا تھا، فائلیں ایک ہی ذخیرہ میں ہیں، لیکن مختلف شاخوں میں iOS, android и react_native.

جب ریلیز ٹیم کچھ نیا مرحلہ شامل کرنا چاہتی ہے، اسکرپٹ میں تبدیلیاں گٹ میں MR کے ذریعے ریکارڈ کی جاتی ہیں، ٹوٹے ہوئے اسکرپٹ کے مجرموں کو تلاش کرنے کی اب کوئی ضرورت نہیں ہے، اور عام طور پر، اب آپ کو اسے توڑنے کی کوشش کرنی ہوگی۔

اب یہ یقینی ہے۔

پہلے، ہم تمام اسکرپٹس کو برقرار رکھنے، ان کو اپ ڈیٹ کرنے اور اپ ڈیٹس کے تمام نتائج کو ٹھیک کرنے میں وقت صرف کرتے تھے۔ یہ بہت مایوس کن تھا جب ریلیز میں غلطیوں اور ڈاؤن ٹائم کی وجوہات سادہ ٹائپ کی غلطیاں تھیں جن کو شیل اسکرپٹس کی گڑبڑ میں ٹریک کرنا بہت مشکل تھا۔ اب ایسی غلطیوں کو کم سے کم کر دیا گیا ہے۔ تبدیلیاں ایک ساتھ تمام ایپلیکیشنز میں متعارف کرائی جاتی ہیں۔ اور اس عمل میں ایک نئی ایپلیکیشن ڈالنے میں 15 منٹ لگتے ہیں - CI پر ایک ٹیمپلیٹ پائپ لائن سیٹ کریں اور ڈویلپر کے ریپوزٹری میں چابیاں شامل کریں۔

ایسا لگتا ہے کہ فاسٹ فائل فار اینڈروئیڈ اور ایپلیکیشن کے دستخط کے ساتھ نکتہ واضح نہیں ہے؛ اگر مضمون دلچسپ ہے تو میں ایک تسلسل لکھوں گا۔ مجھے آپ کے سوالات یا تجاویز "آپ اس مسئلے کو کیسے حل کریں گے" تبصروں میں یا ٹیلی گرام پر دیکھ کر خوشی ہوگی bashkirova.

ماخذ: www.habr.com

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