Mobil CICD tajribasi: ko'plab mobil ilovalar uchun bitta tezkor standart

Mobil CICD tajribasi: ko'plab mobil ilovalar uchun bitta tezkor standart
Men fastlane yordamida mobil ilovalar uchun uzluksiz integratsiya va yetkazib berish haqida gapirmoqchiman. Biz barcha mobil ilovalarda CI/CD ni qanday qo'llaymiz, u erga qanday etib keldik va oxirida nima bo'ldi.

Asbobda tarmoqda allaqachon yetarlicha materiallar mavjud bo'lib, bizga boshida etishmayotgan edi, shuning uchun men bu vositani batafsil tasvirlamayman, faqat o'sha paytdagi narsalarga murojaat qilaman:

Maqola ikki qismdan iborat:

  • Kompaniyada mobil CI/CD-ning paydo bo'lishining foni
  • N-ilovalar uchun CI/CD-ni chiqarish uchun texnik yechim

Birinchi qism eski kunlar uchun ko'proq nostalji, ikkinchisi esa o'zingizga murojaat qilishingiz mumkin bo'lgan tajriba.

Tarixiy jihatdan shunday bo'lgan

Yil 2015

Biz endigina mobil ilovalarni ishlab chiqishni boshladik, keyin uzluksiz integratsiya, DevOps va boshqa moda narsalar haqida hech narsa bilmasdik. Har bir ilova yangilanishini ishlab chiquvchining o'zi o'z mashinasidan chiqargan. Va agar Android uchun bu juda oddiy bo'lsa - yig'ilgan, imzolangan .apk va uni Google Developer Console-ga yukladik, keyin iOS uchun Xcode orqali tarqatish vositasi bizni ajoyib oqshomlarni qoldirdi - arxivni yuklab olishga urinishlar ko'pincha xatolar bilan yakunlandi va biz qayta urinib ko'rishga majbur bo'ldik. Ma'lum bo'lishicha, eng ilg'or dasturchi oyiga bir necha marta kod yozmaydi, balki dasturni chiqaradi.

Yil 2016

Biz o'sib ulg'aydik, bizda ishlab chiquvchilarni bir kun davomida ozod qilish uchun qanday qilib ozod qilish haqida o'ylar edik va ikkinchi dastur ham paydo bo'ldi, bu bizni faqat avtomatlashtirishga ko'proq undadi. O'sha yili biz Jenkins-ni birinchi marta o'rnatdik va fastlane o'z hujjatlarida ko'rsatganiga juda o'xshash qo'rqinchli skriptlarni yozdik.

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

Afsuski, hozirgacha faqat bizning ishlab chiquvchilarimiz ushbu skriptlar qanday ishlashini va nima uchun bu cheksiz kalitlar to'plami kerakligini bilishgan va biror narsa yana buzilganda, jurnallarni tahlil qilish uchun "ajoyib oqshomlar" ga ega bo'lishdi.

Yil 2017

Bu yil biz fastlane kabi narsa borligini bilib oldik. Hozirgidek ko'p ma'lumot yo'q edi - qanday boshlash kerak, undan qanday foydalanish kerak. Va asbobning o'zi o'sha paytda hali ham qo'pol edi: doimiy xatolar bizni hafsalasi pir qildi va ular va'da qilgan sehrli avtomatlashtirishga ishonish qiyin edi.

Biroq, fastlane yadrosiga kiritilgan asosiy yordamchi dasturlar gym ΠΈ pilot, biz uni boshlashga muvaffaq bo'ldik.

Skriptlarimiz biroz yaxshilandi.

$ fastlane gym  β€”-workspace "Example.xcworkspace" 
                --scheme "AppName" 
                β€”-buildlog_path "/tmp" 
                -β€”clean

Ular yaxshilandi, chunki barcha parametrlar zarur emas xcodebuild, ko'rsatishingiz kerak - gym qaerda va nima yotganini mustaqil ravishda tushunadi. Va yanada nozik sozlash uchun siz xuddi shu tugmachalarni belgilashingiz mumkin xcodebuild, faqat tugmachalarning nomlanishi aniqroq.

Bu safar gimnastika zali va o'rnatilgan xcpretty formatlagichi tufayli qurilish jurnallari ancha tushunarli bo'ldi. Bu buzilgan yig'ilishlarni tuzatish uchun vaqtni tejashga yordam berdi va ba'zida bo'shatish guruhi buni mustaqil ravishda aniqlashi mumkin edi.

Afsuski, yig'ish tezligi o'lchovlari xcodebuild ΠΈ gym Biz buni qilmadik, lekin biz hujjatlarga ishonamiz - 30% gacha tezlik.

Barcha ilovalar uchun yagona jarayon

2018 yil va hozir

2018 yilga kelib, ilovalarni yaratish va tarqatish jarayoni butunlay Jenkinsga o'tdi, ishlab chiquvchilar o'z mashinalaridan chiqarishni to'xtatdilar va faqat relizlar guruhi chiqarish huquqiga ega edi.

Biz allaqachon testlar va statik tahlillarni ishga tushirishni yaxshilashni xohladik va skriptlarimiz o'sdi va o'sdi. Ilovalarimiz bilan birga o'sdi va o'zgardi. O'sha paytda 10 ga yaqin ilovalar mavjud edi.Bizda ikkita platforma borligini hisobga olsak, bu 20 ga yaqin "jonli" skriptlar.

Har safar biz skriptga yangi qadam qo'shmoqchi bo'lganimizda, qismlarni barcha qobiq skriptlariga nusxalash va joylashtirishimiz kerak edi. Ehtimol, biz ehtiyotkorlik bilan ishlagan bo'lardik, lekin ko'pincha bunday o'zgarishlar matn terish xatolari bilan tugaydi, bu esa relizlar guruhi uchun skriptlarni tuzatish va qaysi aqlli yigit bu buyruqni qo'shganini va aslida nima qilishini bilish uchun oqshomga aylandi. Umuman olganda, bitta platforma uchun yig'ish uchun skriptlar hech bo'lmaganda biroz o'xshash edi, deb aytish mumkin emas. Garchi ular, albatta, xuddi shunday qilishgan.

Yangi dastur uchun jarayonni boshlash uchun ushbu skriptlarning "yangi" versiyasini tanlash, disk raskadrovka qilish va "ha, u ishlaydi" deb aytish uchun bir kun sarflash kerak edi.

2018 yilning yozida biz yana bir bor rivojlanayotgan fastlane tomon qaradik.

Vazifa β„–1: barcha skript bosqichlarini umumlashtiring va ularni Fastfile-da qayta yozing

Biz boshlaganimizda, bizning skriptlarimiz Jenkinsdagi bitta qobiqli skriptdagi barcha qadamlar va tayoqlardan iborat oyoq kiyimiga o'xshardi. Biz hali quvur liniyasiga va bosqichma-bosqich bo'linishga o'tganimiz yo'q.

Biz o'zimizdagi narsalarni ko'rib chiqdik va CI/CD tavsifiga mos keladigan 4 bosqichni aniqladik:

  • qurish - bog'liqliklarni o'rnatish, arxivni yig'ish,
  • test - ishlab chiquvchi birligi testlarini o'tkazish, qamrovni hisoblash,
  • sonar - barcha linterlarni ishga tushiradi va SonarQube-ga hisobotlarni yuboradi,
  • deploy β€” artefaktni alfaga yuborish (TestFlight).

Va agar siz harakatlarda ishlatiladigan kalitlarni o'tkazib yuborib, tafsilotlarga kirmasangiz, ushbu Fastfaylni olasiz:

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

Darhaqiqat, bizning birinchi Fastfile, bizga kerak bo'lgan ba'zi tayoqchalar va biz almashtirgan parametrlar sonini hisobga olgan holda dahshatli bo'lib chiqdi:

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

Yuqoridagi misolda biz ko'rsatishimiz kerak bo'lgan parametrlarning faqat bir qismi: bular qurish parametrlari - sxema, konfiguratsiya, Ta'minot profili nomlari, shuningdek tarqatish parametrlari - ishlab chiquvchi hisobining Apple ID i, parol, dastur identifikatori va boshqalar. yoqilgan. Birinchi taxmin sifatida biz ushbu kalitlarning barchasini maxsus fayllarga joylashtirdik - Gymfile, Matchfile ΠΈ Appfile.

Endi Jenkinsda siz ko'rinishni xira qilmaydigan va ko'z bilan osongina o'qiladigan qisqa buyruqlarni chaqirishingiz mumkin:

# fastlane ios <lane_name>

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

Huray, biz zo'rmiz

Nima oldingiz? Har bir qadam uchun buyruqlarni tozalang. Skriptlar tozalangan, fastlane fayllarida tartiblangan. Xursand bo'lib, biz ishlab chiquvchilarga o'z omborlariga kerakli narsalarni qo'shishlarini so'rab yugurdik.

Ammo biz vaqt o'tishi bilan biz xuddi shunday qiyinchiliklarga duch kelishimizni angladik - bizda hali ham u yoki bu tarzda o'z hayotlarini boshlaydigan 20 ta montaj skriptlari bo'ladi, ularni tahrirlash qiyinroq bo'ladi, chunki skriptlar omborlarga o'tadi, va biz u erga kira olmadik. Va umuman olganda, bizning dardimizni bu tarzda hal qilish mumkin bo'lmaydi.

Mobil CICD tajribasi: ko'plab mobil ilovalar uchun bitta tezkor standart

Vazifa β„–2: N ilovalar uchun bitta Fastfile oling

Endi muammoni hal qilish unchalik qiyin emasga o'xshaydi - o'zgaruvchilarni o'rnating va ketaylik. Ha, aslida, muammo shu tarzda hal qilindi. Ammo biz uni buzayotganimizda, biz fastlane-ning o'zida ham, fastlane yozilgan Ruby-da ham, tarmoqdagi foydali misollarga ham ega emasmiz - o'sha paytda fastlane haqida yozganlarning hammasi bitta dastur uchun misol bilan cheklangan edi. bitta ishlab chiquvchi uchun.

Fastlane muhit o'zgaruvchilari bilan ishlay oladi va biz allaqachon Keychain parolini o'rnatish orqali buni sinab ko'rdik:

ENV['KEYCHAIN_PASSWORD']

Skriptlarimizni ko'rib chiqqach, biz umumiy qismlarni aniqladik:

#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

Endi ushbu kalitlarni fastlane fayllarida ishlatishni boshlash uchun biz ularni u erga qanday etkazib berishni aniqlashimiz kerak edi. Fastlane buning uchun yechimga ega: o'zgaruvchilarni dotenv orqali yuklash. Hujjatlarda aytilishicha, agar siz turli maqsadlar uchun kalitlarni yuklash muhim bo'lsa, fastlane katalogida bir nechta konfiguratsiya fayllarini yarating. .env, .env.default, .env.development.

Va keyin biz bu kutubxonadan biroz boshqacha foydalanishga qaror qildik. Keling, ishlab chiquvchilar omboriga fastlane skriptlari va uning meta-ma'lumotlarini emas, balki fayldagi ushbu ilovaning noyob kalitlarini joylashtiramiz. .env.appName.

Sami Fastfile, Appfile, Matchfile ΠΈ Gymfile, biz uni alohida omborga yashirdik. U erda boshqa xizmatlarning parol kalitlari bilan qo'shimcha fayl yashiringan - .env.
Siz misolni ko'rishingiz mumkin shu yerda.

Mobil CICD tajribasi: ko'plab mobil ilovalar uchun bitta tezkor standart

CI-da qo'ng'iroq deyarli o'zgarmadi; ma'lum bir dastur uchun konfiguratsiya kaliti qo'shildi:

# 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

Buyruqlarni ishga tushirishdan oldin biz omborimizni skriptlar bilan yuklaymiz. Juda chiroyli ko'rinmaydi:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Fastlane-da Fastfile-ni yuklab olish uchun yechim mavjud bo'lsa-da, hozircha bu yechimni qoldirdi harakat import_from_git, lekin u faqat Fastfile uchun ishlaydi, lekin boshqa fayllar uchun emas. Agar siz "haqiqatan ham go'zal" ni istasangiz, o'zingizni yozishingiz mumkin action.

Shunga o'xshash to'plam Android ilovalari va ReactNative uchun yaratilgan, fayllar bir xil omborda, lekin turli filiallarda. iOS, android ΠΈ react_native.

Chiqarish guruhi yangi qadam qo'shmoqchi bo'lganda, skriptdagi o'zgarishlar git-da MR orqali qayd etiladi, endi buzilgan skriptlarning aybdorlarini qidirishning hojati yo'q va umuman, endi uni buzishga harakat qilish kerak.

Endi bu aniq

Ilgari biz barcha skriptlarni saqlash, ularni yangilash va yangilanishlarning barcha oqibatlarini tuzatishga vaqt sarfladik. Relizlardagi xatolar va ishlamay qolish sabablari oddiy matn terish xatolari bo'lganida, bu juda xafa bo'ldi, ularni qobiq skriptlari chalkashligida kuzatib borish juda qiyin edi. Endi bunday xatolar minimal darajaga tushirildi. O'zgarishlar bir vaqtning o'zida barcha ilovalarga kiritiladi. Jarayonga yangi dasturni kiritish uchun 15 daqiqa vaqt ketadi - CI-da shablon quvurini o'rnating va ishlab chiquvchining omboriga kalitlarni qo'shing.

Android uchun Fastfile va dastur imzosi bilan bog'liq nuqta tushunarsiz bo'lib qolmoqda, agar maqola qiziqarli bo'lsa, men davomini yozaman. β€œUshbu muammoni qanday hal qilgan boβ€˜lardingiz?” degan savol yoki takliflaringizni izohlarda yoki Telegramda koβ€˜rishdan xursand boβ€˜laman. boshkirova.

Manba: www.habr.com

a Izoh qo'shish