Mobile CICD-ûnderfining: ien fastlane-standert foar in protte mobile applikaasjes

Mobile CICD-ûnderfining: ien fastlane-standert foar in protte mobile applikaasjes
Ik wol graach prate oer trochgeande yntegraasje en levering foar mobile apps mei fastlane. Hoe't wy CI/CD ymplementearje op alle mobile applikaasjes, hoe't wy dêr kamen en wat der úteinlik barde.

D'r is al genôch materiaal op it netwurk op it ark, dat wy yn it begjin sa misten, dus ik sil it ark mei opsetsin net yn detail beskriuwe, mar sil allinich ferwize nei wat wy doe hienen:

It artikel bestiet út twa dielen:

  • Eftergrûn foar it ûntstean fan mobile CI / CD yn it bedriuw
  • Technyske oplossing foar it útroljen fan CI / CD foar N-applikaasjes

It earste diel is mear nostalgy foar de âlde dagen, en it twadde is in ûnderfining dy't jo op josels kinne tapasse.

Dit is hoe't it histoarysk barde

Jier 2015

Wy binne krekt begûn mei it ûntwikkeljen fan mobile applikaasjes, doe wisten wy neat oer trochgeande yntegraasje, oer DevOps en oare modieuze dingen. Elke applikaasje-update waard útrôle troch de ûntwikkelder sels fan syn masine. En as it foar Android frij simpel is - gearstald, ûndertekene .apk en uploade it nei de Google Developer Console, dan foar iOS liet it doetiidske distribúsjeark fia Xcode ús mei geweldige jûnen - besykjen om it argyf te downloaden einige faaks yn flaters en wy moasten it nochris besykje. It die bliken dat de meast avansearre ûntwikkelder gjin koade meardere kearen yn 'e moanne skriuwt, mar leaver de applikaasje frijlitte.

Jier 2016

Wy groeide op, wy hiene al tinzen oer hoe't jo ûntwikkelders fan in hiele dei frijmeitsje kinne foar in frijlitting, en in twadde applikaasje ferskynde ek, dy't ús allinich mear nei automatisearring skood. Datselde jier hawwe wy Jenkins foar it earst ynstalleare en in boskje enge skripts skreaun, heul gelyk oan dyjingen dy't fastlane toant yn syn dokumintaasje.

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

Spitigernôch wisten oant no allinich ús ûntwikkelders hoe't dizze skripts wurkje en wêrom dizze einleaze stapel kaaien nedich is, en doe't der wer wat bruts, krigen se de "prachtige jûnen" foar it analysearjen fan logs.

Jier 2017

Dit jier hawwe wy leard dat der sa'n ding is as fastlane. D'r wie net safolle ynformaasje as no - hoe't jo ien begjinne, hoe't jo it brûke. En it ark sels wie op dat stuit noch rûch: konstante flaters makken ús allinich teloarsteld en it wie min te leauwen yn 'e magyske automatisearring dy't se tasein.

De wichtichste nutsbedriuwen opnommen yn 'e fastlane-kearn binne lykwols gym и pilot, wy slagge om te begjinne it.

Us skripts binne in bytsje ferbettere.

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

Se binne ferbettere, al is it mar omdat net alle parameters nedich foar xcodebuild, jo moatte oanjaan - gym sil selsstannich begripe wêr en wat leit. En foar mear fine-tuning kinne jo deselde toetsen opjaan as yn xcodebuild, allinnich de nammejouwing fan de kaaien is dúdliker.

Dizze kear, tank oan gym en de ynboude xcpretty formatter, binne de boulogboeken folle lêsber wurden. Dit begon tiid te besparjen op it reparearjen fan brutsen assemblies, en soms koe it releaseteam it sels útfine.

Spitigernôch, gearkomste snelheid mjittingen xcodebuild и gym Wy hawwe it net dien, mar wy sille de dokumintaasje fertrouwe - oant 30% fersnelling.

Ien proses foar alle applikaasjes

Jier 2018 en hjoed

Tsjin 2018 ferhuze it proses fan it bouwen en útroljen fan applikaasjes folslein nei Jenkins, ûntwikkelders stopten mei frijjaan fan har masines, en allinich it frijlittingsteam hie it rjocht om frij te litten.

Wy woenen de lansearring fan tests en statyske analyse al ferbetterje, en ús skripts groeiden en groeiden. Groeide en feroare tegearre mei ús applikaasjes. Op dat stuit wiene der sa'n 10 applikaasjes. Yn betinken nommen dat wy twa platfoarms hawwe, binne dat sa'n 20 "libjende" skripts.

Elke kear as wy in nije stap oan it skript taheakje woene, moasten wy de stikken kopiearje-plakke yn alle shell-skripts. Miskien hiene wy ​​foarsichtiger wurke kinnen, mar faaks einige sokke feroaringen yn typflaters, dy't jûns waarden foar it releaseteam om skripts te reparearjen en út te finen hokker tûke keardel dit kommando tafoege hat en wat it eins docht. Yn 't algemien kin net sein wurde dat de skripts foar gearstalling foar ien platfoarm op syn minst wat ferlykber wiene. Hoewol't se grif itselde dien.

Om in proses foar in nije applikaasje te begjinnen, wie it nedich om in dei te besteegjen om in "ferske" ferzje fan dizze skripts te selektearjen, it te debuggen en te sizzen dat "ja, it wurket."

Yn 'e simmer fan 2018 hawwe wy nochris sjoen nei de noch hieltyd ûntwikkeljende fastlane.

Taak #1: gearfetsje alle skriptstappen en skriuw se oer yn Fastfile

Doe't wy begûnen, like ús skripts as in fuotdoek besteande út alle stappen en krukken yn ien shell skript yn Jenkins. Wy binne noch net oergien op pipeline en divyzje foar poadium.

Wy seagen wat wy hawwe en identifisearre 4 stappen dy't passe by de beskriuwing fan ús CI / CD:

  • build - ynstallaasje fan ôfhinklikens, gearstalling fan it argyf,
  • test - tests foar ûntwikkeldersienheid útfiere, dekking berekkenje,
  • sonar - lanseart alle linters en stjoert rapporten nei SonarQube,
  • ynsette - it ferstjoeren fan in artefakt nei alpha (TestFlight).

En as jo net yn details geane, troch de kaaien dy't yn aksjes brûkt wurde weglitte, krije jo dizze 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

Eins bleek ús earste Fastfile meunsterlik te wêzen, sjoen guon fan 'e krukken dy't wy noch nedich wiene en it oantal parameters dat wy hawwe ferfongen:

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

Yn it foarbyld hjirboppe, mar in diel fan 'e parameters dy't wy moatte oantsjutte: dit binne de build parameters - skema, konfiguraasje, Provision Profile nammen, likegoed as distribúsje parameters - Apple ID fan it ûntwikkelders akkount, wachtwurd, applikaasje ID, ensfh op. As earste benadering sette wy al dizze kaaien yn spesjale bestannen - Gymfile, Matchfile и Appfile.

No kinne jo yn Jenkins koarte kommando's neame dy't de werjefte net wazig meitsje en maklik te lêzen binne foar it each:

# fastlane ios <lane_name>

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

Hoera, wy binne geweldich

Wat hast krigen? Dúdlike kommando's foar elke stap. Skripten skjinmakke, kreas regele yn fastlane-bestannen. Bliid rûnen wy nei de ûntwikkelders en fregen har alles ta te foegjen wat se nedich wiene oan har repositories.

Mar wy realisearren yn 'e tiid dat wy deselde swierrichheden soene tsjinkomme - wy soene noch 20 gearstallingsskripts hawwe dy't op ien of oare manier har eigen libben begjinne soene te libjen, it soe dreger wêze om se te bewurkjen, om't de skripts nei repositories ferpleatse, en dêr hiene wy ​​gjin tagong. En yn 't algemien sil it net mooglik wêze om ús pine op dizze manier op te lossen.

Mobile CICD-ûnderfining: ien fastlane-standert foar in protte mobile applikaasjes

Taak #2: krije ien Fastfile foar N applikaasjes

No liket it derop dat it oplossen fan it probleem net sa dreech is - set de fariabelen yn, en litte wy gean. Ja, yn feite, dat is hoe't it probleem waard oplost. Mar op it stuit dat wy it ferskroefen hiene wy ​​noch gjin ekspertize yn fastlane sels, noch yn Ruby, wêryn fastlane is skreaun, noch nuttige foarbylden op it netwurk - elkenien dy't doe oer fastlane skreau wie beheind ta in foarbyld foar ien applikaasje foar ien ûntwikkelder.

Fastlane kin omjouwingsfariabelen omgean, en wy hawwe dit al besocht troch it Keychain-wachtwurd yn te stellen:

ENV['KEYCHAIN_PASSWORD']

Nei it besjen fan ús skripts, identifisearren wy de mienskiplike dielen:

#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

No, om dizze kaaien te begjinnen te brûken yn fastlane-bestannen, moasten wy útfine hoe't se se dêr levere. Fastlane hat hjir in oplossing foar: laden fariabelen fia dotenv. De dokumintaasje seit dat as it wichtich is foar jo om kaaien te laden foar ferskate doelen, meitsje dan ferskate konfiguraasjebestannen yn 'e fastlane-map .env, .env.default, .env.development.

En doe ha wy besletten om dizze bibleteek in bytsje oars te brûken. Litte wy yn it repository fan ûntwikkelders net de fastlane-skripts en har meta-ynformaasje pleatse, mar de unike kaaien fan dizze applikaasje yn it bestân .env.appName.

Sels Fastfile, Appfile, Matchfile и Gymfile, wy ferburgen it yn in aparte repository. In ekstra bestân mei wachtwurdkaaien fan oare tsjinsten wie dêr ferburgen - .env.
Jo kinne in foarbyld sjen hjir.

Mobile CICD-ûnderfining: ien fastlane-standert foar in protte mobile applikaasjes

Op CI is de oprop net folle feroare; in konfiguraasjekaai foar in spesifike applikaasje is tafoege:

# 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

Foardat de kommando's útfiere, laden wy ús repository mei skripts. sjocht der net sa moai út:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Dizze oplossing foar no ferlitten, hoewol Fastlane in oplossing hat foar it downloaden fan Fastfile fia aksje import_from_git, mar it wurket allinnich foar Fastfile, mar net foar oare triemmen. As jo ​​"echt moai" wolle, kinne jo jo eigen skriuwe action.

In ferlykbere set waard makke foar Android-applikaasjes en ReactNative, de bestannen binne yn itselde repository, mar yn ferskate tûken iOS, android и react_native.

As it releaseteam wat nije stap taheakje wol, wurde feroaringen yn it skript opnommen fia MR yn git, d'r is net langer nedich om te sykjen nei de skuldigen fan brutsen skripts, en yn 't algemien, no moatte jo besykje it te brekken.

No dat is it wis

Earder hawwe wy tiid bestege oan it ûnderhâlden fan alle skripts, it bywurkjen fan se en it reparearjen fan alle gefolgen fan updates. It wie heul teloarstellend doe't de redenen foar flaters en downtime yn releases ienfâldige typfouten wiene dy't sa lestich wiene om by te hâlden yn 'e warboel fan shell-skripts. No binne sokke flaters werombrocht ta in minimum. Feroarings wurde útrôle nei alle applikaasjes tagelyk. En it duorret 15 minuten om in nije applikaasje yn it proses te setten - set in sjabloanpipeline op CI op en foegje de kaaien ta oan it repository fan 'e ûntwikkelders.

It liket derop dat it punt mei Fastfile foar Android en applikaasje-hantekening ûnferklearber bliuwt; as it artikel ynteressant is, sil ik in fuortsetting skriuwe. Ik sil bliid wêze om jo fragen of suggestjes te sjen "hoe soene jo dit probleem oplosse" yn 'e opmerkingen of op Telegram bashkirova.

Boarne: www.habr.com

Add a comment