Mobiilne CICD kogemus: üks kiirrea standard paljude mobiilirakenduste jaoks

Mobiilne CICD kogemus: üks kiirrea standard paljude mobiilirakenduste jaoks
Tahaksin rääkida mobiilirakenduste pidevast integreerimisest ja kohaletoimetamisest, kasutades kiirlainet. Kuidas juurutame CI/CD kõigis mobiilirakendustes, kuidas me selleni jõudsime ja mis lõpuks juhtus.

Tööriista kohta on võrgus juba piisavalt materjali, millest meil alguses nii puudus, nii et ma ei kirjelda seda tööriista üksikasjalikult, vaid viitan ainult sellele, mis meil siis oli:

Artikkel koosneb kahest osast:

  • Mobiilse CI/CD tekkimise taust ettevõttes
  • Tehniline lahendus N-rakenduste jaoks mõeldud CI/CD kasutuselevõtuks

Esimene osa on rohkem nostalgia vanade aegade järele ja teine ​​on kogemus, mida saad enda jaoks rakendada.

Nii see ajalooliselt juhtus

Aasta 2015

Alustasime just mobiilirakenduste arendamisega, siis ei teadnud me pidevast integreerimisest, DevOpsist ja muust moekast veel midagi. Iga rakenduse värskenduse käivitas arendaja ise oma masinast. Ja kui Androidi jaoks on see üsna lihtne - kokku pandud, allkirjastatud .apk ja laadis selle üles Google Developer Console'i, siis iOS-i jaoks jättis tollane Xcode'i kaudu levitamise tööriist meile toredad õhtud – arhiivi allalaadimise katsed lõppesid sageli vigadega ja tuli uuesti proovida. Selgus, et kõige arenenum arendaja ei kirjuta koodi mitu korda kuus, vaid pigem annab rakenduse välja.

Aasta 2016

Kasvasime üles, meil olid juba mõtted, kuidas arendajaid tervest päevast vabastamiseks vabastada, ja ilmus ka teine ​​rakendus, mis lükkas meid ainult rohkem automatiseerimise poole. Samal aastal installisime Jenkinsi esimest korda ja kirjutasime hunniku hirmutavaid skripte, mis on väga sarnased neile, mida fastlane oma dokumentatsioonis näitab.

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

Kahjuks teadsid seni ainult meie arendajad, kuidas need skriptid töötavad ja milleks seda lõputut võtmevirna vaja on ning kui midagi jälle katki läks, said nad logide analüüsimiseks “ilusad õhtud”.

Aasta 2017

Sel aastal saime teada, et on olemas selline asi nagu fastlane. Infot ei olnud nii palju kui praegu – kuidas seda alustada, kuidas seda kasutada. Ja tööriist ise oli tol ajal veel toores: pidevad vead valmistasid meile ainult pettumuse ja nende lubatud maagilist automatiseerimist oli raske uskuda.

Peamised fastlane tuumas sisalduvad utiliidid on aga gym и pilot, meil õnnestus see käivitada.

Meie skripte on veidi täiustatud.

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

Neid on täiustatud, kasvõi sellepärast, et mitte kõiki vajalikke parameetreid xcodebuild, peate märkima - gym saab iseseisvalt aru, kus ja mis asub. Ja täpsemaks häälestamiseks saate määrata samad klahvid, mis sisse lülitatud xcodebuild, ainult klahvide nimetused on selgemad.

Seekord on tänu jõusaalile ja sisseehitatud xcpretty vormindajale ehituslogid muutunud palju loetavamaks. See hakkas säästma katkiste sõlmede parandamise aega ja mõnikord sai vabastamismeeskond selle ise välja mõelda.

Kahjuks kokkupaneku kiiruse mõõtmised xcodebuild и gym Me ei teinud seda, kuid me usaldame dokumentatsiooni – kuni 30% kiirendus.

Üks protsess kõigi rakenduste jaoks

Aasta 2018 ja praegune

2018. aastaks kolis rakenduste loomise ja kasutuselevõtu protsess täielikult üle Jenkinsi, arendajad lõpetasid oma masinatest väljalaskmise ja väljalaskeõigus oli ainult väljalaskemeeskonnal.

Tahtsime juba täiustada testide käivitamist ja staatilist analüüsi ning meie skriptid kasvasid ja kasvasid. Kasvas ja muutus koos meie rakendustega. Sel ajal oli rakendusi umbes 10. Arvestades, et meil on kaks platvormi, on see umbes 20 "elava" skripti.

Iga kord, kui tahtsime skriptile uue sammu lisada, pidime tükid kõigisse kestaskriptidesse kopeerima ja kleepima. Võib-olla oleks võinud hoolikamalt töötada, kuid sageli lõppesid sellised muudatused kirjavigadega, mis kujunesid väljalaskemeeskonna õhtuteks skriptide parandamiseks ja uurimiseks, milline tark mees selle käsu lisas ja mida see tegelikult teeb. Üldiselt ei saa öelda, et ühe platvormi kokkupaneku skriptid oleksid vähemalt mõnevõrra sarnased. Kuigi nad tegid kindlasti sama asja.

Uue rakenduse protsessi käivitamiseks oli vaja kulutada päev, et valida nendest skriptidest "värske" versioon, siluda see ja öelda, et "jah, see töötab".

2018. aasta suvel vaatasime taaskord veel areneva kiirteele poole.

Ülesanne nr 1: võtke kokku kõik skripti sammud ja kirjutage need Fastfile'i ümber

Kui me alustasime, nägid meie skriptid Jenkinsis välja nagu jalalapp, mis koosnes kõigist sammudest ja karkudest ühes kestaskriptis. Me ei ole veel torujuhtmele ja etapiviisilisele jagamisele üle läinud.

Vaatasime, mis meil on, ja tuvastasime 4 sammu, mis sobivad meie CI/CD kirjeldusega:

  • ehitamine - sõltuvuste paigaldamine, arhiivi kokkupanek,
  • test – arendajaüksuse testide käitamine, katvuse arvutamine,
  • sonar – käivitab kõik linterid ja saadab aruanded SonarQube'ile,
  • juurutada – artefakti saatmine alfasse (TestFlight).

Ja kui te ei lasku detailidesse, jättes välja toimingutes kasutatavad klahvid, saate selle Fastfile'i:

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

Tegelikult osutus meie esimene Fastfile koletuks, arvestades mõningaid veel vajaminevaid karkusid ja asendatud parameetrite arvu:

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

Ülaltoodud näites on ainult osa parameetritest, mida peame määrama: need on ehitusparameetrid - skeem, konfiguratsioon, pakkumise profiili nimed, aga ka levitamise parameetrid - arendajakonto Apple ID, parool, rakenduse ID jne. peal. Esimese ligikaudsusena panime kõik need võtmed spetsiaalsetesse failidesse - Gymfile, Matchfile и Appfile.

Nüüd saate Jenkinsis kutsuda lühikesi käske, mis ei hägusta vaadet ja on silmaga hõlpsasti loetavad:

# fastlane ios <lane_name>

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

Hurraa, me oleme suurepärased

Mis sa said? Selged käsud iga sammu jaoks. Puhastatud skriptid, mis on kenasti fastlane-failidesse paigutatud. Rõõmustades jooksime arendajate juurde, paludes neil kõik vajalik oma hoidlatesse lisada.

Kuid mõistsime õigeaegselt, et seisame silmitsi samade raskustega - meil on ikkagi 20 montaažiskripti, mis ühel või teisel viisil hakkavad elama oma elu, neid on raskem redigeerida, kuna skriptid liiguvad hoidlatesse, ja meil polnud sinna ligipääsu. Ja üldiselt pole meie valu niimoodi võimalik lahendada.

Mobiilne CICD kogemus: üks kiirrea standard paljude mobiilirakenduste jaoks

Ülesanne nr 2: hankige N rakenduse jaoks üks Fastfile

Nüüd tundub, et ülesande lahendamine polegi nii keeruline – pane muutujad paika ja läheme. Jah, tegelikult see probleem lahendatigi. Kuid sel hetkel, kui me asja ära keerasime, ei olnud meil teadmisi fastlane'i enda ega Ruby kohta, milles fastlane on kirjutatud, ega kasulikke näiteid võrgust - kõik, kes siis fastlane'ist kirjutasid, piirdusid ühe rakenduse näitega. üks arendaja.

Fastlane saab hakkama keskkonnamuutujatega ja oleme seda juba proovinud võtmehoidja parooli määramisega:

ENV['KEYCHAIN_PASSWORD']

Pärast skriptide vaatamist tuvastasime ühised osad:

#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

Nüüd, et hakata neid võtmeid fastlane failides kasutama, pidime välja mõtlema, kuidas need sinna toimetada. Fastlane’il on selleks lahendus: muutujate laadimine dotenv kaudu. Dokumentatsioon ütleb, et kui teil on oluline laadida võtmeid erinevatel eesmärkidel, looge fastlane kataloogis mitu konfiguratsioonifaili .env, .env.default, .env.development.

Ja siis otsustasime seda raamatukogu veidi teistmoodi kasutada. Asetame arendajate hoidlasse mitte fastlane'i skriptid ja selle metateave, vaid selle rakenduse unikaalsed võtmed failis .env.appName.

Ise Fastfile, Appfile, Matchfile и Gymfile, peitsime selle eraldi hoidlasse. Sinna peideti täiendav fail teiste teenuste paroolivõtmetega - .env.
Näete näidet siin.

Mobiilne CICD kogemus: üks kiirrea standard paljude mobiilirakenduste jaoks

CI puhul pole kõne palju muutunud, lisatud on konkreetse rakenduse konfiguratsioonivõti:

# 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

Enne käskude käivitamist laadime oma hoidla skriptidega. Ei näe nii kena välja:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Jätsin selle lahenduse praeguseks, kuigi Fastlane'il on lahendus Fastfile'i allalaadimiseks tegevus import_from_git, kuid see töötab ainult Fastfile'i, kuid mitte muude failide puhul. Kui soovite "tõesti ilusat", võite kirjutada oma action.

Sarnane komplekt tehti Androidi rakenduste ja ReactNative jaoks, failid on samas hoidlas, kuid erinevates harudes iOS, android и react_native.

Kui väljalaskemeeskond soovib lisada mõne uue sammu, salvestatakse skripti muudatused MR-i kaudu gitis, katkiste skriptide süüdlasi pole enam vaja otsida ja üldiselt tuleb nüüd proovida seda murda.

Nüüd on see kindel

Varem kulutasime aega kõigi skriptide hooldamisele, värskendamisele ja kõigi uuenduste tagajärgede parandamisele. Oli suur pettumus, kui väljaannete vigade ja seisakute põhjused olid lihtsad kirjavead, mida oli kestaskriptide segaduses nii raske jälgida. Nüüd on sellised vead viidud miinimumini. Muudatused juurutatakse kõikides rakendustes korraga. Ja uue rakenduse lisamiseks protsessi kulub 15 minutit – seadistage CI-s mallikonveier ja lisage võtmed arendaja hoidlasse.

Tundub, et Androidi jaoks mõeldud Fastfile'i ja rakenduse signatuuri mõte jääb selgitamata, kui artikkel on huvitav, siis kirjutan jätku. Mul on hea meel näha kommentaarides või Telegramis teie küsimusi või ettepanekuid "kuidas te selle probleemi lahendaksite". baškirova.

Allikas: www.habr.com

Lisa kommentaar