ProHoster > Blog > Bestjoer > 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:
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.
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.
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:
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.
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.
Op CI is de oprop net folle feroare; in konfiguraasjekaai foar in spesifike applikaasje is tafoege:
Dizze oplossing foar no ferlitten, hoewol Fastlane in oplossing hat foar it downloaden fan Fastfile fia aksjeimport_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.