Mugikorreko CICD esperientzia: mugikorretarako aplikazio askorentzat fastlane estandar bat

Mugikorreko CICD esperientzia: mugikorretarako aplikazio askorentzat fastlane estandar bat
Fastlane erabiltzen duten aplikazio mugikorretarako etengabeko integrazioari eta entregari buruz hitz egin nahiko nuke. Nola inplementatzen dugun CI/CD aplikazio mugikor guztietan, nola iritsi garen eta azkenean zer gertatu den.

Dagoeneko nahikoa material dago sarean tresnari buruz, hasieran hain falta zitzaigun, beraz, nahita ez dut tresna zehatz-mehatz deskribatuko, baina orduan genuena bakarrik aipatuko dut:

Artikuluak bi zati ditu:

  • Enpresan CI/CD mugikorren agerpenaren aurrekariak
  • N aplikazioetarako CI/CD zabaltzeko soluzio teknikoa

Lehen zatia garai zaharrekiko nostalgia gehiago da, eta bigarrena zeure buruari aplikatzeko moduko esperientzia bat da.

Horrela gertatu zen historikoki

2015. urtea

Mugikorretarako aplikazioak garatzen hasi berri ginen, gero ez genekien ezer etengabeko integrazioaz, DevOps eta modako beste gauzei buruz. Aplikazioen eguneratze bakoitza garatzaileak berak zabaldu zuen bere makinatik. Eta Android-erako nahiko erraza bada: muntatua, sinatuta .apk eta Google Developer Consolera kargatu zuen, gero iOS-erako orduan Xcode bidezko banaketa tresnak arratsalde bikainak utzi zizkigun - artxiboa deskargatzeko saiakerak askotan akatsak izaten ziren eta berriro saiatu behar izan genuen. Garatzaile aurreratuenak ez duela kodea idazten hilean behin baino gehiagotan, aplikazioa askatzen du.

2016. urtea

Hazi ginen, jada pentsatuta geneukan garatzaileak askatzeko egun osotik askatzeko moduari buruz, eta bigarren aplikazio bat ere agertu zen, eta horrek automatizaziora gehiago bultzatu gintuen. Urte horretan bertan, Jenkins instalatu genuen lehen aldiz eta gidoi beldurgarri mordoa idatzi genuen, fastlane-k bere dokumentazioan erakusten dituenen oso antzekoak.

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

Zoritxarrez, orain arte gure garatzaileek bakarrik zekiten script hauek nola funtzionatzen zuten eta zergatik behar zen gako-pila amaigabe hori, eta zerbait berriro hautsi zenean, "arratsalde zoragarriak" lortu zituzten erregistroak aztertzeko.

2017. urtea

Aurten fastlane bezalako gauza bat dagoela jakin dugu. Ez zegoen orain bezainbeste informazio: nola hasi, nola erabili. Eta tresna bera oraindik gordina zen garai hartan: etengabeko akatsek hutsik egiten gintuzten eta kosta egiten zitzaigun agintzen zuten automatizazio magikoan sinestea.

Hala ere, fastlane nukleoan sartzen diren utilitate nagusiak hauek dira gym ΠΈ pilot, hastea lortu dugu.

Gure gidoiak pixka bat hobetu dira.

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

Hobetu egin dira, besterik ez bada, ez direlako beharrezkoak diren parametro guztiak xcodebuild, adierazi behar duzu - gym modu independentean ulertuko du non eta zer dagoen. Eta doikuntza gehiago lortzeko, tekla berdinak zehaztu ditzakezu xcodebuild, gakoen izendapena baino ez da argiagoa.

Oraingoan, gimnasioari eta xcpretty formateatu integratuari esker, eraikitze-erregistroak askoz ere irakurgarriagoak izan dira. Honek apurtutako muntaiak konpontzen denbora aurrezten hasi zen, eta batzuetan kaleratze-taldeak bere kabuz asmatu zezakeen.

Zoritxarrez, muntaketa abiadura neurketak xcodebuild ΠΈ gym Ez dugu egin, baina dokumentazioan fidatuko gara: % 30eko abiadura.

Prozesu bakarra eskaera guztietarako

2018 urtea eta gaur egungoa

2018rako, aplikazioak eraikitzeko eta zabaltzeko prozesua Jenkinsera erabat mugitu zen, garatzaileek beren makinetatik askatzeari utzi zioten eta kaleratze-taldeak bakarrik zuen kaleratzeko eskubidea.

Dagoeneko probak eta analisi estatikoen abian jartzea hobetu nahi genuen, eta gure gidoiak hazi eta hazi egin ziren. Gure aplikazioekin batera hazi eta aldatu egin zen. Garai hartan 10 bat aplikazio zeuden.Bi plataforma ditugula kontuan hartuta, 20 bat gidoi β€œbizi” dira.

Gidoiari urrats berri bat gehitu nahi genion bakoitzean, piezak kopiatu-itsatsi behar izaten genituen shell script guztietan. Beharbada, arreta handiagoz lan egin genezake, baina askotan horrelako aldaketak akatsetan amaitzen ziren, kaleratze-taldeak script-ak konpondu eta komando hau eta zer egiten duen jakiteko zein tipo adimendun gehitu zuen. Oro har, ezin da esan plataforma baterako muntatzeko gidoiak gutxienez antzeko samarrak zirenik. Zalantzarik gabe gauza bera egin zuten arren.

Aplikazio berri baterako prozesu bat hasteko, egun bat eman behar zen script horien bertsio "freskoa" hautatzeko, arazketa eta "bai, funtzionatzen duela" esateko.

2018ko udan, berriro ere garatzen ari den fastlanerantz begiratu genuen.

1. ataza: laburbildu script-urrats guztiak eta berridatzi Fastfile-n

Hasi ginenean, gure gidoiak Jenkins-en shell script bakarreko pauso eta makulu guztiekin osatutako oinetako bat zirudien. Oraindik ez gara kanalizaziora eta etapaka zatiketara aldatu.

Daukaguna aztertu eta gure CI/CDaren deskribapenarekin bat datozen 4 urrats identifikatu ditugu:

  • eraikitzea - ​​mendekotasunak instalatzea, artxiboa muntatzea,
  • proba - garatzaileen unitate-probak egitea, estaldura kalkulatzea,
  • sonar - linter guztiak abiarazten ditu eta SonarQube-ra txostenak bidaltzen ditu,
  • inplementatu β€” artefaktu bat alphara bidaltzea (TestFlight).

Eta xehetasunetan sartzen ez bazara, ekintzetan erabilitako gakoak alde batera utzita, Fastfile hau jasoko duzu:

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

Izan ere, gure lehenengo Fastfile izugarria izan zen, oraindik behar genituen makulu batzuk eta ordezkatu genituen parametro kopurua kontuan hartuta:

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

Goiko adibidean, zehaztu behar ditugun parametroen zati bat bakarrik: hauek dira eraikitzeko parametroak - eskema, konfigurazioa, hornidura-profilaren izenak, baita banaketa-parametroak ere - garatzailearen kontuaren Apple IDa, pasahitza, aplikazioaren IDa, etab. on. Lehen hurbilketa gisa, gako horiek guztiak fitxategi berezietan jartzen ditugu - Gymfile, Matchfile ΠΈ Appfile.

Orain Jenkins-en ikuspegia lausotzen ez duten eta begiz erraz irakur daitezkeen komando laburrak dei ditzakezu:

# fastlane ios <lane_name>

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

Aupa, bikainak gara

Zer lortu duzu? Garbitu komandoak urrats bakoitzeko. Scriptak garbituak, txukun antolatuta fastlane fitxategietan. Pozik, garatzaileengana korrika joan ginen beren biltegietan behar zuten guztia gehitzeko eskatuz.

Baina denborarekin konturatu ginen zailtasun berberak topatuko genituela - oraindik 20 muntaia-gidoi izango genituzke nola edo hala beren bizitza bizitzen hasiko zirenak, zailagoa izango zen editatzea, gidoiak biltegietara eramango baitziren. eta ez genuen han sarbiderik. Eta, oro har, ezin izango da gure mina horrela konpondu.

Mugikorreko CICD esperientzia: mugikorretarako aplikazio askorentzat fastlane estandar bat

2. ataza: lortu Fastfile bakar bat N aplikazioetarako

Orain badirudi arazoa konpontzea ez dela hain zaila - ezarri aldagaiak, eta goazen. Bai, egia esan, horrela konpondu zen arazoa. Baina izorratu genuen momentuan, ez geneukan ez fastlane-n bertan, ez Ruby-n, zeinetan fastlane idazten den, ezta sarean adibide erabilgarriak ere - orduan fastlane-ri buruz idazten zuten guztiak aplikazio baterako adibide batera mugatu ziren. garatzaile bat.

Fastlane-k ingurune-aldagaiak kudea ditzake, eta dagoeneko probatu dugu Keychain pasahitza ezarriz:

ENV['KEYCHAIN_PASSWORD']

Gure gidoiak aztertu ondoren, zati komunak identifikatu ditugu:

#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

Orain, gako hauek fastlane fitxategietan erabiltzen hasteko, han nola entregatu asmatu behar genuen. Fastlanek irtenbide bat du horretarako: aldagaiak dotenv bidez kargatzea. Dokumentazioak dio helburu ezberdinetarako gakoak kargatzea garrantzitsua bada, sortu hainbat konfigurazio fitxategi fastlane direktorioan .env, .env.default, .env.development.

Eta orduan liburutegi hau apur bat desberdin erabiltzea erabaki genuen. Jar ditzagun garatzaileen biltegian ez fastlane scriptak eta bere meta informazioa, baizik eta aplikazio honen gako bakarrak fitxategian. .env.appName.

beraiek Fastfile, Appfile, Matchfile ΠΈ Gymfile, aparteko biltegi batean ezkutatu dugu. Beste zerbitzu batzuetako pasahitz-gakoak dituen fitxategi gehigarri bat ezkutatu da bertan - .env.
Adibide bat ikus dezakezu Hemen.

Mugikorreko CICD esperientzia: mugikorretarako aplikazio askorentzat fastlane estandar bat

CIn, deia ez da asko aldatu; aplikazio zehatz baterako konfigurazio-gako bat gehitu da:

# 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

Komandoak exekutatu aurretik, gure biltegia scriptekin kargatzen dugu. Ez dirudi hain polita:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Momentuz irtenbide hau utzi, nahiz eta Fastlane-k Fastfile bidez deskargatzeko irtenbide bat duen ekintza import_from_git, baina Fastfilerako bakarrik funtzionatzen du, baina ez beste fitxategietarako. β€œBenetan ederra” nahi baduzu, zeurea idatz dezakezu action.

Android aplikazioetarako eta ReactNativerako antzeko multzo bat egin zen, fitxategiak biltegi berean daude, baina adar ezberdinetan iOS, android ΠΈ react_native.

Kaleratze-taldeak urrats berriren bat gehitu nahi duenean, gidoiaren aldaketak MR bidez grabatzen dira git-en, jada ez dago apurtutako scripten errudunak bilatu beharrik, eta, oro har, orain hausten saiatu behar duzu.

Orain hori da ziur

Aurretik, denbora eman genuen script guztiak mantentzen, eguneratzen eta eguneratzeen ondorio guztiak konpontzen. Oso etsigarria izan zen bertsioetan akatsen eta geldialdi-denboraren arrazoiak shell script-en nahasian jarraitzea hain zaila zen akats sinpleak zirenean. Orain horrelako akatsak gutxienera murrizten dira. Aldaketak aplikazio guztietan zabaltzen dira aldi berean. Eta 15 minutu behar dira aplikazio berri bat prozesuan jartzeko: konfiguratu txantiloi kanalizazioa CI-n eta gehitu gakoak garatzailearen biltegian.

Badirudi Fastfile-ren Android-erako eta aplikazioaren sinaduraren kontua argitu gabe geratzen dela; artikulua interesgarria bada, jarraipen bat idatziko dut. Pozik egongo naiz zure galdera edo iradokizunak "nola konponduko zenuke arazo hau" iruzkinetan edo Telegramen bashkirova.

Iturria: www.habr.com

Gehitu iruzkin berria