Mobil CICD Erfahrung: ee Fastlane Standard fir vill mobil Uwendungen

Mobil CICD Erfahrung: ee Fastlane Standard fir vill mobil Uwendungen
Ech wéilt iwwer kontinuéierlech Integratioun a Liwwerung fir mobil Apps mat Fastlane schwätzen. Wéi mir CI/CD op all mobilen Applikatiounen ëmsetzen, wéi mir dohinner komm sinn a wat um Enn geschitt ass.

Et gëtt scho genuch Material am Netz um Tool, wat mir am Ufank sou gefeelt hunn, also wäert ech d'Tool bewosst net am Detail beschreiwen, awer nëmmen op dat wat mir deemools haten:

Den Artikel besteet aus zwee Deeler:

  • Hannergrond fir d'Entstoe vu mobilen CI / CD an der Firma
  • Technesch Léisung fir CI / CD fir N-Applikatiounen auszerollen

Den éischten Deel ass méi Nostalgie fir déi al Deeg, an deen zweeten ass eng Erfahrung, déi Dir op Iech selwer gëlle kënnt.

Dëst ass wéi et historesch geschitt ass

2015 Joer

Mir hunn just ugefaang mobil Uwendungen z'entwéckelen, dunn wousste mir näischt iwwer kontinuéierlech Integratioun, iwwer DevOps an aner fashionable Saachen. All Applikatiounsupdate gouf vum Entwéckler selwer vu senger Maschinn ausgerullt. A wann et fir Android ganz einfach ass - zesummegesat, ënnerschriwwen .apk an huet et op d'Google Developer Console eropgelueden, dunn huet fir iOS dat deemools Verdeelungsinstrument iwwer Xcode eis super Owender hannerlooss - Versich fir den Archiv erofzelueden sinn dacks a Feeler ofgeschloss a mir hu missen nach eng Kéier probéieren. Et huet sech erausgestallt datt de fortgeschrattsten Entwéckler kee Code e puer Mol am Mount schreift, awer éischter d'Applikatioun verëffentlecht.

2016 Joer

Mir sinn opgewuess, mir hu scho Gedanken iwwer wéi d'Entwéckler vun engem ganzen Dag fir eng Verëffentlechung befreit ginn, an eng zweet Applikatioun ass och opgetaucht, déi eis nëmmen méi Richtung Automatioun gedréckt huet. Datselwecht Joer hu mir Jenkins fir d'éischte Kéier installéiert an eng Rëtsch grujeleg Scripte geschriwwen, ganz ähnlech wéi déi, déi Fastlane a senger Dokumentatioun weist.

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

Leider woussten bis elo nëmmen eis Entwéckler wéi dës Skripte funktionnéieren a firwat dësen endlosen Stack vu Schlësselen gebraucht gëtt, a wann erëm eppes gebrach ass, kruten se déi "schéin Owender" fir Logbicher ze analyséieren.

2017 Joer

Dëst Joer hu mir geléiert datt et sou eppes wéi Fastlane gëtt. Et war net sou vill Informatioun wéi et elo ass - wéi een ufänken, wéi se ze benotzen. An d'Instrument selwer war zu där Zäit nach ëmmer rau: konstante Feeler hunn eis nëmmen enttäuscht an et war schwéier un der magescher Automatioun ze gleewen, déi se versprach hunn.

Wéi och ëmmer, d'Haapt Utilities abegraff am Fastlane Kär sinn gym и pilot, mir hunn et fäerdeg bruecht et unzefänken.

Eis Scripte goufen e bësse verbessert.

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

Si goufen verbessert, wann nëmmen well net all Parameteren néideg fir xcodebuild, Dir musst uginn - gym wäert onofhängeg verstoen wou a wat läit. A fir méi Feintuning kënnt Dir déiselwecht Schlësselen spezifizéieren wéi an xcodebuild, nëmmen den Numm vun de Schlësselen ass méi kloer.

Dës Kéier, dank dem Fitnessstudio an dem agebaute xcpretty Formatter, sinn d'Build-Logbicher vill méi liesbar ginn. Dëst huet ugefaang Zäit ze spueren fir futtis Versammlungen ze fixéieren, an heiansdo konnt d'Verëffentlechungsteam et selwer erausfannen.

Leider, Assemblée Vitesse Miessunge xcodebuild и gym Mir hunn et net gemaach, awer mir vertrauen d'Dokumentatioun - bis zu 30% Geschwindegkeet.

Eenzege Prozess fir all Uwendungen

Joer 2018 a presentéieren

Bis 2018 ass de Prozess fir Uwendungen ze bauen an auszerollen komplett op Jenkins geplënnert, d'Entwéckler hunn opgehalen hir Maschinnen ze befreien, an nëmmen d'Verëffentlechungsteam hat d'Recht ze befreien.

Mir wollten schonn de Start vun Tester a statesch Analyse verbesseren, an eis Scripte sinn gewuess a gewuess. Gewuess a geännert zesumme mat eisen Uwendungen. Deemools waren et ongeféier 10 Applikatiounen, wann ee bedenkt datt mir zwou Plattformen hunn, dat sinn ongeféier 20 "lieweg" Scripten.

All Kéier wann mir en neie Schrëtt un de Skript wollten addéieren, hu mir d'Stécker an all Shell-Skripten ze kopéieren-paste. Vläicht hätte mir méi virsiichteg geschafft, awer dacks hunn esou Ännerungen an Tippfehler ofgeschloss, déi an Owender fir d'Verëffentlechungsteam verwandelt goufen fir Scripten ze fixéieren an erauszefannen, wéi en Smart Guy dëse Kommando bäigefüügt huet a wat et tatsächlech mécht. Am Allgemengen kann et net gesot ginn datt d'Skripte fir d'Versammlung fir eng Plattform op d'mannst e bësse ähnlech waren. Obwuel si sécherlech déi selwecht Saach gemaach.

Fir e Prozess fir eng nei Applikatioun unzefänken, war et néideg en Dag ze verbréngen fir eng "frësch" Versioun vun dëse Scripten ze wielen, debuggen a soen datt "jo, et funktionnéiert."

Am Summer 2018 hu mir nach eng Kéier op déi nach ëmmer entwéckelt Fastlane gekuckt.

Aufgab #1: resüméiert all Skript Schrëtt a schreift se an Fastfile ëm

Wéi mir ugefaang hunn, hunn eis Scripte ausgesinn wéi e Foussduch, deen aus all de Schrëtt a Kruuchten an engem Shell-Skript zu Jenkins besteet. Mir sinn nach net op Pipeline an Divisioun no Etapp gewiesselt.

Mir hunn gekuckt wat mir hunn an 4 Schrëtt identifizéiert déi d'Beschreiwung vun eisem CI/CD passen:

  • bauen - Ofhängegkeeten installéieren, d'Archiv versammelen,
  • Test - Lafen Entwéckler Eenheet Tester, Berechent Ofdeckung,
  • sonar - lancéiert all Linters a schéckt Berichter un SonarQube,
  • deploy - schéckt en Artefakt op Alpha (TestFlight).

A wann Dir net an d'Detailer gitt, d'Schlësselen auszeginn, déi an Aktiounen benotzt ginn, kritt Dir dës 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

Tatsächlech huet eis éischt Fastfile monstréis erausgestallt, wann Dir e puer vun de Krutchen berücksichtegt déi mir nach ëmmer gebraucht hunn an d'Zuel vun de Parameteren déi mir ersat hunn:

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

Am Beispill hei uewen, nëmmen en Deel vun de Parameteren déi mir musse spezifizéieren: dëst sinn d'Build-Parameteren - Schema, Konfiguratioun, Provision Profil Nimm, souwéi Verdeelungsparameter - Apple ID vum Entwécklerkonto, Passwuert, Applikatioun ID, etc. op. Als éischt Approximatioun setzen mir all dës Schlësselen a spezielle Dateien - Gymfile, Matchfile и Appfile.

Elo zu Jenkins kënnt Dir kuerz Kommandoen uruffen, déi d'Vue net verschwannen a liicht vum Auge liesbar sinn:

# fastlane ios <lane_name>

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

Hurra, mir si super

Wat hues du kritt? Kloer Kommandoe fir all Schrëtt. Gebotzt Scripten, ordentlech a Fastlane Dateien arrangéiert. Gefreet, mir si bei d'Entwéckler gelaf a gefrot hinnen alles ze addéieren wat se an hir Repositories gebraucht hunn.

Awer mir hu mat der Zäit gemierkt datt mir déi selwecht Schwieregkeeten begéinen - mir wäerten nach ëmmer 20 Assemblée Scripten hunn, déi op déi eng oder aner Manéier hiert eegent Liewen ufänken, et wier méi schwéier se z'änneren, well d'Skripten an d'Repositories réckelen, a mir haten net Zougang do. An allgemeng wäert et net méiglech sinn eis Péng esou ze léisen.

Mobil CICD Erfahrung: ee Fastlane Standard fir vill mobil Uwendungen

Aufgab #2: kritt eng eenzeg Fastfile fir N Uwendungen

Elo schéngt et datt d'Léisung vum Problem net sou schwéier ass - set d'Variabelen a loosst eis goen. Jo, tatsächlech, dat ass wéi de Problem geléist gouf. Awer am Moment wou mir et geschrauft hunn, hu mir weder Expertise am Fastlane selwer, nach am Ruby, an deem Fastlane geschriwwen ass, nach nëtzlech Beispiller am Netz - jidderee deen iwwer Fastlane geschriwwen huet, war limitéiert op e Beispill fir eng Applikatioun fir eent Entwéckler.

Fastlane kann Ëmfeldvariablen handhaben, a mir hunn dëst scho probéiert andeems Dir de Keychain Passwuert setzt:

ENV['KEYCHAIN_PASSWORD']

Nodeems mir eis Skripte gekuckt hunn, hu mir déi gemeinsam Deeler identifizéiert:

#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

Elo, fir dës Schlësselen a Fastlane Dateien unzefänken, hu mir misse erausfannen wéi se dohinner liwweren. Fastlane huet eng Léisung fir dëst: Luede Variabelen iwwer dotenv. D'Dokumentatioun seet datt wann et wichteg ass fir Iech Schlësselen fir verschidden Zwecker ze lueden, erstellt verschidde Konfiguratiounsdateien am Fastlane Verzeichnis .env, .env.default, .env.development.

An dunn hu mir décidéiert dës Bibliothéik e bëssen anescht ze benotzen. Loosst eis am Repository vum Entwéckler net d'Fastlane Scripten a seng Meta Informatioun setzen, awer déi eenzegaarteg Schlësselen vun dëser Applikatioun an der Datei .env.appName.

Selwer Fastfile, Appfile, Matchfile и Gymfile, hu mir et an engem separaten Repository verstoppt. Eng zousätzlech Datei mat Passwuertschlësselen vun anere Servicer war do verstoppt - .env.
Dir kënnt e Beispill gesinn hei.

Mobil CICD Erfahrung: ee Fastlane Standard fir vill mobil Uwendungen

Op CI huet den Uruff net vill geännert; e Konfiguratiounsschlëssel fir eng spezifesch Applikatioun gouf derbäigesat:

# 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

Ier Dir d'Befehle lafen, luede mir eise Repository mat Scripten. Gesäit net sou schéin aus:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Lénks dës Léisung fir elo, obwuel Fastlane eng Léisung huet fir de Fastfile erofzelueden iwwer Aktiounen import_from_git, awer et funktionnéiert nëmme fir Fastfile, awer net fir aner Dateien. Wann Dir wëllt "wierklech schéin", Dir kënnt Är eege schreiwen action.

En ähnleche Set gouf fir Android Uwendungen a ReactNative gemaach, d'Dateien sinn am selwechte Repository, awer a verschiddene Branchen iOS, android и react_native.

Wann d'Verëffentlechungsteam e puer neie Schrëtt derbäi wëllt, ginn Ännerungen am Skript iwwer MR a git opgeholl, et ass net méi néideg fir d'Täter vu futtis Scripten ze sichen, an allgemeng, elo musst Dir probéieren et ze briechen.

Elo ass et sécher

Virdrun hu mir Zäit verbruecht fir all Skripte z'erhalen, se ze aktualiséieren an all d'Konsequenze vun Updates ze fixéieren. Et war ganz enttäuschend wann d'Grënn fir Feeler an Ënnerbriechungen an Verëffentlechungen einfache Schreiffehler waren, déi sou schwéier waren ze verfollegen am Jumble vu Shellskripter. Elo ginn esou Feeler op e Minimum reduzéiert. Ännerungen ginn op all Applikatiounen gläichzäiteg ausgerullt. An et dauert 15 Minutten fir eng nei Applikatioun an de Prozess ze setzen - eng Schabloun Pipeline op CI opzestellen an d'Schlësselen un de Repository vum Entwéckler bäizefügen.

Et schéngt, datt de Punkt mat Fastfile fir Android an Applikatioun Ënnerschrëft onerklärlech bleift; wann den Artikel interessant ass, schreiwen ech eng Fortsetzung. Ech wäert frou Är Froen oder Virschléi ze gesinn "wéi géift Dir dëse Problem léisen" an de Kommentaren oder op Telegram bashkirova.

Source: will.com

Setzt e Commentaire