د ګرځنده CICD تجربه: د ډیری ګرځنده غوښتنلیکونو لپاره یو فاسټ لین معیاري

د ګرځنده CICD تجربه: د ډیری ګرځنده غوښتنلیکونو لپاره یو فاسټ لین معیاري
زه غواړم د فاسټ لین په کارولو سره د ګرځنده ایپسونو لپاره د دوامداره ادغام او تحویل په اړه وغږیږم. موږ څنګه په ټولو ګرځنده غوښتنلیکونو کې CI/CD پلي کوو، موږ څنګه هلته ورسیدو او په پای کې څه پیښ شوي.

په شبکه کې لا دمخه د وسیلې په اړه کافي مواد شتون لري ، کوم چې موږ په پیل کې دومره نشتوالی درلود ، نو زه به په قصدي ډول وسیله په تفصیل سره بیان نه کړم ، مګر یوازې هغه څه ته به اشاره وکړم چې موږ یې درلودل:

مقاله له دوو برخو جوړه ده:

  • په شرکت کې د ګرځنده CI/CD ظهور پس منظر
  • د N-Applications لپاره د CI/CD رول کولو لپاره تخنیکي حل

لومړۍ برخه د پخوانیو ورځو لپاره ډیر نوستالیا ده، او دویمه برخه یوه تجربه ده چې تاسو کولی شئ خپل ځان ته تطبیق کړئ.

دا څنګه په تاریخي توګه پیښ شوي

کال ۲۰۰۹

موږ یوازې د ګرځنده غوښتنلیکونو رامینځته کول پیل کړل ، بیا موږ د دوامداره ادغام په اړه ، د DevOps او نورو فیشني شیانو په اړه هیڅ نه پوهیږو. د هر غوښتنلیک تازه کول پخپله د پراختیا کونکي لخوا د هغه ماشین څخه راپورته شوي. او که د Android لپاره دا خورا ساده دی - راټول شوی، لاسلیک شوی .apk او دا یې د ګوګل پراختیا کونکي کنسول ته اپلوډ کړ، بیا د iOS لپاره د Xcode له لارې د توزیع وسیله موږ ته د لوی ماښام سره پریښود - د آرشیف ډاونلوډ کولو هڅې ډیری وختونه په غلطیو پای ته رسیدلي او موږ باید بیا هڅه وکړو. دا معلومه شوه چې خورا پرمختللی پراختیا کونکی په میاشت کې څو ځله کوډ نه لیکي، بلکه غوښتنلیک خپروي.

کال ۲۰۰۹

موږ لوی شوي یو ، موږ دمخه د دې په اړه فکرونه درلودل چې څنګه پراختیا کونکي د یوې خوشې کیدو لپاره ټوله ورځ آزاد کړو ، او دوهم غوښتنلیک هم څرګند شو ، کوم چې موږ یوازې د اتومات کولو په لور هڅولي. په هماغه کال، موږ د لومړي ځل لپاره جینکنز نصب کړ او د ډارونکي سکریپټونو یوه ډله یې ولیکل، هغه ته ورته ورته ورته چې فاسټ لین په خپلو اسنادو کې ښیې.

$ 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"

بدبختانه ، تر دې دمه یوازې زموږ پراختیا کونکي پوهیدل چې دا سکریپټونه څنګه کار کوي او ولې د کیلي دا نه ختمیدونکي سټیک ته اړتیا ده ، او کله چې یو څه بیا مات شو ، دوی د لاګونو تحلیل لپاره "ښکلي ماښام" ترلاسه کړل.

کال ۲۰۰۹

سږکال موږ پوه شو چې د فاسټ لین په څیر یو شی شتون لري. دومره معلومات نه وو لکه څنګه چې اوس شتون لري - څنګه یې پیل کړئ، څنګه یې وکاروئ. او پخپله وسیله په هغه وخت کې لاهم خامه وه: دوامداره تېروتنې یوازې موږ مایوسه کړي او په هغه جادویی اتوماتیک باور کول سخت وو چې دوی یې ژمنه کړې وه.

په هرصورت، د فاسټ لین کور کې شامل شوي اصلي اسانتیاوې دي 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 توضیحاتو سره سمون لري:

  • جوړول - د انحصارونو نصبول، آرشیف راټولول،
  • ازموینه - د پراختیا کونکي واحد ازموینې پرمخ وړل ، د پوښښ محاسبه کول ،
  • سونار - ټول لینټرونه پیلوي او سونار کیوب ته راپورونه لیږي،
  • ځای په ځای کول - الفا (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، پاسورډ، غوښتنلیک 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 غوښتنلیکونو لپاره یو واحد فاسټ فایل ترلاسه کړئ

اوس داسې ښکاري چې د ستونزې حل کول دومره ستونزمن ندي - متغیرات تنظیم کړئ، او راځئ چې لاړ شو. هو، په حقیقت کې، دا څنګه ستونزه حل شوه. مګر په اوس وخت کې چې موږ دا خرابه کړه، موږ نه پخپله په فاسټ لین کې تخصص درلود، نه په روبي کې، په کوم کې چې فاسټ لین لیکل کیږي، او نه په شبکه کې ګټور مثالونه - هرڅوک چې د فاسټ لین په اړه لیکلي نو د یو غوښتنلیک لپاره یو مثال پورې محدود و. یو پرمخ وړونکی.

فاسټلین کولی شي د چاپیریال تغیرات اداره کړي، او موږ دمخه د کیچین پاسورډ په ترتیبولو سره دا هڅه کړې ده:

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، مګر دا یوازې د فاسټ فایل لپاره کار کوي ، مګر د نورو فایلونو لپاره نه. که تاسو "ریښتیا ښکلی" غواړئ، تاسو کولی شئ خپل ځان ولیکئ action.

ورته سیټ د Android غوښتنلیکونو او ReactNative لپاره جوړ شوی و ، فایلونه په ورته ذخیره کې دي ، مګر په بیلابیلو څانګو کې iOS, android и react_native.

کله چې د خوشې کولو ټیم غواړي یو څه نوي مرحلې اضافه کړي ، په سکریپټ کې بدلونونه د MR له لارې په git کې ثبت شوي ، نور اړتیا نشته چې د مات شوي سکریپټونو مجرمینو لټون وکړئ ، او په عموم کې ، اوس تاسو باید د ماتولو هڅه وکړئ.

اوس دا د ډاډ لپاره دی

مخکې، موږ د ټولو سکریپټونو ساتلو، د دوی تازه کولو او د تازه معلوماتو ټولې پایلې حل کولو وخت تیر کړ. دا خورا مایوسه کونکی و کله چې په ریلیزونو کې د غلطیو او ځنډیدو لاملونه ساده ټایپونه وو چې د شیل سکریپټونو په ګډوډۍ کې تعقیب ساتل خورا ستونزمن وو. اوس دا ډول تېروتنې لږ تر لږه کمې شوې دي. بدلونونه په یو وخت کې ټولو غوښتنلیکونو ته لیږدول کیږي. او دا 15 دقیقې وخت نیسي ترڅو پروسې ته نوی غوښتنلیک واچوي - په CI کې د ټیمپلیټ پایپ لاین تنظیم کړئ او د پراختیا کونکي ذخیره کې کیلي اضافه کړئ.

داسې بریښي چې د Android او غوښتنلیک لاسلیک لپاره د فاسټ فایل سره ټکی ناڅرګند پاتې دی؛ که مقاله په زړه پوري وي ، زه به دوام ولیکم. زه به خوښ شم چې ستاسو پوښتنې یا وړاندیزونه "تاسو دا ستونزه څنګه حل کړئ" په نظرونو یا ټیلیګرام کې وګورئ bashkirova.

سرچینه: www.habr.com

Add a comment