Esperienza CICD mobile: un standard fastlane per parechje applicazioni mobili

Esperienza CICD mobile: un standard fastlane per parechje applicazioni mobili
Vogliu parlà di l'integrazione cuntinua è a consegna per l'applicazioni mobili chì utilizanu fastlane. Cumu implementemu CI / CD in tutte l'applicazioni mobili, cumu avemu ghjuntu quì è ciò chì hè accadutu à a fine.

Ci hè digià abbastanza materiale nantu à a reta nantu à l'uttellu, chì avemu tantu mancatu à l'iniziu, cusì ùn deliberate micca descriverà l'uttellu in dettagliu, ma solu riferite à ciò chì avemu avutu allora:

L'articulu hè custituitu di dui parti:

  • Sfondate à l'emergenza di CI / CD mobile in a cumpagnia
  • Soluzione tecnica per l'implementazione di CI/CD per applicazioni N

A prima parte hè più nostalgia di i vechji ghjorni, è a seconda hè una sperienza chì pudete applicà à sè stessu.

Hè cusì chì hè accadutu storicamente

Annu 2015

Avemu principiatu à sviluppà appiicazioni mobile, allora ùn sapemu nunda di l'integrazione cuntinua, di DevOps è di altre cose di moda. Ogni aghjurnamentu di l'applicazione hè stata lanciata da u sviluppatore stessu da a so macchina. È se per Android hè abbastanza simplice - assemblatu, firmatu .apk è l'hà caricatu à a Google Developer Console, dopu per iOS l'utile di distribuzione allora via Xcode ci hà lasciatu grandi serate - i tentativi di scaricà l'archiviu spessu finiscinu in errori è avemu avutu à pruvà di novu. Hè risultatu chì u sviluppatore più avanzatu ùn scrive micca codice parechje volte à u mese, ma piuttostu libera l'applicazione.

Annu 2016

Avemu crisciutu, avemu digià avutu pinsamenti nantu à cumu liberà i sviluppatori da un ghjornu sanu per una liberazione, è hè ancu apparsu una seconda applicazione, chì ci hà solu spintu più versu l'automatizazione. Ddu stessu annu, avemu installatu Jenkins per a prima volta è hà scrittu una mansa di scripts spaventosi, assai simili à quelli chì fastlane mostra in a so documentazione.

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

Sfurtunatamente, finu à avà, solu i nostri sviluppatori sapianu cumu funziona sti scripts è perchè sta pila infinita di chjavi hè necessariu, è quandu qualcosa si rumpiu di novu, anu avutu a "serate splendide" per analizà i logs.

Annu 2017

Quist'annu avemu amparatu chì ci hè una cosa cum'è fastlane. Ùn ci era micca tanta infurmazione cum'è avà - cumu principià unu, cumu aduprà. È l'uttellu stessu era sempre crudu à quellu tempu: l'errori constanti ci anu disappuntu solu è era difficiuli di crede in l'automatizazione magica chì anu prumessu.

Tuttavia, i principali utilità inclusi in u core fastlane sò gym и pilot, avemu riesciutu à principià.

I nostri scripts sò stati migliurati un pocu.

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

Sò stati migliurati, solu perchè micca tutti i paràmetri necessarii per xcodebuild, avete bisognu di indicà - gym capisce indipindente induve è ciò chì si trova. È per più fine-tuning, pudete specificà e stesse chjave cum'è in xcodebuild, solu a denominazione di e chjave hè più chjara.

Questa volta, grazia à u gym è u formatter xcpretty integratu, i logs di custruzzione sò diventati assai più leggibili. Questu hà cuminciatu à risparmià tempu nantu à a riparazione di assemblee rotte, è qualchì volta a squadra di liberazione puderia capisce da sè stessu.

Sfurtunatamente, misure di velocità di assemblea xcodebuild и gym Ùn avemu micca fattu, ma avemu a fiducia in a ducumentazione - finu à 30% di accelerazione.

Prucessu unicu per tutte l'applicazioni

Annu 2018 è presente

In u 2018, u prucessu di custruzzione è di sparghje l'applicazioni si trasfirìu completamente à Jenkins, i sviluppatori anu cessatu di liberà da e so macchine, è solu a squadra di liberazione avia u dirittu di liberà.

Avemu digià vulsutu migliurà u lanciu di teste è analisi statiche, è i nostri script anu crisciutu è crescenu. Cresciute è cambiate cù e nostre applicazioni. À quellu tempu, ci sò circa 10 appiicazioni In cunsiderà chì avemu duie piattaforme, questu hè circa 20 script "viventi".

Ogni volta chì vulemu aghjunghje un novu passu à u script, avemu avutu à copià-incollà i pezzi in tutti i script di shell. Puderiamu avè travagliatu cù più cura, ma spessu tali cambiamenti finiscinu in typos, chì si trasformanu in serate per a squadra di liberazione per riparà i scripts è scopre quale intelligente hà aghjustatu stu cumandamentu è ciò chì faci veramente. In generale, ùn si pò dì chì i scripts per l'assemblea per una piattaforma eranu almenu un pocu simili. Ancu s'ellu certamenti anu fattu a listessa cosa.

Per inizià un prucessu per una nova applicazione, era necessariu di passà un ghjornu per selezziunà una versione "fresca" di sti script, debug è dì chì "sì, funziona".

In l'estiu di u 2018, avemu tornatu à circà à u fastlane chì si sviluppa.

Task #1: riassume tutti i passi di script è riscrivite in Fastfile

Quandu avemu principiatu, i nostri scripts parevanu un pappu custituitu di tutti i passi è crutches in un script di cunchiglia in Jenkins. Ùn avemu micca ancu cambiatu à pipeline è divisione per stage.

Avemu vistu ciò chì avemu è identificatu 4 passi chì si adattanu à a descrizzione di u nostru CI / CD:

  • custruì - installà dipendenze, assemble l'archiviu,
  • prova - esecuzione di teste di unità di sviluppatore, calculà a cobertura,
  • sonar - lancia tutti i linters è manda rapporti à SonarQube,
  • implementà - mandendu un artefattu à alpha (TestFlight).

È s'ellu ùn andate micca in i dettagli, omettendu e chjave aduprate in l'azzioni, uttene stu 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

In fatti, u nostru primu Fastfile hè statu monstruosu, cunzidiendu alcune di e crutches chì avemu sempre bisognu è u numeru di parametri chì avemu sustituitu:

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

In l'esempiu sopra, solu una parte di i paràmetri chì avemu bisognu di specificà: questi sò i paràmetri di custruzzione - schema, cunfigurazione, nomi di prufilu di pruvisione, è ancu i paràmetri di distribuzione - ID Apple di u cuntu di sviluppatore, password, ID di l'applicazione, etc. nantu. Cum'è una prima approssimazione, mettemu tutte queste chjavi in ​​schedarii speciali - Gymfile, Matchfile и Appfile.

Avà in Jenkins pudete chjamà cumandamenti brevi chì ùn sfocanu micca a vista è sò facilmente leghjite à l'ochju:

# fastlane ios <lane_name>

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

Hurrah, simu grandi

Chì avete ricevutu ? Cumandamenti chjaru per ogni passu. Scripts puliti, ordinati in fugliali fastlane. Rallengendu, curriamu à i sviluppatori dumandenduli di aghjunghje tuttu ciò chì avianu bisognu à i so repositori.

Ma avemu capitu à u tempu chì avemu da scontru cù e listesse difficultà - averemu sempre 20 scripts d'assemblea chì da un modu o un altru cumincianu à campà a so propria vita, saria più difficiuli di edità, postu chì i scripts si movenu in i repositori, è ùn avemu micca accessu quì. È, in generale, ùn serà micca pussibule di risolve u nostru dolore in questu modu.

Esperienza CICD mobile: un standard fastlane per parechje applicazioni mobili

Task #2: uttene un unicu Fastfile per N applicazioni

Avà pare chì risolve u prublema ùn hè micca cusì difficiule - stabilisce e variàbili, è andemu. Iè, in fattu, hè cusì chì u prublema hè stata risolta. Ma à u mumentu chì l'avemu cacciatu, ùn aviamu nè sapè fà in fastlane stessu, nè in Ruby, in quale fastlane hè scrittu, nè esempi utili nantu à a reta - tutti quelli chì anu scrittu annantu à fastlane allora era limitatu à un esempiu per una applicazione per un sviluppatore.

Fastlane pò trattà e variabili di l'ambienti, è avemu digià pruvatu questu mettendu a password Keychain:

ENV['KEYCHAIN_PASSWORD']

Dopu avè vistu i nostri scripts, avemu identificatu e parti cumuni:

#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

Avà, per cumincià à aduprà sti chjavi in ​​i fugliali fastlane, avemu avutu à scopre cumu trasmette quì. Fastlane hà una suluzione per questu: caricate variabili via dotenv. A ducumentazione dice chì s'ellu hè impurtante per voi di carricà e chjave per diversi scopi, create parechji schedarii di cunfigurazione in u cartulare fastlane. .env, .env.default, .env.development.

E dopu avemu decisu di utilizà sta biblioteca un pocu sfarente. Pudemu in u repositoriu di i sviluppatori micca i script di fastlane è a so meta infurmazione, ma i chjavi unichi di sta applicazione in u schedariu .env.appName.

Stessi stessi Fastfile, Appfile, Matchfile и Gymfile, l'avemu ammucciatu in un repositoriu separatu. Un schedariu supplementu cù chjavi di password da altri servizii hè statu oculatu quì - .env.
Pudete vede un esempiu ccà.

Esperienza CICD mobile: un standard fastlane per parechje applicazioni mobili

In CI, a chjama ùn hà micca cambiatu assai una chjave di cunfigurazione per una applicazione specifica hè stata aghjunta:

# 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

Prima di eseguisce i cumandamenti, carchemu u nostru repository cù scripts. Ùn pare micca cusì bellu:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Abbandunatu sta suluzione per avà, ancu se Fastlane hà una suluzione per scaricà Fastfile via azzione import_from_git, ma funziona solu per Fastfile, ma micca per altri schedari. Se vulete "veramente bella", pudete scrive u vostru propiu action.

Un settore simili hè statu fattu per l'applicazioni Android è ReactNative, i schedari sò in u stessu repository, ma in diverse rami iOS, android и react_native.

Quandu u squadra di liberazione vole aghjunghje un novu passu, i cambiamenti in u script sò arregistrati via MR in git, ùn ci hè più bisognu di circà i culpiti di scripts rotti, è in generale, avà avete da pruvà à rompe.

Avà hè sicuru

Prima, avemu passatu u tempu à mantene tutti i scripts, l'aghjurnà è risolve tutte e cunsequenze di l'aghjurnamenti. Era assai deludente quandu i motivi per l'errori è i tempi di inattività in e versioni eranu simplici typos chì eranu cusì difficiuli di guardà in a cunfusione di script di shell. Avà tali errori sò ridotti à u minimu. I cambiamenti sò implementati à tutte l'applicazioni in una volta. E ci vole 15 minuti per mette una nova applicazione in u prucessu - cunfigurà un pipeline di mudellu nantu à CI è aghjunghje e chjave à u repositoriu di u sviluppatore.

Sembra chì u puntu cù Fastfile per Android è a firma di l'applicazione resta inesplicabile se l'articulu hè interessante, scriveraghju una continuazione. Seraghju cuntentu di vede e vostre dumande o suggerimenti "cumu avaristi risolve stu prublema" in i cumenti o in Telegram bashkirova.

Source: www.habr.com

Add a comment