Profiad CICD symudol: un safon fastlane ar gyfer llawer o gymwysiadau symudol

Profiad CICD symudol: un safon fastlane ar gyfer llawer o gymwysiadau symudol
Hoffwn siarad am integreiddio a chyflwyno parhaus ar gyfer apiau symudol gan ddefnyddio fastlane. Sut rydyn ni'n gweithredu CI/CD ar bob rhaglen symudol, sut wnaethon ni gyrraedd yno a beth ddigwyddodd yn y diwedd.

Mae digon o ddeunydd ar y rhwydwaith ar yr offeryn yn barod, ac roedd cymaint o brin ohono ar y dechrau, felly ni fyddaf yn disgrifio’r offeryn yn fanwl yn fwriadol, ond byddaf yn cyfeirio at yr hyn a oedd gennym bryd hynny yn unig:

Mae'r erthygl yn cynnwys dwy ran:

  • Cefndir ymddangosiad CI/CD symudol yn y cwmni
  • Datrysiad technegol ar gyfer cyflwyno CI/CD ar gyfer ceisiadau N

Mae'r rhan gyntaf yn fwy o hiraeth am yr hen ddyddiau, ac mae'r ail yn brofiad y gallwch chi ei gymhwyso i chi'ch hun.

Dyma fel y digwyddodd yn hanesyddol

Blwyddyn 2015

Rydym newydd ddechrau datblygu cymwysiadau symudol, yna nid oeddem yn gwybod dim am integreiddio parhaus, am DevOps a phethau ffasiynol eraill. Cyflwynwyd pob diweddariad cais gan y datblygwr ei hun o'i beiriant. Ac os yw'n eithaf syml ar gyfer Android - wedi'i ymgynnull, wedi'i lofnodi .apk a'i uwchlwytho i'r Google Developer Console, yna ar gyfer iOS roedd yr offeryn dosbarthu ar y pryd trwy Xcode yn ein gadael gyda nosweithiau gwych - roedd ymdrechion i lawrlwytho'r archif yn aml yn dod i ben mewn gwallau a bu'n rhaid i ni geisio eto. Mae'n troi allan nad yw'r datblygwr mwyaf datblygedig yn ysgrifennu cod sawl gwaith y mis, ond yn hytrach yn rhyddhau'r cais.

Blwyddyn 2016

Fe wnaethon ni dyfu i fyny, roedd gennym ni eisoes feddyliau am sut i ryddhau datblygwyr o ddiwrnod cyfan am ryddhad, ac ymddangosodd ail gais hefyd, a oedd ond yn ein gwthio mwy tuag at awtomeiddio. Yr un flwyddyn, fe wnaethom osod Jenkins am y tro cyntaf ac ysgrifennu criw o sgriptiau brawychus, tebyg iawn i'r rhai y mae fastlane yn eu dangos yn ei ddogfennaeth.

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

Yn anffodus, hyd yn hyn dim ond ein datblygwyr oedd yn gwybod sut mae'r sgriptiau hyn yn gweithio a pham mae angen y pentwr diddiwedd hwn o allweddi, a phan dorrodd rhywbeth eto, cawsant y “nosweithiau hyfryd” ar gyfer dadansoddi logiau.

Blwyddyn 2017

Eleni dysgon ni fod y fath beth â fastlane. Nid oedd cymaint o wybodaeth ag sydd yn awr - sut i ddechrau un, sut i'w ddefnyddio. Ac roedd yr offeryn ei hun yn dal yn amrwd bryd hynny: dim ond ein siomi ni oedd gwallau cyson ac roedd yn anodd credu yn yr awtomeiddio hudolus a addawyd ganddynt.

Fodd bynnag, y prif gyfleustodau sydd wedi'u cynnwys yn y craidd fastlane yw gym и pilot, llwyddasom i'w gychwyn.

Mae ein sgriptiau wedi'u gwella ychydig.

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

Maent wedi'u gwella, os mai dim ond oherwydd nad yw'r holl baramedrau angenrheidiol ar gyfer xcodebuild, mae angen ichi nodi - gym yn deall yn annibynnol ble a beth sy'n gorwedd. Ac i gael mwy o gyweirio, gallwch nodi'r un allweddi ag yn xcodebuild, dim ond enwi'r allweddi sy'n gliriach.

Y tro hwn, diolch i gampfa a'r fformatydd xcpretty adeiledig, mae'r logiau adeiladu wedi dod yn llawer mwy darllenadwy. Dechreuodd hyn arbed amser ar drwsio gwasanaethau oedd wedi torri, ac weithiau gallai'r tîm rhyddhau ei ddatrys ar eu pen eu hunain.

Yn anffodus, mesuriadau cyflymder cynulliad xcodebuild и gym Ni wnaethom hynny, ond byddwn yn ymddiried yn y ddogfennaeth - cyflymu hyd at 30%.

Proses sengl ar gyfer pob cais

Blwyddyn 2018 a'r presennol

Erbyn 2018, symudodd y broses o adeiladu a chyflwyno ceisiadau yn gyfan gwbl i Jenkins, rhoddodd datblygwyr y gorau i ryddhau o'u peiriannau, a dim ond y tîm rhyddhau oedd â'r hawl i ryddhau.

Roeddem eisoes eisiau gwella lansiad profion a dadansoddi statig, a thyfodd a thyfodd ein sgriptiau. Tyfodd a newid ynghyd â'n ceisiadau. Bryd hynny, roedd tua 10 o geisiadau, gan ystyried bod gennym ddau blatfform, sef tua 20 o sgriptiau “byw”.

Bob tro roedden ni eisiau ychwanegu cam newydd i’r sgript, roedd rhaid i ni gopïo-gludo’r darnau i’r holl sgriptiau cregyn. Efallai y gallem fod wedi gweithio'n fwy gofalus, ond yn aml daeth newidiadau o'r fath i ben gyda theipos, a drodd yn nosweithiau i'r tîm rhyddhau atgyweirio sgriptiau a darganfod pa ddyn craff a ychwanegodd y gorchymyn hwn a beth mae'n ei wneud mewn gwirionedd. Yn gyffredinol, ni ellir dweud bod y sgriptiau ar gyfer cydosod ar gyfer un platfform o leiaf braidd yn debyg. Er eu bod yn sicr wedi gwneud yr un peth.

Er mwyn cychwyn proses ar gyfer cais newydd, roedd angen treulio diwrnod i ddewis fersiwn “ffres” o'r sgriptiau hyn, ei ddadfygio a dweud “ie, mae'n gweithio.”

Yn ystod haf 2018, fe wnaethom unwaith eto edrych tuag at y llwybr cyflym sy'n dal i ddatblygu.

Tasg #1: crynhoi holl gamau'r sgript a'u hailysgrifennu yn Fastfile

Pan ddechreuon ni, roedd ein sgriptiau'n edrych fel lliain traed yn cynnwys yr holl risiau a baglau mewn un sgript gragen yn Jenkins. Nid ydym eto wedi newid i biblinell a rhaniad fesul cam.

Gwnaethom edrych ar yr hyn sydd gennym a nodi 4 cam sy’n cyd-fynd â’r disgrifiad o’n CI/CD:

  • adeiladu - gosod dibyniaethau, cydosod yr archif,
  • prawf — cynnal profion uned datblygwr, cyfrifo cwmpas,
  • sonar - yn lansio pob linters ac yn anfon adroddiadau at SonarQube,
  • defnyddio — anfon arteffact i alpha (TestFlight).

Ac os na ewch i fanylion, gan hepgor yr allweddi a ddefnyddiwyd mewn gweithredoedd, fe gewch y Fastfile hwn:

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

Mewn gwirionedd, trodd ein Fastfile cyntaf yn wrthun, o ystyried rhai o'r baglau yr oedd eu hangen arnom o hyd a nifer y paramedrau a ddisodlwyd gennym:

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

Yn yr enghraifft uchod, dim ond rhan o'r paramedrau y mae angen i ni eu nodi: dyma'r paramedrau adeiladu - sgema, cyfluniad, enwau Proffil Darpariaeth, yn ogystal â pharamedrau dosbarthu - ID Apple o gyfrif y datblygwr, cyfrinair, ID y cais, ac ati ymlaen. Fel brasamcan cyntaf, rydyn ni'n rhoi'r allweddi hyn i gyd mewn ffeiliau arbennig - Gymfile, Matchfile и Appfile.

Nawr yn Jenkins gallwch chi alw gorchmynion byr nad ydyn nhw'n pylu'r olygfa ac sy'n hawdd i'r llygad eu darllen:

# fastlane ios <lane_name>

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

Hurray, rydyn ni'n wych

Beth gawsoch chi? Gorchmynion clir ar gyfer pob cam. Sgriptiau wedi'u glanhau, wedi'u trefnu'n daclus mewn ffeiliau fastlane. Gan lawenhau, fe wnaethom redeg at y datblygwyr yn gofyn iddynt ychwanegu popeth yr oedd ei angen arnynt i'w cadwrfeydd.

Ond sylweddolom ymhen amser y byddem yn dod ar draws yr un anawsterau - byddai gennym 20 o sgriptiau gwasanaeth o hyd a fyddai rhyw ffordd neu'i gilydd yn dechrau byw eu bywydau eu hunain, byddai'n anoddach eu golygu, gan y byddai'r sgriptiau'n symud i gadwrfeydd, ac ni chawsom fynediad yno. Ac, yn gyffredinol, ni fydd yn bosibl datrys ein poen fel hyn.

Profiad CICD symudol: un safon fastlane ar gyfer llawer o gymwysiadau symudol

Tasg #2: cael un Fastfile ar gyfer N ceisiadau

Nawr mae'n ymddangos nad yw datrys y broblem mor anodd - gosodwch y newidynnau, a gadewch i ni fynd. Ie, mewn gwirionedd, dyna sut y datryswyd y broblem. Ond ar hyn o bryd pan wnaethom ei chwalu, nid oedd gennym ni arbenigedd mewn fastlane ei hun, nac yn Ruby, lle mae fastlane wedi'i ysgrifennu, nac enghreifftiau defnyddiol ar y rhwydwaith - roedd pawb a ysgrifennodd am fastlane bryd hynny wedi'i gyfyngu i enghraifft ar gyfer un cais ar gyfer un datblygwr.

Gall Fastlane drin newidynnau amgylchedd, ac rydym eisoes wedi rhoi cynnig ar hyn trwy osod y cyfrinair Keychain:

ENV['KEYCHAIN_PASSWORD']

Ar ôl edrych ar ein sgriptiau, gwnaethom nodi'r rhannau cyffredin:

#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

Nawr, er mwyn dechrau defnyddio'r allweddi hyn mewn ffeiliau fastlane, roedd yn rhaid i ni ddarganfod sut i'w danfon yno. Mae gan Fastlane ateb ar gyfer hyn: llwytho newidynnau trwy dotenv. Mae'r ddogfennaeth yn dweud, os yw'n bwysig i chi lwytho allweddi at wahanol ddibenion, creu sawl ffeil ffurfweddu yn y cyfeiriadur fastlane .env, .env.default, .env.development.

Ac yna fe benderfynon ni ddefnyddio'r llyfrgell hon ychydig yn wahanol. Gadewch i ni osod yn ystorfa'r datblygwyr nid y sgriptiau fastlane a'i wybodaeth feta, ond allweddi unigryw'r cymhwysiad hwn yn y ffeil .env.appName.

Eu Hunain Fastfile, Appfile, Matchfile и Gymfile, cuddiasom ef mewn ystorfa ar wahan. Cafodd ffeil ychwanegol gydag allweddi cyfrinair o wasanaethau eraill ei chuddio yno - .env.
Gallwch weld enghraifft yma.

Profiad CICD symudol: un safon fastlane ar gyfer llawer o gymwysiadau symudol

Ar CI, nid yw'r alwad wedi newid llawer; mae allwedd ffurfweddu ar gyfer rhaglen benodol wedi'i hychwanegu:

# 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

Cyn rhedeg y gorchmynion, rydym yn llwytho ein storfa gyda sgriptiau. Ddim yn edrych mor neis:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Wedi gadael yr ateb hwn am y tro, er bod gan Fastlane ateb ar gyfer lawrlwytho Fastfile trwy gweithredu import_from_git, ond dim ond i Fastfile y mae'n gweithio, ond nid ar gyfer ffeiliau eraill. Os ydych chi eisiau “hardd iawn”, gallwch chi ysgrifennu un eich hun action.

Gwnaethpwyd set debyg ar gyfer cymwysiadau Android ac ReactNative, mae'r ffeiliau yn yr un ystorfa, ond mewn gwahanol ganghennau iOS, android и react_native.

Pan fydd y tîm rhyddhau eisiau ychwanegu rhywfaint o gam newydd, mae newidiadau yn y sgript yn cael eu cofnodi trwy MR mewn git, nid oes angen edrych am y tramgwyddwyr o sgriptiau wedi'u torri mwyach, ac yn gyffredinol, nawr mae'n rhaid i chi geisio ei dorri.

Nawr dyna ni yn sicr

Yn flaenorol, fe wnaethom dreulio amser yn cynnal yr holl sgriptiau, eu diweddaru a thrwsio holl ganlyniadau diweddariadau. Roedd yn siomedig iawn pan oedd y rhesymau dros gamgymeriadau ac amser segur mewn datganiadau yn deipau syml a oedd mor anodd cadw golwg arnynt yn y cymysgedd o sgriptiau cregyn. Nawr mae gwallau o'r fath yn cael eu lleihau i'r lleiafswm. Cyflwynir newidiadau i bob cais ar unwaith. Ac mae'n cymryd 15 munud i roi cais newydd yn y broses - sefydlu patrwm ar y gweill ar CI ac ychwanegu'r allweddi i ystorfa'r datblygwr.

Mae'n ymddangos bod y pwynt gyda Fastfile ar gyfer Android a llofnod y cais yn parhau i fod yn anesboniadwy; os yw'r erthygl yn ddiddorol, byddaf yn ysgrifennu parhad. Byddaf yn falch o weld eich cwestiynau neu awgrymiadau “sut fyddech chi'n datrys y broblem hon” yn y sylwadau neu ar Telegram bashkirova.

Ffynhonnell: hab.com

Ychwanegu sylw