Mobil ilovalar uchun CI/CD: Fastlane va Codemagic bilan avtoyig‘ish
Chuqur3 daqInnovialabs tahririyati
Qisqacha
Fastlane reliz bosqichlarini kod sifatida tavsiflaydi (imzolash, yig‘ish, testlar, do‘konlarga yuklash), Codemagic esa bulutdagi macOS mashinalari va tayyor nashr qilishni beradi. Ko‘pincha ular birga ishlatiladi, maxfiy kalitlar esa faqat shifrlangan CI o‘zgaruvchilarida saqlanadi.
Nimani va nima bilan avtomatlashtirish kerak
Mobil ilovani qo‘lda reliz qilish — o‘nga yaqin qadam: yig‘ish raqamini oshirish, imzolash, yig‘ish, testlarni ishga tushirish, TestFlight va Google Play’ga yuklash. Har bir qadam — xato qilish ehtimoli. Pipeline buni har bir commit yoki tegda bir xil bajaradi.
- Fastlane — ochiq kodli vosita, unda reliz
Fastfileichidagi «yo‘laklar» (lanes) sifatida yoziladi. Lokal kompyuterda ham, istalgan CI’da ham ishlaydi. - Codemagic — macOS va Linux mashinalari,
codemagic.yamlkonfiguratsiyasi, tayyor imzolash va do‘konlarga nashr qilish imkoniyatiga ega bulutli CI/CD. Flutter, React Native va nativ loyihalarni yaxshi qo‘llab-quvvatlaydi.
Ular raqobatchi emas: reliz mantig‘i Fastlane’da yozilgan bo‘lsa, uni Codemagic ichida ishga tushirish mumkin.
Odatiy pipeline
- Kod va bog‘liqliklarni olish.
- Linter va testlarni ishga tushirish — xato bo‘lsa reliz to‘xtaydi.
- Sertifikat va profillarni (iOS) yoki keystore’ni (Android) o‘rnatish.
- Yig‘ish raqamini belgilash.
.ipava.aabfayllarini yig‘ish.- TestFlight’ga va Google Play’ning ichki trekiga yuklash.
- Jamoani xabardor qilish.
Fastlane: Fastfile namunasi
default_platform(:ios)
platform :ios do
lane :beta do
api_key = app_store_connect_api_key(
key_id: ENV["ASC_KEY_ID"],
issuer_id: ENV["ASC_ISSUER_ID"],
key_content: ENV["ASC_KEY_CONTENT"]
)
setup_ci
match(type: "appstore", readonly: true, api_key: api_key)
increment_build_number(
build_number: latest_testflight_build_number(api_key: api_key) + 1
)
build_app(scheme: "App", export_method: "app-store")
upload_to_testflight(api_key: api_key, skip_waiting_for_build_processing: true)
end
end
platform :android do
lane :internal do
gradle(task: "clean bundleRelease")
upload_to_play_store(track: "internal")
end
end
Asosiy jihatlar:
matchsertifikat va profillarni shifrlangan maxfiy repozitoriy yoki bulut omborida saqlaydi. Butun jamoa va CI bir xil fayllardan foydalanadi — «menda imzolanadi, senda yo‘q» muammosi yo‘qoladi.setup_ciCI mashinasida vaqtinchalik keychain yaratadi.- Apple ID login o‘rniga App Store Connect API kaliti — pipeline’da ikki bosqichli tasdiqlash so‘ralmaydi.
- Android’da
upload_to_play_storeGoogle Play xizmat akkauntining JSON kaliti orqali ishlaydi.
Codemagic: Flutter uchun misol
workflows:
ios-testflight:
integrations:
app_store_connect: CI key
environment:
flutter: stable
ios_signing:
distribution_type: app_store
bundle_identifier: com.example.app
scripts:
- name: Dependencies
script: flutter pub get
- name: Tests
script: flutter test
- name: Signing
script: xcode-project use-profiles
- name: Build
script: |
flutter build ipa --release \
--build-number=$BUILD_NUMBER \
--export-options-plist=/Users/builder/export_options.plist
artifacts:
- build/ios/ipa/*.ipa
publishing:
app_store_connect:
auth: integration
submit_to_testflight: true
Codemagic imzolash fayllarini App Store Connect integratsiyasi orqali o‘zi oladi. Android uchun publishing blokiga xizmat akkaunti kaliti va trek ko‘rsatilgan google_play qo‘shiladi.
Versiyalash
- Versiya (
1.4.0) — foydalanuvchilar uchun. Uni ongli ravishda, qo‘lda yoki teg bo‘yicha o‘zgartiring. - Yig‘ish raqami (
CFBundleVersion,versionCode) — doim o‘sib borishi shart bo‘lgan texnik raqam. Uni mashinaga topshirgan ma’qul.
Yig‘ish raqamining ishonchli manbalari:
- TestFlight yoki Google Play’dagi oxirgi raqam plyus bir;
- CI yig‘ishlar hisoblagichi (masalan, Codemagic’dagi
$BUILD_NUMBER); - commit’lar soni — faqat tarix hech qachon qayta yozilmasa.
Yig‘ish raqamini repozitoriyda qo‘lda tahrirlanadigan qiymat sifatida saqlamang: bu konfliktlar va rad etilgan yuklashlar manbai.
Pipeline’dagi maxfiy ma’lumotlar
Mobil pipeline ayniqsa qimmatli fayllar bilan ishlaydi: Android keystore, App Store Connect’ning .p8 kaliti, match paroli va Google xizmat akkauntining JSON fayli.
- Ularni repozitoriyga hech qachon commit qilmang, hatto maxfiy repozitoriyga ham.
- CI’ning shifrlangan o‘zgaruvchilarida saqlang. Binar fayllarni base64 ko‘rinishida saqlab, yig‘ish vaqtida dekodlang.
- Minimal huquqlar bering: Google Play xizmat akkauntiga faqat kerakli ilovalar, API kalitiga faqat kerakli rol.
- Reliz workflow’larini kim ishga tushira olishini cheklang va ularni fork’lardan kelgan pull request’larda ishga tushirmang.
- Keystore zaxira nusxasini alohida saqlang: o‘zingiz imzolasangiz va uni yo‘qotsangiz, ilovani yangilash juda qiyinlashadi. Play App Signing bu xavfni kamaytiradi.
Ko‘p uchraydigan xatolar
- Har bir commit va reliz uchun bitta pipeline — tekshirish va nashr qilishni ajrating.
- Testlar do‘konga yuklangandan keyin ishga tushadi, oldin emas.
- Sertifikatlar turli mashinalarda qo‘lda yaratilgan va bir-biriga zid.
- Bog‘liqliklar keshi yo‘q — yig‘ish kerakligidan ancha uzoq davom etadi.