Pengalaman CICD seluler: siji standar fastlane kanggo akeh aplikasi seluler

Pengalaman CICD seluler: siji standar fastlane kanggo akeh aplikasi seluler
Aku pengin ngomong babagan integrasi lan pangiriman sing terus-terusan kanggo aplikasi seluler nggunakake fastlane. Carane kita ngleksanakake CI / CD ing kabeh aplikasi seluler, carane kita teka lan apa kedaden ing pungkasan.

Ana cukup materi ing jaringan ing alat kasebut, sing ora ana ing wiwitan, mula aku ora bakal njlèntrèhaké alat kasebut kanthi rinci, nanging mung bakal ngrujuk marang apa sing wis ana:

Artikel kasebut dumadi saka rong bagean:

  • Latar mburi munculé CI/CD seluler ing perusahaan
  • Solusi teknis kanggo nggulung CI / CD kanggo N-aplikasi

Bagian pisanan luwih nostalgia kanggo jaman biyen, lan sing nomer loro yaiku pengalaman sing bisa ditrapake kanggo sampeyan dhewe.

Mangkono kedadeyan historis

2015 year

Kita mung miwiti ngembangake aplikasi seluler, banjur ora ngerti apa-apa babagan integrasi sing terus-terusan, babagan DevOps lan barang modis liyane. Saben nganyari aplikasi diluncurake dening pangembang dhewe saka mesine. Lan yen kanggo Android cukup prasaja - dirakit, ditandatangani .apk lan diunggah menyang Google Developer Console, banjur kanggo iOS alat distribusi banjur liwat Xcode ninggalake kita karo sore gedhe - nyoba kanggo ngundhuh arsip asring rampung ing kasalahan lan kita kudu nyoba maneh. Ternyata pangembang paling maju ora nulis kode kaping pirang-pirang sasi, nanging ngeculake aplikasi kasebut.

2016 year

Kita wis diwasa, kita wis duwe pikirane babagan carane mbebasake pangembang sedina muput kanggo diluncurake, lan aplikasi liya uga muncul, sing mung nyurung kita menyang otomatisasi. Ing taun sing padha, kita nginstal Jenkins kanggo pisanan lan nulis akeh skrip sing medeni, meh padha karo sing ditampilake fastlane ing dokumentasi.

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

Sayange, nganti saiki mung pangembang sing ngerti cara kerjane skrip kasebut lan kenapa tumpukan kunci sing ora ana telu iki dibutuhake, lan nalika ana sing rusak maneh, dheweke entuk "sore sing apik" kanggo nganalisa log.

2017 year

Taun iki kita sinau manawa ana sing diarani fastlane. Ora ana informasi akeh kaya saiki - carane miwiti, carane nggunakake. Lan alat kasebut dhewe isih mentah ing wektu kasebut: kesalahan konstan mung nguciwani kita lan angel percaya karo otomatisasi gaib sing dijanjekake.

Nanging, utilitas utama sing kalebu ing inti fastlane yaiku gym и pilot, kita bisa miwiti.

Skrip kita wis didandani sethithik.

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

Padha wis apik, yen mung amarga ora kabeh paramèter perlu kanggo xcodebuild, sampeyan kudu nuduhake - gym independen bakal ngerti ngendi lan apa dumunung. Lan kanggo nyetel luwih apik, sampeyan bisa nemtokake tombol sing padha kaya ing xcodebuild, mung jeneng tombol sing luwih cetha.

Wektu iki, thanks kanggo gym lan formatter xcpretty sing dibangun, log mbangun dadi luwih bisa dibaca. Iki wiwit ngirit wektu kanggo ndandani rakitan sing rusak, lan kadhangkala tim rilis bisa nemtokake dhewe.

Sayange, pangukuran kacepetan perakitan xcodebuild и gym Kita ora nindakake, nanging bakal dipercaya dokumentasi - nganti 30% nyepetake.

Proses tunggal kanggo kabeh aplikasi

Taun 2018 lan saiki

Ing 2018, proses mbangun lan nggulung aplikasi rampung pindhah menyang Jenkins, pangembang mandheg ngeculake mesin, lan mung tim rilis sing duwe hak ngeculake.

Kita wis pengin nambah peluncuran tes lan analisis statis, lan skrip kita tuwuh lan tuwuh. Tuwuh lan diganti bebarengan karo aplikasi kita. Ing wektu iku, ana udakara 10 aplikasi, amarga kita duwe rong platform, yaiku 20 skrip "urip".

Saben-saben kita pengin nambah langkah anyar kanggo skrip, kita kudu nyalin-tempel potongan kasebut menyang kabeh skrip cangkang. Bisa uga kita bisa kerja kanthi luwih ati-ati, nanging asring owah-owahan kasebut rampung kanthi kesalahan ketik, sing dadi sore kanggo tim rilis kanggo ndandani skrip lan ngerteni wong sing pinter sing nambahake prentah iki lan apa sing ditindakake. Umumé, ora bisa dikandhakake manawa skrip kanggo perakitan siji platform paling ora padha. Senajan padha mesthi nindakake bab sing padha.

Kanggo miwiti proses kanggo aplikasi anyar, sampeyan kudu ngentekake sedina kanggo milih versi "seger" saka skrip kasebut, debug lan ujar manawa "ya, kerjane."

Ing musim panas 2018, kita sepisan maneh ndeleng menyang fastlane sing isih berkembang.

Tugas #1: ngringkes kabeh langkah skrip lan tulis maneh ing Fastfile

Nalika kita miwiti, script kita katon kaya footcloth kasusun saka kabeh langkah lan crutches ing siji script shell ing Jenkins. Kita durung ngalih menyang pipa lan divisi kanthi tataran.

Kita ndeleng apa sing kita duwe lan nemtokake 4 langkah sing cocog karo deskripsi CI / CD:

  • mbangun - nginstal dependensi, ngrakit arsip,
  • tes - nglakokake tes unit pangembang, ngitung jangkoan,
  • sonar - ngluncurake kabeh linter lan ngirim laporan menyang SonarQube,
  • deploy — ngirim artefak menyang alpha (TestFlight).

Lan yen sampeyan ora ngerti rincian, ngilangi tombol sing digunakake ing tumindak, sampeyan bakal entuk Fastfile iki:

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

Nyatane, Fastfile pisanan kita dadi nggegirisi, nimbang sawetara kruk sing isih dibutuhake lan jumlah paramèter sing diganti:

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

Ing conto ing ndhuwur, mung bagean saka paramèter sing kudu ditemtokake: iki minangka parameter mbangun - skema, konfigurasi, jeneng Profil Provision, uga paramèter distribusi - ID Apple akun pangembang, sandhi, ID aplikasi, lan liya-liyane. ing. Minangka perkiraan pisanan, kita sijine kabeh tombol iki ing file khusus - Gymfile, Matchfile и Appfile.

Saiki ing Jenkins sampeyan bisa nelpon printah cendhak sing ora burem tampilan lan gampang diwaca dening mripat:

# fastlane ios <lane_name>

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

Hore, kita apik

Apa sampeyan entuk? Mbusak printah kanggo saben langkah. Skrip sing diresiki, disusun kanthi rapi ing file fastlane. Kanthi bungah, kita mlayu menyang pangembang njaluk dheweke nambahake kabeh sing dibutuhake menyang repositori.

Nanging kita temen maujud ing wektu sing kita bakal nemokke kangelan padha - kita isih bakal duwe 20 skrip perakitan sing siji cara utawa liyane bakal miwiti kanggo urip dhewe, iku bakal luwih angel kanggo nyunting, amarga skrip bakal pindhah menyang repositori. lan kita ora duwe akses ana. Lan, ing umum, ora bakal bisa ngatasi rasa nyeri kanthi cara iki.

Pengalaman CICD seluler: siji standar fastlane kanggo akeh aplikasi seluler

Tugas #2: entuk Fastfile siji kanggo aplikasi N

Saiki misale jek ngrampungake masalah kasebut ora angel - atur variabel, lan ayo. Ya, nyatane, kaya ngono masalah kasebut dirampungake. Nanging nalika kita ngaco, kita ora duwe keahlian ing fastlane dhewe, utawa ing Ruby, ing ngendi fastlane ditulis, utawa conto sing migunani ing jaringan - saben wong sing nulis babagan fastlane banjur diwatesi kanggo conto kanggo siji aplikasi. siji pangembang.

Fastlane bisa nangani variabel lingkungan, lan kita wis nyoba iki kanthi nyetel sandhi Keychain:

ENV['KEYCHAIN_PASSWORD']

Sawise ndeleng skrip, kita nemtokake bagean 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

Saiki, kanggo miwiti nggunakake tombol kasebut ing file fastlane, kita kudu ngerti kepiye cara ngirim ing kana. Fastlane duwe solusi kanggo iki: loading variabel liwat dotenv. Dokumentasi kasebut nyatakake yen penting kanggo sampeyan mbukak kunci kanggo macem-macem tujuan, gawe sawetara file konfigurasi ing direktori fastlane. .env, .env.default, .env.development.

Banjur kita mutusake nggunakake perpustakaan iki kanthi beda. Ayo diselehake ing gudang pangembang dudu skrip fastlane lan informasi meta, nanging tombol unik aplikasi iki ing file kasebut. .env.appName.

Piyambak Fastfile, Appfile, Matchfile и Gymfile, kita ndhelikake ing gudang sing kapisah. Berkas tambahan kanthi kunci sandhi saka layanan liyane didhelikake ing kana - .env.
Sampeyan bisa ndeleng conto kene.

Pengalaman CICD seluler: siji standar fastlane kanggo akeh aplikasi seluler

Ing CI, telpon ora diganti akeh tombol konfigurasi kanggo aplikasi tartamtu wis ditambahake:

# 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

Sadurunge nglakokake printah, kita mbukak gudang karo skrip. Ora katon apik banget:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Ninggalake solusi iki kanggo saiki, sanajan Fastlane duwe solusi kanggo ndownload Fastfile liwat tumindak import_from_git, nanging mung dianggo kanggo Fastfile, nanging ora kanggo file liyane. Yen sampeyan pengin "ayu tenan", sampeyan bisa nulis dhewe action.

Set sing padha digawe kanggo aplikasi Android lan ReactNative, file kasebut ana ing repositori sing padha, nanging ing macem-macem cabang. iOS, android и react_native.

Nalika tim rilis pengin nambah sawetara langkah anyar, owah-owahan ing script direkam liwat MR ing git, ana maneh sembarang perlu kanggo nggoleki culprits saka Tulisan rusak, lan ing umum, saiki sampeyan kudu nyoba kanggo break.

Saiki wis mesthi

Sadurunge, kita ngenteni wektu kanggo njaga kabeh skrip, nganyari lan ndandani kabeh akibat saka nganyari. Iku banget kuciwo nalika alasan kanggo kasalahan lan downtime ing release padha typo prasaja sing dadi angel kanggo nglacak ing jumble saka script shell. Saiki kasalahan kuwi wis suda kanggo minimal. Owah-owahan diluncurake menyang kabeh aplikasi bebarengan. Lan butuh 15 menit kanggo nglebokake aplikasi anyar ing proses kasebut - nyiyapake pipa cithakan ing CI lan tambahake tombol menyang gudang pangembang.

Iku misale jek sing titik karo Fastfile kanggo Android lan teken aplikasi tetep unexplained yen artikel menarik, aku bakal nulis terusan. Aku bakal seneng ndeleng pitakon utawa saran sampeyan "kepiye sampeyan ngatasi masalah iki" ing komentar utawa ing Telegram bashkirova.

Source: www.habr.com

Add a comment