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 "appleId@example.com" 
-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: "appleId@example.com",
  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
APPLE_ID=appleID@example.com
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 git@repository.com/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

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster