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. Kepiye cara ngetrapake CI/CD ing kabeh aplikasi seluler, proses, lan asil pungkasan.

Ana akeh materi online babagan alat sing kurang banget ing wiwitan, mula aku ora bakal njlèntrèhaké kanthi rinci, nanging mung bakal ngrujuk apa sing ana ing jaman biyèn:

Artikel kasebut dumadi saka rong bagean:

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

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

Iku mung kedaden cara historis

2015 year

Kita lagi wae miwiti ngembangake aplikasi seluler, lan kita ora ngerti apa-apa babagan integrasi terus-terusan, DevOps, utawa barang-barang mewah liyane. Saben nganyari aplikasi diluncurake dening pangembang dhewe saka mesin dhewe. Lan yen kanggo Android Iku cukup prasaja - dikumpulake, ditandatangani .apk lan diunggah menyang Google Developer Console. Kanggo iOS, alat panyebaran Xcode wektu iku pancen angel banget - nyoba ngunggah arsip asring nyebabake kesalahan, sing mbutuhake kita nyoba maneh. Ternyata malah pangembang sing paling berpengalaman ngentekake kaping pirang-pirang wulan ora nulis kode, nanging ngeculake aplikasi kasebut.

2016 year

Kita wis diwasa, lan kita wis mikir babagan carane mbebasake wektu pangembang kanggo rilis. Kita uga duwe app liya, sing mung luwih nyurung kita menyang otomatisasi. Ing taun sing padha, kita nyebarake Jenkins kanggo pisanan lan nulis akeh skrip sing ala, meh padha karo pertunjukan 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 "appleId@example.com" 
-p "PASS_APPLE_ID"

Sayange, nganti saiki, mung pangembang sing ngerti carane skrip kasebut bisa digunakake lan kanggo apa sumber kunci sing ora ana telas iki, lan yen ana sing rusak maneh, dheweke sing entuk "sore mewah" kanggo nganalisa log.

2017 year

Ing taun kasebut, kita nemokake sing diarani Fastlane. Ora ana informasi sing akeh kaya saiki - carane nyiyapake, carane nggunakake. Lan alat kasebut isih rada kurang maju: kesalahan konstan mung nggawe frustasi, lan otomatisasi gaib sing dijanjekake angel dipercaya.

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

Skrip kita wis ditapis rada.

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

Padha wis dadi ennobled paling amarga ora kabeh paramèter perlu kanggo xcodebuild, sampeyan kudu nemtokake - gym Iku bakal kanthi otomatis ngerti ngendi kabeh. 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 ngirit wektu kanggo ndandani bangunan sing rusak, lan kadhangkala tim rilis bisa nemtokake dhewe.

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

Proses siji kanggo kabeh aplikasi

Taun 2018 lan saiki

Ing taun 2018, proses mbangun lan nyebarake aplikasi wis rampung pindhah menyang Jenkins. Developers ora maneh dirilis saka mesin dhewe; mung tim release duwe hak kanggo mbebasake.

Kita wis semangat kanggo nyaring eksekusi tes lan analisis statis, lan skrip kita terus berkembang. Padha tuwuh lan diganti bebarengan karo aplikasi kita. Ing wektu iku, kita duwe udakara 10 aplikasi. Ngelingi kita duwe rong platform, yaiku udakara 20 skrip "urip".

Saben-saben kita pengin nambah langkah anyar menyang skrip, kita kudu nyalin-tempel bit lan potongan menyang kabeh skrip cangkang. Mbok menawa kita bisa luwih ati-ati, nanging owah-owahan kasebut asring nyebabake kesalahan ketik, sing pungkasane dadi sore karo tim rilis kanggo ndandani skrip lan ngerteni sapa sing pinter sing nambahake prentah iki lan apa sing ditindakake. Sakabèhé, angel ngomong manawa skrip mbangun kanggo saben platform malah meh padha. Senajan padha mesthi nindakake bab sing padha.

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

Ing mangsa panas 2018, kita ndeleng maneh ing fastlane sing isih berkembang.

Tugas #1: Ringkesan kabeh langkah skrip lan tulis maneh menyang Fastfile

Nalika kita miwiti, skrip kita katon kaya jumble saka langkah lan hacks kabeh kebungkus ing script shell siji ing Jenkins. Kita durung pindhah menyang jalur pipa lan jadwal basis panggung.

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

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

Tanpa rinci banget lan ngilangi tombol sing digunakake ing tumindak kasebut, sampeyan bakal entuk Fastfile kaya 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 monstrositas, amarga sawetara hacks sing isih dibutuhake lan jumlah parameter sing diwenehake:

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: "appleId@example.com",
  app_identifier: "com.example.app",
  dev_portal_team_id: "TEAM_ID_NUMBER_DEV",
  team_id: "ITS_TEAM_ID")
end

Ing conto ing ndhuwur, kita mung kudu nemtokake sawetara paramèter: mbangun paramèter-skema, konfigurasi, jeneng Profil Provision-uga paramèter distribusi-akun pangembang Apple ID, sandhi, ID aplikasi, lan liya-liyane. Secara kasar, kita wis nyelehake kabeh kunci kasebut ing file khusus- Gymfile, Matchfile и Appfile.

Saiki ing Jenkins sampeyan bisa nelpon printah singkat sing gampang diwaca lan ora clutter tampilan:

# fastlane ios <lane_name>

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

Hooray, kita nindakake kanthi apik!

Apa sing kita entuk? Mbusak printah kanggo saben langkah. Skrip sing resik, diatur kanthi rapi dadi file Fastlane. Seneng banget, kita cepet-cepet menyang pangembang kanthi njaluk nambahake kabeh sing dibutuhake ing repositori.

Nanging kita temen maujud ing wektu sing kita bakal nemoni kangelan padha-kita isih bakal duwe 20 mbangun script sing pungkasanipun bakal njupuk ing urip dhewe, lan nyunting bakal luwih angel amarga Tulisan bakal dipindhah menyang repositori, kang kita ora bakal duwe akses kanggo. Lan, pungkasane, iki ora bakal ngrampungake masalah kita.

Pengalaman CICD seluler: siji standar fastlane kanggo akeh aplikasi seluler

Tantangan #2: Entuk Fastfile siji kanggo aplikasi N

Saiki misale jek ngrampungake masalah iki ora angel banget - mung nyetel variabel lan mateni. Lan sing bener carane kita ditanggulangi. Nanging nalika kita ngleksanakake, kita ora duwe keahlian ing Fastlane dhewe, utawa ing Ruby, basa Fastlane ditulis, utawa conto sing migunani online-kabeh wong sing nulis babagan Fastlane banjur diwatesi dadi conto kanggo aplikasi siji kanggo pangembang siji.

Fastlane bisa nangani variabel lingkungan, lan kita wis nyoba iki kanthi nyetel sandhi kanggo 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
APPLE_ID=appleID@example.com
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789

Saiki, kanggo miwiti nggunakake tombol kasebut ing file Fastlane, kita kudu ngerti carane ngirim ing kana. Fastlane duwe solusi kanggo iki: Loading variabel liwat dotenvDokumentasi kasebut ujar manawa sampeyan kudu 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. Kita bakal nyelehake ing repositori pangembang dudu skrip Fastlane lan metadata, nanging kunci unik kanggo aplikasi iki ing file. .env.appName.

Piyambak Fastfile, Appfile, Matchfile и GymfileKita ndhelikake ing gudang sing kapisah. Kita uga ndhelikake file tambahan ing kana kanthi kunci lan sandhi kanggo layanan liyane- .env.
Punika conto, sampeyan bisa ndeleng iku kene.

Pengalaman CICD seluler: siji standar fastlane kanggo akeh aplikasi seluler

Panggilan CI ora owah akeh, mung tombol konfigurasi khusus aplikasi sing 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 mbukak printah, kita mbukak repositori karo skrip. Ora katon ayu banget:

git clone git@repository.com/FastlaneCICD.git fastlane_temp

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

Saiki kita wis ninggalake solusi iki, sanajan Fastlane duwe solusi kanggo ndownload Fastfile liwat tumindak import_from_git, nanging mung dianggo kanggo Fastfile, ora kanggo file liyane. Yen sampeyan pengin dadi apik tenan, sampeyan bisa nulis dhewe. action.

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

Nalika tim rilis pengin nambah langkah anyar, owah-owahan ing skrip ditindakake liwat MR ing git. Ora perlu maneh goleki panyebab skrip sing rusak, lan umume, ngrusak saiki mbutuhake upaya.

Saiki wis mesthi

Sadurunge, kita nglampahi wektu kanggo njaga kabeh skrip, nganyari, lan ndandani kabeh akibat saka nganyari. Iku luar biasa mumetake nalika kasalahan lan release downtime disebabake typo prasaja, dadi angel kanggo trek mudhun ing kekacoan saka script shell. Saiki, kesalahan kasebut diminimalisir. Owah-owahan diluncurake menyang kabeh aplikasi bebarengan. Lan nambahake aplikasi anyar menyang proses kasebut mbutuhake 15 menit - nyiyapake pipa cithakan ing CI lan nambahake kunci menyang gudang pangembang.

Koyone intine karo Fastfile isih durung diterangake Android lan tandha tangan aplikasi kasebut. Yen artikel kasebut menarik, aku bakal nulis sekuel. Aku seneng ngrungokake pitakon utawa saran sampeyan babagan carane sampeyan ngrampungake masalah iki ing komentar utawa ing Telegram. Bashkirova.

Source: www.habr.com

Tuku hosting sing dipercaya kanggo situs kanthi proteksi DDoS, server VPS VDS 🔥 Tuku hosting situs web sing bisa dipercaya nganggo proteksi DDoS, server VPS VDS | ProHoster