Pangalaman CICD Mobile: hiji standar fastlane pikeun seueur aplikasi mobile

Pangalaman CICD Mobile: hiji standar fastlane pikeun seueur aplikasi mobile
Abdi hoyong ngobrol ngeunaan integrasi sareng pangiriman kontinyu pikeun aplikasi sélulér nganggo fastlane. Kumaha urang nerapkeun CI / CD dina sakabéh aplikasi mobile, kumaha urang meunang aya na naon anu lumangsung dina tungtungna.

Geus aya cukup bahan dina jaringan dina alat, nu urang jadi kakurangan dina mimiti, jadi kuring ngahaja moal ngajelaskeun alat di jéntré, tapi ngan bakal ngarujuk kana naon urang tadi:

Artikel diwangun ku dua bagian:

  • Latar pikeun mecenghulna mobile CI / CD di pausahaan
  • solusi teknis pikeun rolling kaluar CI / CD pikeun N-aplikasi

Bagian kahiji langkung seueur nostalgia pikeun jaman baheula, sareng anu kadua mangrupikeun pangalaman anu anjeun tiasa nerapkeun ka diri anjeun.

Ieu kumaha kajadian sajarahna

Taun 2015

Kami nembé ngamimitian ngembangkeun aplikasi sélulér, teras urang henteu terang nanaon ngeunaan integrasi kontinyu, ngeunaan DevOps sareng hal-hal anu modis. Unggal apdet aplikasi digulung ku pamekar sorangan tina mesin na. Sareng upami pikeun Android éta saderhana - dirakit, ditandatanganan .apk sareng diunggah ka Konsol Pangembang Google, teras pikeun ios alat distribusi teras liwat Xcode ngantunkeun kami sonten anu saé - usaha pikeun ngaunduh arsip sering ditungtungan ku kasalahan sareng urang kedah nyobian deui. Tétéla pamekar anu paling maju henteu nyerat kode sababaraha kali sabulan, tapi ngaluarkeun aplikasina.

Taun 2016

Urang dewasa, urang parantos gaduh pamikiran ngeunaan cara ngabebaskeun pamekar ti sadinten kanggo dileupaskeun, sareng aplikasi kadua ogé muncul, anu ngan ukur ngadorong urang ka arah otomatis. Dina taun anu sami, urang masang Jenkins pikeun kahiji kalina sareng nyerat sakumpulan skrip pikasieuneun, sami sareng anu nunjukkeun fastlane dina dokuméntasi na.

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

Hanjakalna, dugi ka ayeuna ngan ukur pamekar urang anu terang kumaha skrip ieu jalan sareng naha tumpukan konci anu henteu terbatas ieu diperyogikeun, sareng nalika aya anu rusak deui, aranjeunna nampi "peuting anu saé" pikeun nganalisa log.

Taun 2017

Taun ieu urang diajar yén aya anu sapertos fastlane. Henteu aya seueur inpormasi sapertos ayeuna - kumaha ngamimitian hiji, kumaha cara ngagunakeunana. Sareng alatna sorangan masih kasar dina waktos éta: kasalahan konstan ngan ukur kuciwa kami sareng sesah percanten kana otomatisasi gaib anu dijanjikeun.

Nanging, utilitas utama anu kalebet dina inti fastlane nyaéta gym и pilot, urang junun ngamimitian eta.

Aksara urang geus ningkat saeutik.

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

Aranjeunna geus ningkat, lamun ngan kusabab teu kabeh parameter dipikabutuh pikeun xcodebuild, anjeun kedah nunjukkeun- gym bakal bebas ngartos dimana jeung naon perenahna. Jeung pikeun leuwih fine-tuning, Anjeun bisa nangtukeun kenop sarua jeung dina xcodebuild, ngan ngaran kenop nu leuwih jelas.

Waktos ieu, hatur nuhun kana gim sareng formatter xcpretty anu diwangun, log ngawangun janten langkung kabaca. Ieu mimiti ngahemat waktos dina ngalereskeun rakitan rusak, sarta kadangkala tim release bisa angka kaluar sorangan.

Hanjakal, ukuran speed assembly xcodebuild и gym Kami henteu ngalakukeun éta, tapi kami bakal percanten kana dokuméntasi - dugi ka 30% nyepetkeun.

Prosés tunggal pikeun sadaya aplikasi

Taun 2018 sareng ayeuna

Taun 2018, prosés ngawangun sareng ngagulung aplikasi parantos dipindahkeun ka Jenkins, pamekar dieureunkeun ngaleupaskeun tina mesinna, sareng ngan ukur tim pelepasan anu ngagaduhan hak ngaleupaskeun.

Kami parantos hoyong ningkatkeun peluncuran tés sareng analisa statik, sareng skrip kami tumbuh sareng ningkat. Tumuwuh sareng robih sareng aplikasi kami. Waktu éta, aya ngeunaan aplikasi 10. Tempo yén urang boga dua platform, éta ngeunaan 20 "hirup" Aksara.

Unggal waktos urang hoyong nambihan léngkah énggal kana naskah, urang kedah nyalin-témpél potongan-potongan éta kana sadaya skrip cangkang. Panginten urang tiasa damel langkung ati-ati, tapi sering parobihan sapertos kitu ditungtungan ku typos, anu janten sonten pikeun tim sékrési pikeun ngalereskeun naskah sareng milari anu pinter anu nambihan paréntah ieu sareng naon anu leres-leres dilakukeun. Sacara umum, teu bisa disebutkeun yen naskah pikeun assembly pikeun hiji platform éta sahenteuna rada sarupa. Sanajan aranjeunna pasti ngalakukeun hal anu sarua.

Pikeun ngamimitian prosés pikeun aplikasi anyar, anjeun kedah nyéépkeun sadinten pikeun milih versi "seger" tina skrip ieu, debug sareng ucapkeun yén "enya, éta jalan."

Dina usum panas 2018, urang sakali deui ningali ka arah jalan gancang anu masih berkembang.

Tugas #1: nyimpulkeun sadaya léngkah skrip sareng tuliskeun deui dina Fastfile

Nalika urang ngamimitian, skrip urang katingali sapertos footcloth anu diwangun ku sadaya léngkah sareng crutches dina hiji naskah cangkang di Jenkins. Kami henteu acan ngalih ka pipa sareng divisi ku panggung.

Kami ningali naon anu kami gaduh sareng ngaidentipikasi 4 léngkah anu cocog sareng katerangan CI / CD kami:

  • ngawangun - masang dependensi, assembling arsip,
  • tés - ngajalankeun tés unit pamekar, ngitung cakupan,
  • sonar - ngaluncurkeun sadaya linters sareng ngirim laporan ka SonarQube,
  • nyebarkeun - ngirim artefak ka alfa (TestFlight).

Sareng upami anjeun henteu terangkeun detil, ngaleungitkeun konci anu dianggo dina tindakan, anjeun bakal nampi Fastfile ieu:

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

Nyatana, Fastfile munggaran urang tétéla pikasieuneun, nimbangkeun sababaraha crutches anu masih kami butuhkeun sareng jumlah parameter anu kami ganti:

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

Dina conto di luhur, ngan ukur bagian tina parameter anu urang kedah tangtoskeun: ieu mangrupikeun parameter ngawangun - skéma, konfigurasi, nami Propil Propil, ogé parameter distribusi - ID Apple tina akun pamekar, kecap akses, ID aplikasi, sareng anu sanésna. asup. Salaku perkiraan munggaran, urang nempatkeun sadaya konci ieu dina file khusus - Gymfile, Matchfile и Appfile.

Ayeuna di Jenkins anjeun tiasa nyauran paréntah pondok anu henteu kabur pandangan sareng gampang dibaca ku panon:

# fastlane ios <lane_name>

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

Hurray, urang hebat

Naon anu anjeun kéngingkeun? Hapus paréntah pikeun unggal léngkah. Diberesihan naskah, disusun rapih dina file fastlane. Rejoicing, urang lumpat ka pamekar nanya ka aranjeunna pikeun nambahkeun sagalana aranjeunna diperlukeun pikeun repositories maranéhanana.

Tapi urang sadar dina jangka waktu nu urang bakal sapatemon kasusah sarua - urang masih bakal boga 20 skrip assembly nu bakal salah sahiji atawa cara séjén ngawitan hirup hirup sorangan, éta bakal leuwih hese pikeun ngédit aranjeunna, saprak naskah bakal pindah ka repositories. sarta kami teu boga aksés aya. Sareng, sacara umum, moal mungkin pikeun ngabéréskeun nyeri urang ku cara ieu.

Pangalaman CICD Mobile: hiji standar fastlane pikeun seueur aplikasi mobile

Tugas #2: kéngingkeun Fastfile tunggal pikeun aplikasi N

Ayeuna sigana yén ngarengsekeun masalah teu jadi hésé - set variabel, sarta hayu urang balik. Leres, kanyataanna, éta kumaha masalahna direngsekeun. Tapi dina momen nalika urang ngaganggu éta, urang henteu gaduh kaahlian dina fastlane sorangan, atanapi di Ruby, dimana fastlane ditulis, atanapi conto anu mangpaat dina jaringan - sadayana anu nyerat ngeunaan fastlane teras dugi ka conto pikeun hiji aplikasi. pikeun hiji pamekar.

Fastlane tiasa ngadamel variabel lingkungan, sareng kami parantos nyobian ieu ku netepkeun kecap konci Keychain:

ENV['KEYCHAIN_PASSWORD']

Saatos ningali naskah kami, kami ngaidentipikasi bagian umum:

#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

Ayeuna, pikeun ngamimitian nganggo konci ieu dina file fastlane, urang kedah terang kumaha cara ngirimna ka dinya. Fastlane gaduh solusi pikeun ieu: loading variabel via dotenv. Dokuméntasi nyarios yén upami penting pikeun anjeun ngamuat konci pikeun tujuan anu béda, jieun sababaraha file konfigurasi dina diréktori fastlane. .env, .env.default, .env.development.

Lajeng urang mutuskeun pikeun ngagunakeun perpustakaan ieu saeutik béda. Hayu urang nempatkeun dina gudang pamekar sanes skrip fastlane sareng inpormasi meta na, tapi konci unik tina aplikasi ieu dina file. .env.appName.

Diri Fastfile, Appfile, Matchfile и Gymfile, urang nyumput dina gudang misah. Berkas tambahan sareng konci kecap konci tina jasa anu sanés disumputkeun di dinya - .env.
Anjeun tiasa ningali conto di dieu.

Pangalaman CICD Mobile: hiji standar fastlane pikeun seueur aplikasi mobile

Dina CI, teleponna henteu seueur robih; konci konfigurasi pikeun aplikasi anu khusus parantos ditambah:

# 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

Sateuacan ngajalankeun paréntah, urang muka Repository kami nganggo skrip. Teu katingali saé pisan:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Ninggalkeun solusi ieu kanggo ayeuna, sanaos Fastlane gaduh solusi pikeun ngaunduh Fastfile via aksi import_from_git, tapi ngan lumaku pikeun Fastfile, tapi henteu pikeun file séjén. Upami anjeun hoyong "bener geulis", Anjeun bisa nulis sorangan action.

Set anu sami dilakukeun pikeun aplikasi Android sareng ReactNative, filena aya dina gudang anu sami, tapi dina cabang anu béda. iOS, android и react_native.

Nalika tim sékrési hoyong nambihan sababaraha léngkah énggal, parobihan dina naskah dirékam via MR di git, teu aya deui anu peryogi milarian penjahat naskah rusak, sareng sacara umum, ayeuna anjeun kedah nyobian ngarobih.

Ayeuna éta pasti

Sateuacanna, urang nyéépkeun waktos pikeun ngajaga sadaya skrip, ngapdet aranjeunna sareng ngalereskeun sadaya akibat tina pembaruan. Hal ieu kacida nguciwakeun nalika alesan pikeun kasalahan sarta downtime dina Kaluaran éta typos basajan anu jadi hésé pikeun ngalacak dina jumble tina Aksara cangkang. Ayeuna kasalahan sapertos diréduksi jadi minimum. Parobihan digulung ka sadaya aplikasi sakaligus. Sareng peryogi 15 menit pikeun nempatkeun aplikasi énggal kana prosésna - nyetél pipa témplat dina CI sareng tambahkeun konci kana gudang pamekar.

Sigana yén titik sareng Fastfile pikeun Android sareng tanda tangan aplikasi tetep teu jelas; upami tulisan éta pikaresepeun, kuring bakal nyerat tuluyan. Abdi bakal bungah ningali patarosan atanapi saran anjeun "kumaha anjeun bakal ngabéréskeun masalah ieu" dina koméntar atanapi dina Telegram bashkirova.

sumber: www.habr.com

Tambahkeun komentar