ProHoster > Blog > administratë > Përvoja celulare CICD: një standard i shpejtë për shumë aplikacione celulare
Përvoja celulare CICD: një standard i shpejtë për shumë aplikacione celulare
Do të doja të flisja për integrimin dhe shpërndarjen e vazhdueshme për aplikacionet celulare duke përdorur fastlane. Si e implementojmë CI/CD në të gjitha aplikacionet celulare, si arritëm atje dhe çfarë ndodhi në fund.
Tashmë ka mjaft material në rrjet për mjetin, i cili na mungonte aq shumë në fillim, kështu që qëllimisht nuk do ta përshkruaj mjetin në detaje, por do t'i referohem vetëm asaj që kishim atëherë:
Zgjidhje teknike për nxjerrjen e CI/CD për N-aplikacione
Pjesa e parë është më shumë nostalgji për kohët e vjetra dhe e dyta është një përvojë që mund ta aplikoni për veten tuaj.
Kështu ka ndodhur historikisht
Viti 2015
Sapo filluam të zhvillonim aplikacione celulare, më pas nuk dinim asgjë për integrimin e vazhdueshëm, për DevOps dhe gjëra të tjera në modë. Çdo përditësim i aplikacionit u lëshua nga vetë zhvilluesi nga kompjuteri i tij. Dhe nëse për Android është mjaft e thjeshtë - e mbledhur, e nënshkruar .apk dhe e ngarkoi atë në Google Developer Console, më pas për iOS, mjeti i atëhershëm i shpërndarjes përmes Xcode na la mbrëmje të mrekullueshme - përpjekjet për të shkarkuar arkivin shpesh përfundonin me gabime dhe ne duhej të provonim përsëri. Doli që zhvilluesi më i avancuar nuk shkruan kod disa herë në muaj, por lëshon aplikacionin.
Viti 2016
Ne u rritëm, tashmë kishim mendime se si t'i lironim zhvilluesit nga një ditë e tërë për një lëshim, dhe gjithashtu u shfaq një aplikacion i dytë, i cili vetëm na shtyu më shumë drejt automatizimit. Po atë vit, ne instaluam Jenkins për herë të parë dhe shkruam një sërë skenaresh të frikshme, shumë të ngjashme me ato që fastlane tregon në dokumentacionin e tij.
Fatkeqësisht, deri më tani vetëm zhvilluesit tanë e dinin se si funksionojnë këto skripta dhe pse nevojitet kjo grumbull i pafund çelësash, dhe kur diçka u prish përsëri, ata morën "mbrëmjet e mrekullueshme" për analizimin e regjistrave.
Viti 2017
Këtë vit mësuam se ekziston një gjë e tillë si fastlane. Nuk kishte aq shumë informacion sa ka tani - si të filloni një, si ta përdorni atë. Dhe vetë mjeti ishte ende i papërpunuar në atë kohë: gabimet e vazhdueshme vetëm na zhgënjyen dhe ishte e vështirë të besohej në automatizimin magjik që ata premtuan.
Sidoqoftë, shërbimet kryesore të përfshira në bërthamën fastlane janë gym и pilot, arritëm ta nisnim.
Ato janë përmirësuar, qoftë edhe sepse jo të gjithë parametrat e nevojshëm për të xcodebuild, ju duhet të tregoni - gym do të kuptojë në mënyrë të pavarur se ku dhe çfarë qëndron. Dhe për më shumë akordim, mund të specifikoni të njëjtat çelësa si në xcodebuild, vetëm emërtimi i çelësave është më i qartë.
Këtë herë, falë palestrës dhe formatuesit të integruar xcpretty, regjistrat e ndërtimit janë bërë shumë më të lexueshëm. Kjo filloi të kursente kohë në rregullimin e montimeve të prishura dhe ndonjëherë ekipi i lëshimit mund ta kuptonte vetë.
Fatkeqësisht, matjet e shpejtësisë së montimit xcodebuild и gym Ne nuk e bëmë atë, por do t'i besojmë dokumentacionit - shpejtësi deri në 30%.
Proces i vetëm për të gjitha aplikimet
Viti 2018 e tani
Deri në vitin 2018, procesi i ndërtimit dhe nxjerrjes së aplikacioneve u zhvendos plotësisht në Jenkins, zhvilluesit ndaluan lëshimin nga makinat e tyre dhe vetëm ekipi i lëshimit kishte të drejtën e lëshimit.
Tashmë donim të përmirësonim nisjen e testeve dhe analizave statike, dhe skriptet tona u rritën dhe u rritën. U rrit dhe ndryshoi së bashku me aplikacionet tona. Në atë kohë kishte rreth 10 aplikacione, duke pasur parasysh që kemi dy platforma, janë rreth 20 skripta "të gjalla".
Sa herë që donim të shtonim një hap të ri në skenar, na duhej t'i kopjonim-ngjisnim pjesët në të gjitha skriptet e guaskës. Ndoshta mund të kishim punuar më me kujdes, por shpesh ndryshime të tilla përfundonin me gabime shtypi, të cilat u shndërruan në mbrëmje për ekipin e lëshimit për të rregulluar skriptet dhe për të zbuluar se cili djalë i zgjuar e shtoi këtë komandë dhe çfarë bën në të vërtetë. Në përgjithësi, nuk mund të thuhet se skriptet për montim për një platformë ishin të paktën disi të ngjashme. Edhe pse ata me siguri bënë të njëjtën gjë.
Për të filluar një proces për një aplikacion të ri, ishte e nevojshme të kaloni një ditë për të zgjedhur një version "të freskët" të këtyre skripteve, për ta korrigjuar atë dhe për të thënë se "po, funksionon".
Në verën e vitit 2018, ne shikuam edhe një herë drejt linjës së shpejtë ende në zhvillim.
Detyra #1: përmblidhni të gjithë hapat e skriptit dhe rishkruani ato në Fastfile
Kur filluam, skriptet tona dukeshin si një mbulesë këmbësh e përbërë nga të gjitha hapat dhe paterica në një skenar guaskë në Jenkins. Nuk kemi kaluar ende në tubacion dhe ndarje sipas fazës.
Ne shikuam atë që kemi dhe identifikuam 4 hapa që përshtaten me përshkrimin e CI/CD-së sonë:
ndërtimi - instalimi i varësive, montimi i arkivit,
test - ekzekutimi i testeve të njësisë së zhvilluesit, llogaritja e mbulimit,
sonar - lëshon të gjitha linjat dhe dërgon raporte në SonarQube,
vendos - dërgimi i një objekti në alfa (TestFlight).
Dhe nëse nuk futeni në detaje, duke lënë jashtë çelësat e përdorur në veprime, do të merrni këtë skedar Fast:
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
Në fakt, skedari ynë i parë Fast doli të ishte monstruoz, duke marrë parasysh disa nga patericat që na duheshin ende dhe numrin e parametrave që zëvendësuam:
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
Në shembullin e mësipërm, vetëm një pjesë e parametrave që duhet të specifikojmë: këto janë parametrat e ndërtimit - skema, konfigurimi, emrat e profilit të ofrimit, si dhe parametrat e shpërndarjes - Apple ID e llogarisë së zhvilluesit, fjalëkalimi, ID e aplikacionit, etj. në. Si përafrim i parë, ne vendosëm të gjithë këta çelësa në skedarë të veçantë - Gymfile, Matchfile и Appfile.
Tani në Jenkins mund të telefononi komanda të shkurtra që nuk turbullojnë pamjen dhe janë lehtësisht të lexueshme nga syri:
Çfarë more? Pastro komandat për çdo hap. Skriptet e pastruara, të rregulluara mjeshtërisht në skedarë fastlane. Të gëzuar, vrapuam te zhvilluesit duke u kërkuar atyre të shtonin gjithçka që u nevojitej në depot e tyre.
Por e kuptuam me kohë se do të hasnim të njëjtat vështirësi - do të kishim akoma 20 skripta montimi që në një mënyrë ose në një tjetër do të fillonin të jetonin jetën e tyre, do të ishte më e vështirë t'i redaktonim, pasi skriptet do të kalonin në depo, dhe ne nuk kishim akses atje. Dhe, në përgjithësi, dhimbjen tonë nuk do ta zgjidhim në këtë mënyrë.
Detyra #2: merrni një skedar të vetëm Fast për N aplikacione
Tani duket se zgjidhja e problemit nuk është aq e vështirë - vendosni variablat dhe le të shkojmë. Po, në fakt, kështu u zgjidh problemi. Por në momentin kur e prishëm, nuk kishim as ekspertizë në vetë fastlane, as në Ruby, në të cilën shkruhet fastlane, as shembuj të dobishëm në rrjet - të gjithë ata që shkruanin për fastlane atëherë ishin të kufizuar në një shembull për një aplikacion për një zhvillues.
Fastlane mund të trajtojë variablat e mjedisit, dhe ne e kemi provuar tashmë këtë duke vendosur fjalëkalimin e Keychain:
ENV['KEYCHAIN_PASSWORD']
Pasi shikuam skriptet tona, identifikuam pjesët e përbashkëta:
#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
Tani, për të filluar përdorimin e këtyre çelësave në skedarët fastlane, duhej të kuptonim se si t'i dorëzonim ato atje. Fastlane ka një zgjidhje për këtë: ngarkimi i variablave nëpërmjet dotenv. Dokumentacioni thotë se nëse është e rëndësishme që ju të ngarkoni çelësat për qëllime të ndryshme, krijoni disa skedarë konfigurimi në drejtorinë fastlane .env, .env.default, .env.development.
Dhe më pas vendosëm ta përdorim këtë bibliotekë pak më ndryshe. Le të vendosim në depon e zhvilluesve jo skriptet fastlane dhe informacionin e tij meta, por çelësat unikë të këtij aplikacioni në skedar .env.appName.
vetë Fastfile, Appfile, Matchfile и Gymfile, e fshehëm në një depo të veçantë. Një skedar shtesë me çelësa fjalëkalimi nga shërbimet e tjera ishte fshehur atje - .env.
Ju mund të shihni një shembull këtu.
Në CI, thirrja nuk ka ndryshuar shumë një çelës konfigurimi për një aplikacion specifik;
E la këtë zgjidhje tani për tani, megjithëse Fastlane ka një zgjidhje për shkarkimin e Fastfile nëpërmjet veprimimport_from_git, por funksionon vetëm për Fastfile, por jo për skedarë të tjerë. Nëse dëshironi "me të vërtetë të bukur", mund të shkruani tuajën action.
Një grup i ngjashëm është bërë për aplikacionet Android dhe ReactNative, skedarët janë në të njëjtin depo, por në degë të ndryshme iOS, android и react_native.
Kur ekipi i lëshimit dëshiron të shtojë ndonjë hap të ri, ndryshimet në skenar regjistrohen përmes MR në git, nuk ka më nevojë të kërkosh fajtorët e skripteve të prishura dhe në përgjithësi, tani duhet të përpiqesh ta prishësh atë.
Tani kjo është me siguri
Më parë, ne shpenzonim kohë duke mirëmbajtur të gjitha skriptet, duke i përditësuar ato dhe duke rregulluar të gjitha pasojat e përditësimeve. Ishte shumë zhgënjyese kur arsyet për gabimet dhe kohën e ndërprerjes në publikime ishin gabime të thjeshta shtypi që ishin kaq të vështira për t'u mbajtur nën rrëmujën e skripteve të guaskës. Tani gabimet e tilla janë reduktuar në minimum. Ndryshimet shpërndahen në të gjitha aplikacionet menjëherë. Dhe duhen 15 minuta për të futur një aplikacion të ri në proces - konfiguroni një tubacion shabllon në CI dhe shtoni çelësat në depon e zhvilluesit.
Duket se çështja me Fastfile për Android dhe nënshkrimin e aplikacionit mbetet e pashpjegueshme nëse artikulli është interesant, do të shkruaj një vazhdim. Do të jem i lumtur të shoh pyetjet ose sugjerimet tuaja "si do ta zgjidhnit këtë problem" në komente ose në Telegram bashkirova.