Mobile CICD reynsla: einn fastlane staðall fyrir mörg farsímaforrit

Mobile CICD reynsla: einn fastlane staðall fyrir mörg farsímaforrit
Mig langar að tala um stöðuga samþættingu og afhendingu fyrir farsímaforrit sem nota fastlane. Hvernig við innleiðum CI/CD á öll farsímaforrit, hvernig við komumst þangað og hvað gerðist á endanum.

Það er nú þegar nóg efni á netinu á tólinu, sem okkur vantaði svo í byrjun, svo ég mun vísvitandi ekki lýsa tólinu í smáatriðum, en mun aðeins vísa til þess sem við höfðum þá:

Greinin samanstendur af tveimur hlutum:

  • Bakgrunnur að tilkomu farsíma CI/CD í fyrirtækinu
  • Tæknilausn til að rúlla út CI/CD fyrir N-forrit

Fyrri hlutinn er meiri söknuður í gamla daga og sá seinni er upplifun sem þú getur sótt á sjálfan þig.

Svona gerðist þetta sögulega

Ár 2015

Við byrjuðum bara að þróa farsímaforrit, svo vissum við ekkert um stöðuga samþættingu, um DevOps og annað smart. Hver umsóknaruppfærsla var sett út af verktaki sjálfum úr vélinni sinni. Og ef það er frekar einfalt fyrir Android - sett saman, undirritað .apk og hlóð því upp á Google Developer Console, síðan fyrir iOS þáverandi dreifingartól í gegnum Xcode skildi okkur eftir frábærar kvöldstundir - tilraunir til að hlaða niður skjalasafninu enduðu oft með villum og við þurftum að reyna aftur. Það kom í ljós að fullkomnasta verktaki skrifar ekki kóða nokkrum sinnum í mánuði, heldur gefur út forritið.

Ár 2016

Við ólumst upp, við höfðum þegar hugleiðingar um hvernig hægt væri að losa forritara frá heilum degi fyrir útgáfu, og annað forrit birtist líka, sem ýtti okkur aðeins meira í átt að sjálfvirkni. Sama ár settum við Jenkins upp í fyrsta skipti og skrifuðum fullt af skelfilegum handritum, mjög svipuðum þeim sem Fastlane sýnir í skjölum sínum.

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

Því miður, hingað til, vissu aðeins verktaki okkar hvernig þessi forskrift virka og hvers vegna þessi endalausi lyklastafli er nauðsynlegur, og þegar eitthvað bilaði aftur, fengu þeir „glæsilegt kvöld“ til að greina annála.

Ár 2017

Í ár lærðum við að það er til eitthvað sem heitir fastlane. Það var ekki eins mikið af upplýsingum og það er núna - hvernig á að byrja einn, hvernig á að nota þær. Og tólið sjálft var enn gróft á þeim tíma: stöðugar villur olli okkur aðeins vonbrigðum og það var erfitt að trúa á töfrandi sjálfvirkni sem þau lofuðu.

Hins vegar eru helstu tólin sem eru innifalin í fastlane kjarnanum gym и pilot, við náðum að koma því í gang.

Handritin okkar hafa verið endurbætt aðeins.

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

Þeir hafa verið endurbættir, þó ekki væri nema vegna þess að ekki eru allar breytur nauðsynlegar fyrir xcodebuild, þú þarft að gefa til kynna - gym mun sjálfstætt skilja hvar og hvað liggur. Og fyrir frekari fínstillingu geturðu tilgreint sömu lykla og í xcodebuild, aðeins nafnið á lyklunum er skýrara.

Að þessu sinni, þökk sé líkamsræktarstöðinni og innbyggðu xcpretty sniðinu, eru byggingarskrárnar orðnar mun læsilegri. Þetta byrjaði að spara tíma við að laga bilaðar samsetningar og stundum gat útgáfuteymið fundið það út á eigin spýtur.

Því miður, samsetningarhraðamælingar xcodebuild и gym Við gerðum það ekki, en við munum treysta skjölunum - allt að 30% hraða.

Eitt ferli fyrir allar umsóknir

Ár 2018 og nútíð

Árið 2018 fluttist ferlið við að byggja og útbúa forrit alveg til Jenkins, þróunaraðilar hættu að gefa út úr vélum sínum og aðeins útgáfuteymið hafði rétt til að gefa út.

Okkur langaði nú þegar að bæta kynningu á prófum og kyrrstöðugreiningu og forskriftirnar okkar jukust og stækkuðu. Óx og breyttist samhliða umsóknum okkar. Á þeim tíma voru um 10 umsóknir. Miðað við að við erum með tvo palla, þá eru það um 20 „lifandi“ forskriftir.

Í hvert skipti sem við vildum bæta nýju skrefi við handritið þurftum við að copy-pastea verkin inn í öll skeljaforskriftirnar. Kannski hefðum við getað unnið betur, en oft enduðu slíkar breytingar með innsláttarvillum, sem breyttust í kvöld fyrir útgáfuteymið til að laga handrit og komast að því hvaða snjall gaur bætti þessari skipun við og hvað hún gerir í raun og veru. Almennt séð er ekki hægt að segja að forskriftirnar fyrir samsetningu fyrir einn vettvang hafi verið að minnsta kosti nokkuð svipaðar. Þó þeir hafi vissulega gert það sama.

Til þess að hefja ferli fyrir nýtt forrit var nauðsynlegt að eyða einum degi í að velja „ferska“ útgáfu af þessum skriftum, kemba hana og segja „já, það virkar“.

Sumarið 2018 horfðum við enn og aftur í átt að hraðbrautinni sem er enn í þróun.

Verkefni #1: Taktu saman öll handritsskref og endurskrifaðu þau í Fastfile

Þegar við byrjuðum litu handritin okkar út eins og fótklæði sem samanstóð af öllum þrepum og hækjum í einni skeljahandriti í Jenkins. Við höfum ekki enn skipt yfir í leiðslu og skiptingu eftir stigum.

Við skoðuðum það sem við höfum og bentum á 4 skref sem passa við lýsinguna á CI/CD okkar:

  • byggja - setja upp ósjálfstæði, setja saman skjalasafnið,
  • próf — keyra þróunareiningarpróf, reikna út umfang,
  • sonar - ræsir alla linters og sendir skýrslur til SonarQube,
  • deploy — sendir grip til alfa (TestFlight).

Og ef þú ferð ekki í smáatriði og sleppir lyklunum sem notaðir eru í aðgerðum færðu þessa 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

Reyndar reyndist fyrsta Fastfile okkar vera ægilegt, miðað við nokkrar hækjur sem við þurftum enn og fjölda breytu sem við skiptum út:

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

Í dæminu hér að ofan, aðeins hluti af færibreytunum sem við þurfum að tilgreina: þetta eru byggingarfæribreyturnar - skema, stillingar, nöfn úthlutunarsniðs, svo og dreifingarfæribreytur - Apple auðkenni þróunarreiknings, lykilorð, auðkenni forrits, og svo á. Sem fyrsta nálgun setjum við alla þessa lykla í sérstakar skrár - Gymfile, Matchfile и Appfile.

Nú í Jenkins er hægt að kalla stuttar skipanir sem gera sýn ekki óskýra og auðvelt er að lesa fyrir augað:

# fastlane ios <lane_name>

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

Húrra, við erum frábærir

Hvað fékkstu? Hreinsar skipanir fyrir hvert skref. Hreinsuð upp forskriftir, haganlega raðað í fastlane skrár. Fögnuð hlupum við til þróunaraðilanna og báðum þá um að bæta öllu sem þeir þyrftu við geymslurnar sínar.

En við áttum okkur á því með tímanum að við myndum lenda í sömu erfiðleikum - við myndum samt hafa 20 samsetningarforrit sem myndu á einn eða annan hátt byrja að lifa sínu eigin lífi, það væri erfiðara að breyta þeim, þar sem handritin myndu flytjast yfir í geymslur, og við höfðum ekki aðgang þangað. Og almennt mun ekki vera hægt að leysa sársauka okkar með þessum hætti.

Mobile CICD reynsla: einn fastlane staðall fyrir mörg farsímaforrit

Verkefni #2: fáðu eina Fastfile fyrir N forrit

Nú virðist sem að leysa vandamálið sé ekki svo erfitt - stilltu breyturnar og við skulum fara. Já, í rauninni var vandamálið leyst þannig. En í augnablikinu þegar við klúðruðum þessu höfðum við hvorki sérfræðiþekkingu á fastlane sjálfu, né í Ruby, þar sem fastlane er skrifað, né gagnleg dæmi á netinu - allir sem skrifuðu um fastlane þá voru takmarkaðir við dæmi fyrir eina umsókn fyrir einn verktaki.

Fastlane getur séð um umhverfisbreytur og við höfum þegar reynt þetta með því að stilla lykilorð lyklakippu:

ENV['KEYCHAIN_PASSWORD']

Eftir að hafa skoðað forskriftirnar okkar fundum við sameiginlega hlutana:

#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ú, til að byrja að nota þessa lykla í fastlane skrám, urðum við að finna út hvernig á að afhenda þá þangað. Fastlane hefur lausn fyrir þetta: hleður breytum í gegnum dotenv. Skjölin segja að ef það er mikilvægt fyrir þig að hlaða lyklum í mismunandi tilgangi skaltu búa til nokkrar stillingarskrár í fastlane möppunni .env, .env.default, .env.development.

Og svo ákváðum við að nota þetta bókasafn aðeins öðruvísi. Við skulum setja í geymslu þróunaraðila ekki fastlane forskriftirnar og meta upplýsingar þess, heldur einstaka lykla þessa forrits í skránni .env.appName.

Sjálfir Fastfile, Appfile, Matchfile и Gymfile, við földum það í sérstakri geymslu. Aukaskrá með lykilorðslyklum frá öðrum þjónustum var falin þar - .env.
Þú getur séð dæmi hér.

Mobile CICD reynsla: einn fastlane staðall fyrir mörg farsímaforrit

Á CI hefur símtalið ekki breyst mikið; stillingarlykli fyrir tiltekið forrit hefur verið bætt við:

# 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

Áður en skipanirnar eru keyrðar hleðum við geymsluna okkar með skriftum. Lítur ekki svo vel út:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Skildi þessa lausn í bili, þó að Fastlane hafi lausn til að hlaða niður Fastfile í gegnum aðgerð import_from_git, en það virkar aðeins fyrir Fastfile, en ekki fyrir aðrar skrár. Ef þú vilt „mjög fallegt“ geturðu skrifað þitt eigið action.

Svipað sett var gert fyrir Android forrit og ReactNative, skrárnar eru í sömu geymslu, en í mismunandi greinum iOS, android и react_native.

Þegar útgáfuteymið vill bæta við einhverju nýju skrefi eru breytingar á handritinu teknar upp í gegnum MR í git, það er ekki lengur þörf á að leita að sökudólgum bilaðra handrita og almennt, nú þarf að reyna að brjóta það.

Nú er það víst

Áður eyddum við tíma í að viðhalda öllum forskriftum, uppfæra þau og laga allar afleiðingar uppfærslunnar. Það olli miklum vonbrigðum þegar ástæður fyrir villum og niðurtíma í útgáfum voru einfaldar innsláttarvillur sem svo erfitt var að halda utan um í ruglinu af skeljahandritum. Nú eru slíkar villur minnkaðar í lágmarki. Breytingar eru settar út í öll forrit í einu. Og það tekur 15 mínútur að setja nýtt forrit inn í ferlið - settu upp sniðmátsleiðslu á CI og bættu lyklunum við geymslu þróunaraðilans.

Svo virðist sem punkturinn með Fastfile fyrir Android og undirskrift forrita sé enn óútskýrður; ef greinin er áhugaverð mun ég skrifa framhald. Ég mun vera feginn að sjá spurningar þínar eða tillögur „hvernig myndir þú leysa þetta vandamál“ í athugasemdunum eða á Telegram bashkirova.

Heimild: www.habr.com

Bæta við athugasemd