Esperjenza CICD mobbli: standard wieħed fastlane għal ħafna applikazzjonijiet mobbli

Esperjenza CICD mobbli: standard wieħed fastlane għal ħafna applikazzjonijiet mobbli
Nixtieq nitkellem dwar l-integrazzjoni u l-kunsinna kontinwi għal apps mobbli li jużaw fastlane. Kif nimplimentaw CI/CD fuq l-applikazzjonijiet kollha tal-mowbajl, kif wasalna hemm u x’ġara fl-aħħar.

Diġà hemm biżżejjed materjal fuq in-netwerk fuq l-għodda, li tant kellna fil-bidu, għalhekk mhux se niddeskrivi l-għodda deliberatament fid-dettall, iżda nirreferi biss għal dak li kellna dak iż-żmien:

L-artikolu jikkonsisti f'żewġ partijiet:

  • Sfond għall-emerġenza ta 'CI/CD mobbli fil-kumpanija
  • Soluzzjoni teknika għat-tnedija ta' CI/CD għal N-applikazzjonijiet

L-ewwel parti hija aktar nostalġija għall-antik, u t-tieni hija esperjenza li tista’ tapplika għalik innifsek.

Hekk ġara storikament

Sena 2015

Għadna kemm bdejna niżviluppaw applikazzjonijiet mobbli, imbagħad ma konna nafu xejn dwar integrazzjoni kontinwa, dwar DevOps u affarijiet oħra tal-moda. Kull aġġornament tal-applikazzjoni ġie rrolljat mill-iżviluppatur innifsu mill-magna tiegħu. U jekk għal Android huwa pjuttost sempliċi - immuntat, iffirmat .apk u tellagħha fil-Google Developer Console, imbagħad għall-iOS l-għodda tad-distribuzzjoni ta’ dak iż-żmien permezz ta’ Xcode ħallietna serati mill-aqwa – tentattivi biex tniżżel l-arkivju spiss spiċċaw fi żbalji u kellna nerġgħu nippruvaw. Irriżulta li l-iżviluppatur l-aktar avvanzat ma jiktebx kodiċi diversi drabi fix-xahar, iżda pjuttost jirrilaxxa l-applikazzjoni.

Sena 2016

Aħna kiber, diġà kellna ħsibijiet dwar kif inħelsu l-iżviluppaturi minn ġurnata sħiħa għal rilaxx, u dehret ukoll it-tieni applikazzjoni, li biss imbuttatna aktar lejn l-awtomazzjoni. Dik l-istess sena, installajna Jenkins għall-ewwel darba u ktibna mazz ta 'skripts tal-biża', simili ħafna għal dawk li fastlane juri fid-dokumentazzjoni tiegħu.

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

Sfortunatament, s'issa l-iżviluppaturi tagħna biss kienu jafu kif jaħdmu dawn l-iskripts u għaliex dan il-munzell bla tarf ta 'ċwievet huwa meħtieġ, u meta xi ħaġa reġgħet kissru, kisbu l-"filgħaxija sabiħa" għall-analiżi ta' zkuk.

Sena 2017

Din is-sena tgħallimna li hemm ħaġa bħal fastlane. Ma kienx hemm informazzjoni daqskemm hemm issa - kif tibda waħda, kif tużaha. U l-għodda nnifisha kienet għadha mhux raffinata dak iż-żmien: żbalji kostanti ddiżappuntawna biss u kien diffiċli li nemmnu fl-awtomazzjoni maġika li wegħdu.

Madankollu, l-utilitajiet ewlenin inklużi fil-qalba fastlane huma gym и pilot, irnexxielna nibdewha.

L-iskripts tagħna ġew imtejba ftit.

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

Ġew imtejba, jekk biss minħabba li mhux il-parametri kollha meħtieġa għall xcodebuild, trid tindika - gym se jifhem b'mod indipendenti fejn u x'jinsab. U għal aktar irfinar, tista 'tispeċifika l-istess ċwievet bħal fil xcodebuild, l-ismijiet taċ-ċwievet biss huwa aktar ċar.

Din id-darba, grazzi għall-ġinnasju u l-formatter xcpretty integrat, il-build logs saru ħafna aktar leġibbli. Dan beda jiffranka l-ħin fuq l-iffissar ta 'assemblaġġi miksura, u xi kultant it-tim ta' rilaxx jista 'jidher waħdu.

Sfortunatament, kejl tal-veloċità tal-assemblaġġ xcodebuild и gym Aħna ma għamilniex, iżda se nafdaw id-dokumentazzjoni - sa 30% ta 'veloċità.

Proċess uniku għall-applikazzjonijiet kollha

Sena 2018 u preżenti

Sal-2018, il-proċess tal-bini u t-tnedija ta 'applikazzjonijiet kompletament imċaqlaq għal Jenkins, l-iżviluppaturi waqfu jirrilaxxaw mill-magni tagħhom, u t-tim tar-rilaxx biss kellu d-dritt li jirrilaxxa.

Diġà ridna ntejbu t-tnedija tat-testijiet u l-analiżi statika, u l-iskripts tagħna kibru u kibru. Kiber u nbidlet flimkien mal-applikazzjonijiet tagħna. Dak iż-żmien kien hemm madwar applikazzjonijiet 10. Meta wieħed iqis li għandna żewġ pjattaformi, jiġifieri madwar 20 skripts "ħajja".

Kull darba li ridna nżidu pass ġdid mal-iskript, kellna nikkopja-pejstna l-biċċiet fl-iskripts tal-qoxra kollha. Forsi stajna ħdimna aktar bir-reqqa, iżda ħafna drabi bidliet bħal dawn spiċċaw f'typos, li saru filgħaxija għat-tim tar-rilaxx biex jiffissa skripts u jiskopri liema raġel intelliġenti żied dan il-kmand u x'jagħmel fil-fatt. B'mod ġenerali, ma jistax jingħad li l-iskripts għall-assemblaġġ għal pjattaforma waħda kienu tal-inqas xi ftit simili. Għalkemm żgur li għamlu l-istess ħaġa.

Sabiex jinbeda proċess għal applikazzjoni ġdida, kien meħtieġ li tqatta 'ġurnata biex tagħżel verżjoni "ġdida" ta' dawn l-iskripts, tiddibaggjaha u tgħid li "iva, taħdem."

Fis-sajf tal-2018, erġajna ħares lejn il-fastlane li għadu qed jiżviluppa.

Kompitu #1: agħmel fil-qosor il-passi kollha tal-iskrittura u erġa' iktebhom f'Fastfile

Meta bdejna, l-iskripts tagħna dehru qishom drapp tas-saqajn li jikkonsisti mill-passi u l-krozzi kollha f'kitba ta 'qoxra waħda f'Jenkins. Għadna ma qlibniex għal pipeline u diviżjoni bi stadju.

Ħarsa lejn dak li għandna u identifikajna 4 passi li jaqblu mad-deskrizzjoni tas-CI/CD tagħna:

  • tibni - installazzjoni tad-dipendenzi, assemblaġġ tal-arkivju,
  • test — it-twettiq tat-testijiet tal-unità tal-iżviluppatur, il-kalkolu tal-kopertura,
  • sonar - iniedi l-linters kollha u jibgħat rapporti lil SonarQube,
  • skjerament — jibgħat artifact lil alpha (TestFlight).

U jekk ma tidħolx fid-dettalji, billi tħalli barra ċ-ċwievet użati fl-azzjonijiet, ikollok dan il-Fastfile:

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

Fil-fatt, l-ewwel Fastfile tagħna rriżulta li kien mostruż, meta wieħed iqis xi wħud mill-krozzi li għadna bżonnna u n-numru ta 'parametri li ssostitwijna:

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

Fl-eżempju ta 'hawn fuq, parti biss mill-parametri li għandna bżonn nispeċifikaw: dawn huma l-parametri tal-bini - skema, konfigurazzjoni, ismijiet tal-Profil tal-Provvista, kif ukoll parametri ta' distribuzzjoni - ID tat-tuffieħ tal-kont tal-iżviluppatur, password, ID tal-applikazzjoni, eċċ fuq. Bħala l-ewwel approssimazzjoni, aħna npoġġu dawn iċ-ċwievet kollha f'fajls speċjali - Gymfile, Matchfile и Appfile.

Issa f'Jenkins tista' ssejjaħ kmandi qosra li ma jċajprax il-vista u li jinqraw faċilment mill-għajn:

# fastlane ios <lane_name>

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

Hurrah, aħna kbar

X'ħadt? Kmandi ċari għal kull pass. Skripts imnaddfa, irranġati pulit f'fajls fastlane. Nifraħ, tlaqna lejn l-iżviluppaturi talbuhom biex iżidu dak kollu li kellhom bżonn mar-repożitorji tagħhom.

Iżda maż-żmien indunajna li se niltaqgħu ma' l-istess diffikultajiet - xorta jkollna 20 script ta' assemblaġġ li b'xi mod jew ieħor jibdew jgħixu ħajjithom, ikun aktar diffiċli li jeditjawhom, peress li l-iskripts jimxu għal repożitorji, u ma kellniex aċċess hemm. U, b'mod ġenerali, mhux se jkun possibbli li nsolvu l-uġigħ tagħna b'dan il-mod.

Esperjenza CICD mobbli: standard wieħed fastlane għal ħafna applikazzjonijiet mobbli

Kompitu #2: tikseb Fastfile wieħed għal N applikazzjonijiet

Issa jidher li s-soluzzjoni tal-problema mhix daqshekk diffiċli - issettja l-varjabbli, u ejja. Iva, fil-fatt, hekk ġiet solvuta l-problema. Iżda fil-mument meta ħriġna, la kellna għarfien espert fil-fastlane innifsu, u lanqas f'Ruby, li fih hemm miktub fastlane, u lanqas eżempji utli fuq in-netwerk - kull min kiteb dwar fastlane imbagħad kien limitat għal eżempju għal applikazzjoni waħda għal iżviluppatur wieħed.

Fastlane jista 'jimmaniġġja varjabbli ambjentali, u diġà ppruvajna dan billi waqqafna l-password Keychain:

ENV['KEYCHAIN_PASSWORD']

Wara li ħares lejn l-iskripts tagħna, identifikajna l-partijiet komuni:

#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

Issa, sabiex nibdew nużaw dawn iċ-ċwievet fil-fajls fastlane, kellna nifhmu kif inwassluhom hemmhekk. Fastlane għandu soluzzjoni għal dan: tagħbija varjabbli permezz dotenv. Id-dokumentazzjoni tgħid li jekk huwa importanti għalik li tagħbija ċwievet għal skopijiet differenti, oħloq diversi fajls ta 'konfigurazzjoni fid-direttorju fastlane .env, .env.default, .env.development.

U mbagħad iddeċidejna li nużaw din il-librerija ftit differenti. Ejja npoġġu fir-repożitorju tal-iżviluppaturi mhux l-iskripts tal-fastlane u l-meta-informazzjoni tiegħu, iżda ċ-ċwievet uniċi ta 'din l-applikazzjoni fil-fajl .env.appName.

Infushom Fastfile, Appfile, Matchfile и Gymfile, ħbejna f'repożitorju separat. Hemm moħbi fajl addizzjonali b'ċwievet tal-password minn servizzi oħra - .env.
Tista 'tara eżempju hawn.

Esperjenza CICD mobbli: standard wieħed fastlane għal ħafna applikazzjonijiet mobbli

Fuq CI, is-sejħa ma nbidlitx ħafna; ġiet miżjuda ċavetta ta' konfigurazzjoni għal applikazzjoni speċifika:

# 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

Qabel ma nħaddmu l-kmandi, aħna tagħbija r-repożitorju tagħna bi skripts. Ma tidhirx daqshekk sabiħ:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Ħalliet din is-soluzzjoni għalissa, għalkemm Fastlane għandu soluzzjoni għat-tniżżil ta ' Fastfile permezz azzjoni import_from_git, iżda jaħdem biss għal Fastfile, iżda mhux għal fajls oħra. Jekk trid "verament sabiħa", tista 'tikteb tiegħek action.

Sar sett simili għall-applikazzjonijiet Android u ReactNative, il-fajls huma fl-istess repożitorju, iżda f'fergħat differenti iOS, android и react_native.

Meta t-tim tar-rilaxx irid iżid xi pass ġdid, il-bidliet fl-iskrittura jiġu rreġistrati permezz ta 'MR f'git, m'għadx hemm bżonn li tfittex il-ħatja ta' skripts miksura, u b'mod ġenerali, issa trid tipprova tkisserha.

Issa dak hu żgur

Preċedentement, qattajna ħin inżommu l-iskripts kollha, naġġornawhom u nirranġaw il-konsegwenzi kollha tal-aġġornamenti. Kien diżappuntanti ħafna meta r-raġunijiet għall-iżbalji u l-perijodi ta' waqfien fir-rilaxxi kienu typos sempliċi li tant kienu diffiċli biex iżżomm kont tagħhom fil-ġebla ta' skripts tal-qoxra. Issa żbalji bħal dawn huma mnaqqsa għall-minimu. Il-bidliet jiġu implimentati fl-applikazzjonijiet kollha f'daqqa. U tieħu 15-il minuta biex tpoġġi applikazzjoni ġdida fil-proċess - waqqaf pipeline mudell fuq CI u żid iċ-ċwievet mar-repożitorju tal-iżviluppatur.

Jidher li l-punt b'Fastfile għall-Android u l-firma tal-applikazzjoni għadu mhux spjegat; jekk l-artiklu huwa interessanti, nikteb kontinwazzjoni. Inkun kuntent li nara l-mistoqsijiet jew is-suġġerimenti tiegħek "kif issolvi din il-problema" fil-kummenti jew fuq Telegram bashkirova.

Sors: www.habr.com

Żid kumment