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ë:

Artikulli përbëhet nga dy pjesë:

  • Sfondi i shfaqjes së CI/CD celulare në kompani
  • 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.

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

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.

Skriptet tona janë përmirësuar pak.

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

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:

# fastlane ios <lane_name>

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

Hurre, ne jemi të shkëlqyer

Ç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ë.

Përvoja celulare CICD: një standard i shpejtë për shumë aplikacione celulare

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.

Përvoja celulare CICD: një standard i shpejtë për shumë aplikacione celulare

Në CI, thirrja nuk ka ndryshuar shumë një çelës konfigurimi për një aplikacion specifik;

# 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

Para se të ekzekutojmë komandat, ne ngarkojmë depon tonë me skripta. Nuk duket aq bukur:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

E la këtë zgjidhje tani për tani, megjithëse Fastlane ka një zgjidhje për shkarkimin e Fastfile nëpërmjet veprim import_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.

Burimi: www.habr.com

Shto një koment