موبائل CICD تجربو: ڪيترن ئي موبائل ايپليڪيشنن لاء هڪ فاسٽ لين معيار

موبائل CICD تجربو: ڪيترن ئي موبائل ايپليڪيشنن لاء هڪ فاسٽ لين معيار
مان فاسٽ لين استعمال ڪندي موبائل ايپس لاءِ مسلسل انضمام ۽ ترسيل بابت ڳالهائڻ چاهيان ٿو. اسان سڀني موبائل ايپليڪيشنن تي CI/CD کي ڪيئن لاڳو ڪريون ٿا، اسان اتي ڪيئن پهتاسين ۽ آخر ۾ ڇا ٿيو.

ٽول تي نيٽ ورڪ تي اڳ ۾ ئي ڪافي مواد موجود آهي، جنهن جي شروعات ۾ اسان وٽ ايتري کوٽ هئي، تنهن ڪري مان عمدي طور تي اوزار کي تفصيل سان بيان نه ڪندس، پر صرف ان جو حوالو ڏيندس جيڪو اسان وٽ هو:

مضمون ٻن حصن تي مشتمل آهي:

  • ڪمپني ۾ موبائل CI/CD جي ظاهر ٿيڻ جو پس منظر
  • اين-ايپليڪيشنز لاءِ CI/CD رولنگ لاءِ ٽيڪنيڪل حل

پهريون حصو پراڻن ڏينهن لاءِ وڌيڪ نوسٽاليا آهي، ۽ ٻيو هڪ تجربو آهي جيڪو توهان پاڻ تي لاڳو ڪري سگهو ٿا.

تاريخي طور تي ائين ئي ٿيو آهي

سال 2015

اسان صرف موبائيل ايپليڪيشنن کي ترقي ڪرڻ شروع ڪيو، پوء اسان کي مسلسل انضمام بابت، DevOps ۽ ٻين فيشن شين جي باري ۾ ڪجھ به نه ڄاڻو. هر ايپليڪيشن اپڊيٽ ڊولپر پاران پاڻ پنهنجي مشين مان ڪڍيو ويو. ۽ جيڪڏهن Android لاءِ اهو بلڪل سادو آهي - گڏ ٿيل، دستخط ٿيل .apk ۽ ان کي اپلوڊ ڪيو گوگل ڊولپر ڪنسول تي، پوءِ 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).

۽ جيڪڏهن توهان تفصيل ۾ نه وڃو، ڪارناما ۾ استعمال ڪيل چابمن کي ختم ڪندي، توهان هي فاسٽ فائل حاصل ڪندا:

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

مٿين مثال ۾، صرف پيٽرولر جو حصو جيڪو اسان کي بيان ڪرڻ جي ضرورت آهي: اهي تعميراتي پيٽرولر آهن - اسڪيما، ترتيب، روزي جي پروفائل جا نالا، گڏوگڏ ورهائڻ جا پيرا ميٽرز - ايپل آئي ڊي ڊولپر اڪائونٽ، پاسورڊ، ايپليڪيشن ID، ۽ پوء تي. پهرين تقريبن جي طور تي، اسان انهن سڀني ڪنجين کي خاص فائلن ۾ رکون ٿا - Gymfile, Matchfile и Appfile.

هاڻي جينڪنز ۾ توهان مختصر حڪمن کي ڪال ڪري سگهو ٿا جيڪي ڏسڻ کي ڌمڪيون نه ڏيندا آهن ۽ اکين سان آساني سان پڙهي سگهندا آهن:

# fastlane ios <lane_name>

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

هيري، اسان عظيم آهيون

توکي ڇا مليو؟ هر قدم لاء حڪم صاف ڪريو. صاف ٿيل اسڪرپٽ، صاف طور تي ترتيب ڏنل فاسٽ لين فائلن ۾. خوش ٿي، اسان ڊولپرز ڏانهن ڊوڙيا ته انهن کي هر شيءِ شامل ڪرڻ لاءِ چيو جيڪي انهن کي گهربل آهن انهن جي ذخيرن ۾.

پر وقت گذرڻ سان اسان محسوس ڪيو ته اسان کي به ساڳين مشڪلاتن کي منهن ڏيڻو پوندو - اسان وٽ اڃا به 20 اسمبلي اسڪرپٽ هوندا جيڪي هڪ نه ٻئي طريقي سان پنهنجي زندگي گذارڻ شروع ڪندا، انهن کي ايڊٽ ڪرڻ وڌيڪ ڏکيو هوندو، ڇاڪاڻ ته اسڪرپٽ مخزن ڏانهن منتقل ٿي ويندا. ۽ اسان کي اتي رسائي نه هئي. ۽، عام طور تي، اسان جي درد کي هن طريقي سان حل ڪرڻ ممڪن نه ٿيندو.

موبائل CICD تجربو: ڪيترن ئي موبائل ايپليڪيشنن لاء هڪ فاسٽ لين معيار

ٽاسڪ #2: حاصل ڪريو ھڪڙو فاسٽ فائل N ايپليڪيشنن لاءِ

هاڻي اهو لڳي ٿو ته مسئلو حل ڪرڻ ايترو ڏکيو نه آهي - متغير مقرر ڪريو، ۽ اچو ته وڃو. ها، حقيقت ۾، اهو ڪيئن مسئلو حل ڪيو ويو آهي. پر ان وقت جڏهن اسان ان کي خراب ڪيو، اسان کي نه ته فاسٽ لين ۾ مهارت هئي، نه روبي ۾، جنهن ۾ فاسٽ لين لکيو ويو آهي، ۽ نه ئي نيٽ ورڪ تي مفيد مثال - هرڪو جيڪو فاسٽ لين بابت لکيو هو، پوء صرف هڪ ايپليڪيشن لاء هڪ مثال تائين محدود هو. هڪ ڊولپر.

Fastlane ماحوليات جي متغيرن کي سنڀالي سگھي ٿو، ۽ اسان اڳ ۾ ئي ڪوشش ڪئي آھي Keychain پاسورڊ قائم ڪندي:

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

هاڻي، فاسٽ لين فائلن ۾ انهن ڪيز کي استعمال ڪرڻ شروع ڪرڻ لاءِ، اسان کي اهو معلوم ڪرڻو پوندو ته انهن کي اتي ڪيئن پهچائڻو آهي. Fastlane هن لاء هڪ حل آهي: 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.

ساڳيو سيٽ اينڊرائيڊ ايپليڪيشنز ۽ ري ايڪٽ نيٽ لاءِ ٺاهيو ويو، فائلون ساڳي مخزن ۾ آهن، پر مختلف شاخن ۾ iOS, android и react_native.

جڏهن رليز ٽيم ڪجهه نئون قدم شامل ڪرڻ چاهي ٿي، اسڪرپٽ ۾ تبديليون ايم آر ذريعي گٽ ۾ رڪارڊ ڪيون وينديون آهن، هاڻي ٽوٽل اسڪرپٽ جي مجرمن کي ڳولڻ جي ڪا ضرورت ناهي، ۽ عام طور تي، هاڻي توهان کي ان کي ٽوڙڻ جي ڪوشش ڪرڻو پوندو.

هاڻي اها پڪ آهي

اڳي، اسان وقت گذاريو سڀني اسڪرپٽ کي برقرار رکڻ، انهن کي تازه ڪاري ڪرڻ ۽ اپڊيٽ جي سڀني نتيجن کي درست ڪرڻ. اها ڏاڍي مايوسي هئي جڏهن غلطين جا سبب ۽ رليز ۾ ٽائيم ٽائيم سادو ٽائپس هئا جيڪي شيل اسڪرپٽ جي جمل ۾ ٽريڪ رکڻ تمام ڏکيو هئا. هاڻي اهڙيون غلطيون گهٽ ۾ گهٽ ٿي ويون آهن. تبديليون هڪ ئي وقت ۾ سڀني ايپليڪيشنن ۾ شامل ڪيون وينديون آهن. ۽ اهو 15 منٽ وٺندو آهي هڪ نئين ايپليڪيشن کي پروسيس ۾ رکڻ لاءِ - سيٽ اپ ڪريو ٽيمپليٽ پائپ لائن CI تي ۽ چابيون شامل ڪريو ڊولپر جي مخزن ۾.

اهو لڳي ٿو ته فاسٽ فائل لاءِ Android ۽ ايپليڪيشن جي دستخط اڻڄاتل رهي ٿو، جيڪڏهن مضمون دلچسپ آهي، مان هڪ تسلسل لکندس. مان توهان جا سوال يا تجويزون ڏسي خوش ٿي ويندس "توهان اهو مسئلو ڪيئن حل ڪندا" تبصرن ۾ يا ٽيليگرام تي bashkirova.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو