ProHoster > Blog > Amministrazione > 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:
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.
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à.
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:
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:
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.
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à.
In CI, a chjama ùn hà micca cambiatu assai una chjave di cunfigurazione per una applicazione specifica hè stata aghjunta:
Abbandunatu sta suluzione per avà, ancu se Fastlane hà una suluzione per scaricà Fastfile via azzioneimport_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.