Mobilā CICD pieredze: viens ātrās joslas standarts daudzām mobilajām lietojumprogrammām

Mobilā CICD pieredze: viens ātrās joslas standarts daudzām mobilajām lietojumprogrammām
Es vēlētos runāt par nepārtrauktu integrāciju un mobilo lietotņu piegādi, izmantojot fastlane. Kā mēs ievieÅ”am CI/CD visās mobilajās lietojumprogrammās, kā mēs tur nokļuvām un kas notika beigās.

TÄ«klā jau ir pietiekami daudz materiāla par rÄ«ku, kura mums tik ļoti pietrÅ«ka sākumā, tāpēc es apzināti neaprakstÄ«Å”u rÄ«ku sÄ«kāk, bet atsaukÅ”os tikai uz to, kas mums bija toreiz:

Raksts sastāv no divām daļām:

  • Mobilā CI/CD parādÄ«Å”anās uzņēmumā fons
  • Tehniskais risinājums CI/CD ievieÅ”anai N-lietojumprogrammām

Pirmā daļa ir vairāk nostalģija pēc vecajiem laikiem, bet otrā ir pieredze, ko varat attiecināt uz sevi.

Tā tas notika vēsturiski

Gads 2015

Mēs tikko sākām izstrādāt mobilās aplikācijas, tad neko nezinājām par nepārtrauktu integrāciju, par DevOps un citām modernām lietām. Katru lietojumprogrammas atjauninājumu no savas maŔīnas izlaida pats izstrādātājs. Un, ja operētājsistēmai Android tas ir pavisam vienkārÅ”i - salikts, parakstÄ«ts .apk un augÅ”upielādēja to Google Developer Console, tad iOS toreizējais izplatÄ«Å”anas rÄ«ks, izmantojot Xcode, mums atstāja lieliskus vakarus - mēģinājumi lejupielādēt arhÄ«vu bieži beidzās ar kļūdām, un mums bija jāmēģina vēlreiz. IzrādÄ«jās, ka progresÄ«vākais izstrādātājs vairākas reizes mēnesÄ« neraksta kodu, bet gan izlaiž aplikāciju.

Gads 2016

Mēs izaugām, mums jau bija domas par to, kā atbrÄ«vot izstrādātājus no veselas dienas izlaiÅ”anai, un parādÄ«jās arÄ« otra aplikācija, kas mÅ«s tikai vairāk virzÄ«ja uz automatizāciju. Tajā paŔā gadā mēs pirmo reizi instalējām Jenkins un uzrakstÄ«jām virkni biedējoÅ”u skriptu, kas ir ļoti lÄ«dzÄ«gi tiem, ko fastlane parāda savā dokumentācijā.

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

Diemžēl lÄ«dz Å”im tikai mÅ«su izstrādātāji zināja, kā Å”ie skripti darbojas un kāpēc ir vajadzÄ«ga Ŕī nebeidzamā atslēgu kaudze, un, kad atkal kaut kas sabojājās, viņi saņēma ā€œskaistos vakarusā€ žurnālu analÄ«zei.

Gads 2017

Å ogad mēs uzzinājām, ka ir tāda lieta kā fastlane. Nebija tik daudz informācijas kā tagad ā€“ kā tādu iesākt, kā to izmantot. Un pats rÄ«ks tajā laikā vēl bija neapstrādāts: pastāvÄ«gās kļūdas mÅ«s tikai sarÅ«gtināja, un bija grÅ«ti noticēt maÄ£iskajai automatizācijai, ko viņi solÄ«ja.

Tomēr galvenās utilÄ«tas, kas iekļautas fastlane kodolā, ir gym Šø pilot, mums izdevās to sākt.

MÅ«su skripti ir nedaudz uzlaboti.

$ fastlane gym  ā€”-workspace "Example.xcworkspace" 
                --scheme "AppName" 
                ā€”-buildlog_path "/tmp" 
                -ā€”clean

Tie ir uzlaboti, kaut vai tāpēc, ka nav visi nepiecieÅ”amie parametri xcodebuild, jums jānorāda - gym patstāvÄ«gi sapratÄ«s, kur un kas atrodas. Lai veiktu precÄ«zāku noregulējumu, varat norādÄ«t tos paÅ”us taustiņus, kas norādÄ«ti xcodebuild, skaidrāks ir tikai taustiņu nosaukumi.

Å oreiz, pateicoties sporta zālei un iebÅ«vētajam xcpretty formatētājam, bÅ«vniecÄ«bas žurnāli ir kļuvuÅ”i daudz salasāmāki. Tas sāka ietaupÄ«t laiku, lai salabotu bojātus mezglus, un dažreiz atbrÄ«voÅ”anas komanda to varēja izdomāt pati.

Diemžēl montāžas ātruma mērÄ«jumi xcodebuild Šø gym Mēs to nedarÄ«jām, taču uzticēsimies dokumentācijai ā€” lÄ«dz pat 30% paātrinājums.

Viens process visiem lietojumiem

2018. gads un tagadne

LÄ«dz 2018. gadam lietojumprogrammu izveides un izlaiÅ”anas process pilnÄ«bā pārcēlās uz Jenkins, izstrādātāji pārtrauca izlaiÅ”anu no savām iekārtām, un tikai izlaiÅ”anas komandai bija tiesÄ«bas izlaist.

Mēs jau vēlējāmies uzlabot testu un statiskās analÄ«zes palaiÅ”anu, un mÅ«su skripti auga un auga. Auga un mainÄ«jās kopā ar mÅ«su lietojumprogrammām. TobrÄ«d bija ap 10 aplikāciju.Ņemot vērā, ka mums ir divas platformas, tie ir aptuveni 20 ā€œdzÄ«viā€ skripti.

Katru reizi, kad vēlējāmies skriptam pievienot jaunu darbÄ«bu, mums bija jākopē un jāielÄ«mē daļas visos čaulas skriptos. VarbÅ«t varējām strādāt rÅ«pÄ«gāk, taču bieži Ŕādas izmaiņas beidzās ar drukas kļūdām, kas izvērtās par vakariem, kad izlaiduma komanda laboja skriptus un noskaidroja, kurÅ” gudrais puisis pievienoja Å”o komandu un ko tā patiesÄ«bā dara. Kopumā nevar teikt, ka vienas platformas montāžas skripti bija vismaz kaut cik lÄ«dzÄ«gi. Lai gan viņi noteikti darÄ«ja to paÅ”u.

Lai sāktu jaunas lietojumprogrammas procesu, bija jāpavada diena, lai atlasÄ«tu Å”o skriptu ā€œsvaiguā€ versiju, to atkļūdotu un pateiktu, ka ā€œjā, tas darbojasā€.

2018. gada vasarā atkal skatījāmies uz joprojām attīstoŔo fastlane.

1. uzdevums: apkopojiet visas skripta darbības un pārrakstiet tās Fastfile

Kad mēs sākām, mÅ«su skripti izskatÄ«jās kā kāju lupatiņa, kas sastāv no visiem soļiem un kruÄ·iem vienā apvalka skriptā Dženkinsā. Mēs vēl neesam pārgājuÅ”i uz cauruļvadu un sadalÄ«Å”anu pa posmiem.

Mēs apskatījām to, kas mums ir, un noteicām 4 darbības, kas atbilst mūsu CI/CD aprakstam:

  • bÅ«vēt - atkarÄ«bu instalÄ“Å”ana, arhÄ«va komplektÄ“Å”ana,
  • tests ā€” izstrādātāju vienÄ«bas testu izpilde, pārklājuma aprēķināŔana,
  • hidrolokators ā€” palaiž visas lÄ«nijsistēmas un nosÅ«ta ziņojumus SonarQube,
  • izvietot ā€” artefakta nosÅ«tÄ«Å”ana uz alfa (TestFlight).

Un, ja neiedziļināsities detaļās, izlaižot darbÄ«bās izmantotos taustiņus, jÅ«s iegÅ«sit Å”o 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

Faktiski mÅ«su pirmais Fastfile izrādÄ«jās briesmÄ«gs, ņemot vērā dažus mums joprojām nepiecieÅ”amos kruÄ·us un aizstāto parametru skaitu:

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

IepriekÅ” minētajā piemērā norādÄ«ta tikai daļa no parametriem, kas mums jānorāda: tie ir bÅ«vÄ“Å”anas parametri ā€” shēma, konfigurācija, nodroÅ”inājuma profila nosaukumi, kā arÄ« izplatÄ«Å”anas parametri ā€” izstrādātāja konta Apple ID, parole, lietojumprogrammas ID utt. ieslēgts. Kā pirmo tuvinājumu mēs visas Ŕīs atslēgas ievietojam Ä«paÅ”os failos - Gymfile, Matchfile Šø Appfile.

Tagad Dženkinsā varat izsaukt īsas komandas, kas neaizmiglo skatu un ir viegli salasāmas ar aci:

# fastlane ios <lane_name>

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

Urā, mēs esam lieliski

Ko tu dabÅ«ji? Skaidras komandas katram solim. IztÄ«rÄ«ti skripti, glÄ«ti sakārtoti fastlane failos. Priecādamies skrējām pie izstrādātājiem, lÅ«dzot pievienot visu nepiecieÅ”amo viņu krātuvēm.

Bet mēs laikus sapratām, ka saskarsimies ar tām paŔām grÅ«tÄ«bām - mums joprojām bÅ«s 20 montāžas skripti, kas tā vai citādi sāks dzÄ«vot paÅ”i, tos rediģēt bÅ«s grÅ«tāk, jo skripti pārcelsies uz krātuvēm, un mums tur nebija piekļuves. Un vispār mÅ«su sāpes tā atrisināt nebÅ«s iespējams.

Mobilā CICD pieredze: viens ātrās joslas standarts daudzām mobilajām lietojumprogrammām

2. uzdevums: iegūstiet vienu Fastfile N lietojumprogrammām

Tagad Ŕķiet, ka problēmas risināŔana nemaz nav tik grÅ«ta ā€“ iestati mainÄ«gos, un ejam. Jā, patiesÄ«bā tā problēma tika atrisināta. Bet tajā brÄ«dÄ«, kad mēs to saskrÅ«vējām, mums nebija ne kompetences par paÅ”u fastlane, ne Ruby, kurā rakstÄ«ts fastlane, ne arÄ« noderÄ«gu piemēru tÄ«klā - visi, kas toreiz rakstÄ«ja par fastlane, aprobežojās ar piemēru vienai lietojumprogrammai. viens izstrādātājs.

Fastlane var apstrādāt vides mainÄ«gos, un mēs to jau esam izmēģinājuÅ”i, iestatot Keychain paroli:

ENV['KEYCHAIN_PASSWORD']

Pēc mÅ«su skriptu apskatÄ«Å”anas mēs identificējām kopÄ«gās daļas:

#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

Tagad, lai sāktu lietot Ŕīs atslēgas fastlane failos, mums bija jāizdomā, kā tās tur nogādāt. Fastlane tam ir risinājums: mainÄ«go ielāde, izmantojot dotenv. Dokumentācijā teikts, ka, ja jums ir svarÄ«gi ielādēt atslēgas dažādiem mērÄ·iem, izveidojiet vairākus konfigurācijas failus fastlane direktorijā .env, .env.default, .env.development.

Un tad mēs nolēmām izmantot Å”o bibliotēku nedaudz savādāk. Izstrādātāju repozitorijā ievietosim nevis fastlane skriptus un to metainformāciju, bet gan Ŕīs lietojumprogrammas unikālās atslēgas failā .env.appName.

PaÅ”i Fastfile, Appfile, Matchfile Šø Gymfile, mēs to paslēpām atseviŔķā repozitorijā. Tur tika paslēpts papildu fails ar paroles atslēgām no citiem pakalpojumiem - .env.
JÅ«s varat redzēt piemēru Å”eit.

Mobilā CICD pieredze: viens ātrās joslas standarts daudzām mobilajām lietojumprogrammām

CI tÄ«klā zvans nav Ä«paÅ”i mainÄ«jies; ir pievienota noteiktas lietojumprogrammas konfigurācijas atslēga:

# 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

Pirms komandu palaiÅ”anas mēs ielādējam mÅ«su repozitoriju ar skriptiem. Neizskatās tik jauki:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Pagaidām atstāja Å”o risinājumu, lai gan Fastlane ir risinājums Fastfile lejupielādei, izmantojot rÄ«cÄ«ba import_from_git, taču tas darbojas tikai Fastfile, bet ne citiem failiem. Ja vēlaties "patieŔām skaistu", varat rakstÄ«t savu action.

LÄ«dzÄ«gs komplekts tika izveidots Android lietojumprogrammām un ReactNative, faili atrodas vienā repozitorijā, bet dažādās filiālēs iOS, android Šø react_native.

Kad izlaiduma komanda vēlas pievienot kādu jaunu soli, izmaiņas skriptā tiek ierakstÄ«tas caur MR iekŔā git, vairs nav jāmeklē skriptu lÅ«Å”anas vaininieki un vispār tagad jāmēģina to lauzt.

Tagad tas ir noteikti

IepriekÅ” mēs pavadÄ«jām laiku visu skriptu uzturÄ“Å”anai, to atjaunināŔanai un visu atjaunināŔanas seku novērÅ”anai. Tas bija ļoti neapmierinoÅ”i, kad kļūdu un dÄ«kstāves iemesli laidienos bija vienkārÅ”as drukas kļūdas, kurām bija tik grÅ«ti izsekot čaulas skriptu jucekliem. Tagad Ŕādas kļūdas ir samazinātas lÄ«dz minimumam. Izmaiņas tiek ieviestas visās lietojumprogrammās vienlaikus. Un jaunas lietojumprogrammas ievieÅ”ana procesā aizņem 15 minÅ«tes ā€” izveidojiet veidnes konveijeru CI un pievienojiet atslēgas izstrādātāja repozitorijai.

Å Ä·iet, ka jēga ar Fastfile for Android un aplikācijas parakstu paliek neizskaidrota, ja raksts bÅ«s interesants, rakstÄ«Å”u turpinājumu. PriecāŔos redzēt jÅ«su jautājumus vai ieteikumus ā€œkā jÅ«s atrisinātu Å”o problēmuā€ komentāros vai Telegram baÅ”kirova.

Avots: www.habr.com

Pievieno komentāru