Tecrûbeya CICD-a mobîl: yek standardek fastlane ji bo gelek serîlêdanên mobîl

Tecrûbeya CICD-a mobîl: yek standardek fastlane ji bo gelek serîlêdanên mobîl
Ez dixwazim li ser yekbûn û radestkirina domdar ji bo sepanên mobîl bi karanîna fastlane biaxivim. Em çawa CI/CD-ê li ser hemî serlêdanên mobîl bicîh dikin, em çawa gihîştin wir û di dawiyê de çi qewimî.

Jixwe materyalek têr li ser torê li ser amûrê heye, ku di destpêkê de kêmasiya me bû, ji ber vê yekê ez ê bi zanebûn amûrê bi hûrgulî rave nekim, lê tenê dê behsa tiştê ku me wê hingê hebû bikim:

Gotar ji du beşan pêk tê:

  • Paşnava derketina CI / CD ya mobîl di pargîdaniyê de
  • Çareseriya teknîkî ji bo derxistina CI/CD-ê ji bo N-sepanan

Beşa yekem ji bo rojên kevn zêdetir nostaljiyek e, û ya duyemîn ezmûnek e ku hûn dikarin li xwe bicîh bikin.

Ji aliyê dîrokî ve bi vî rengî bû

Sal 2015

Me nû dest bi pêşvebirina sepanên mobîl kir, wê hingê me tiştek di derbarê yekbûna domdar, di derbarê DevOps û tiştên din ên modê de nizanibû. Her nûvekirina serîlêdanê ji hêla pêşdebir bixwe ji makîneya xwe ve hate derxistin. Û heke ji bo Android-ê ew pir hêsan e - civandin, îmze kirin .apk û ew li Google Developer Console barkir, dûv re ji bo iOS-ê amûra belavkirinê ya wê demê bi navgîniya Xcode-ê ji me re êvarên mezin hişt - hewildanên dakêşana arşîvê bi gelemperî bi xeletiyan qediyan û me neçar ma ku dîsa biceribîne. Derket holê ku pêşdebirê herî pêşkeftî mehê çend caran kodê nanivîse, lê berevajî serîlêdanê derdixe.

Sal 2016

Em mezin bûn, me jixwe ramanên me hebûn ka meriv çawa ji rojek tevahî ji bo serbestberdanê pêşdebiran azad dike, û serîlêdanek duyemîn jî xuya bû, ku tenê me bêtir ber bi otomasyonê ve dikişîne. Di heman salê de, me ji bo yekem car Jenkins saz kir û komek senaryoyên tirsnak, pir dişibihe yên ku fastlane di belgeyên xwe de nîşan dide.

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

Mixabin, heya nuha tenê pêşdebirên me dizanibûn ka ev nivîsar çawa dixebitin û çima ev stûna bêdawî ya bişkokan hewce ye, û gava ku tiştek dîsa şikest, wan ji bo analîzkirina têketin "êvarên spehî" wergirtin.

Sal 2017

Îsal em hîn bûn ku tiştek bi navê fastlane heye. Bi qasî niha agahdarî tune bû - meriv çawa dest pê dike, meriv wê çawa bikar tîne. Û hacet bi xwe jî di wê demê de xav bû: xeletiyên domdar tenê me bêhêvî kirin û dijwar bû ku meriv bi otomasyona efsûnî ya ku wan soz dabû bawer bike.

Lêbelê, karûbarên sereke yên ku di navgîniya fastlane de hene hene gym и pilot, me dest pê kir.

Nivîsarên me hinekî baştir bûne.

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

Ew çêtir bûne, heke tenê ji ber ku ne hemî pîvanên ku ji bo wan hewce ne xcodebuild, divê hûn destnîşan bikin - gym dê serbixwe fêm bike ku li ku û çi derewan dike. Û ji bo hûrgulîkirina bêtir, hûn dikarin heman bişkojkên wekî di nav de diyar bikin xcodebuild, tenê navê kilîtan zelaltir e.

Vê carê, bi saya werzîşê û formattera xcpretty ya çêkirî, têketinên çêkirinê pir xwendatir bûne. Vê yekê dest pê kir ku dem li ser rastkirina meclîsên şikestî xilas bike, û carinan tîmê berdanê dikaribû wê bi serê xwe fêhm bike.

Mixabin, pîvandinên leza civînê xcodebuild и gym Me wiya nekir, lê em ê bi belgeyê bawer bikin - heya 30% bilez.

Pêvajoyek yekane ji bo hemî serlêdanan

Sala 2018 û niha

Di sala 2018-an de, pêvajoya çêkirin û derxistina serlêdanan bi tevahî çû Jenkins, pêşdebiran berdana ji makîneyên xwe rawestand, û tenê tîmê berdanê mafê berdanê hebû.

Me berê dixwest ku destpêkirina ceribandin û analîzên statîk çêtir bikin, û nivîsarên me mezin û mezin bûn. Bi serîlêdanên me re mezin bû û guherî. Wê demê nêzî 10 sepan hebûn.Li gorî ku du platformên me hene, yanî nêzî 20 senaryoyên “zindî”.

Her gava ku me dixwest em gavek nû li senaryoyê zêde bikin, me neçar ma ku perçeyan di hemî nivîsarên şêlê de kopî-paste bikin. Dibe ku me dikaribû bi baldarî bixebitin, lê pir caran guhertinên weha bi tîpên tîpan qediyan, yên ku ji bo tîmê berdanê vediguherin êvaran da ku senaryoyan rast bikin û fêr bibin ka kîjan zilamê jîr ev ferman lê zêde kiriye û ew bi rastî çi dike. Bi gelemperî, meriv nikare bêje ku nivîsarên ji bo kombûnê ji bo yek platformê bi kêmî ve hinekî dişibin hev. Her çend wan bê guman heman tişt kir.

Ji bo destpêkirina pêvajoyek ji bo serîlêdanek nû, pêdivî bû ku rojek were derbas kirin ku guhertoyek "teze" ya van nivîsan hilbijêrin, jêbirin û bibêjin "erê, ew dixebite."

Di havîna 2018-an de, me careke din li leza ku hîna pêşkeftî ye nihêrî.

Karê #1: Hemî gavên skrîptê bi kurtî berhev bike û wan di Fastfile de ji nû ve binivîsîne

Dema ku me dest pê kir, senaryoyên me dişibihin ku di Jenkins de ji hemî gav û kincên ku di yek skrîpta şêlê de pêk tê, senaryoyên me dixuya. Em hê neçûne xeta boriyê û dabeşkirina bi qonax.

Me li tiştên ku me hene mêze kir û 4 gavên ku li gorî danasîna CI/CD-ya me ne diyar kirin:

  • avakirin - sazkirina pêwendiyan, komkirina arşîvê,
  • test - ceribandinên yekîneya pêşdebiran dimeşîne, vegirtinê hesab dike,
  • sonar - hemî lîberan dide destpêkirin û raporan ji SonarQube re dişîne,
  • bicihkirin - şandina hunerek ji alpha (TestFlight).

Û heke hûn neçin hûrguliyan, bişkojkên ku di çalakiyan de têne bikar anîn bernedin, hûn ê vê Fastpelê bistînin:

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

Bi rastî, Fastfile-ya meya yekem cinawir derket, li ber çavê xwe hin hûrgelên ku em hîn jî hewce ne û hejmara parametreyên ku me li şûna wan digirin:

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

Di mînaka li jor de, tenê beşek ji pîvanên ku divê em diyar bikin: ev parametreyên avakirinê ne - şema, mîheng, navên Profîla Pêşkêşker, û her weha pîvanên belavkirinê - Apple ID ya hesabê pêşdebir, şîfre, nasnameya serîlêdanê, û hwd. li. Wekî nêzîkatiya yekem, me van hemî kilît di pelên taybetî de datîne - Gymfile, Matchfile и Appfile.

Naha di Jenkins de hûn dikarin fermanên kurt ên ku dîtinê şepirze nakin û bi çavan bi hêsanî têne xwendin bang bikin:

# fastlane ios <lane_name>

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

Hurray, em pir baş in

Te çi girt? Ji bo her gav fermanan paqij bikin. Skrîpta paqij kirin, di pelên fastlane de bi rêkûpêk hatine rêz kirin. Bi şabûn, em reviyan cem pêşdebiran û ji wan pirsî ku her tiştê ku ew hewce ne li depoyên xwe zêde bikin.

Lê me di wextê xwe de fêm kir ku em ê bi heman dijwariyan re rû bi rû bimînin - dê hîn jî 20 nivîsarên meclîsê hebin ku dê bi rengekî din dest bi jiyana xwe bikin, sererastkirina wan dê dijwartir be, ji ber ku senaryo dê biçin depoyan, û me negihîşt wir. Û bi giştî jî bi vî awayî êþa me çareser nabe.

Tecrûbeya CICD-a mobîl: yek standardek fastlane ji bo gelek serîlêdanên mobîl

Karê # 2: Ji bo N serlêdanan yek Fastfile bistînin

Naha dixuye ku çareserkirina pirsgirêkê ne ew qas dijwar e - guherbaran saz bikin, û em biçin. Erê, bi rastî, bi vî rengî pirsgirêk çareser bû. Lê di wê kêlîkê de ku me ew xera kir, ne pisporiya me di fastlane bixwe de, ne jî di Ruby de, ku tê de fastlane tê nivîsandin, û ne jî mînakên bikêr li ser torê hebûn - her kesê ku wê hingê li ser fastlane nivîsand, ji bo yek serîlêdanê ji bo mînakek sînorkirî bû. yek pêşdebiran.

Fastlane dikare guhêrbarên jîngehê bi rê ve bibe, û me berê jî bi danîna şîfreya Keychain ev ceriband:

ENV['KEYCHAIN_PASSWORD']

Piştî ku li nivîsarên xwe nihêrîn, me beşên hevpar nas kirin:

#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

Naha, ji bo ku em dest bi karanîna van bişkokan di pelên fastlane de bikin, neçar mabû ku em fêhm bikin ka meriv wan çawa li wir radest dike. Fastlane ji bo vê yekê çareseriyek heye: barkirina guherbaran bi rêya dotenv. Di belgeyê de tê gotin ku heke ji bo we girîng e ku hûn bişkojkan ji bo mebestên cihêreng bar bikin, di pelrêça fastlane de gelek pelên vesazkirinê biafirînin. .env, .env.default, .env.development.

Û paşê me biryar da ku em vê pirtûkxaneyê hinekî cuda bikar bînin. Ka em di depoya pêşdebiran de ne nivîsarên fastlane û agahdariya meta wê, lê bişkojkên bêhempa yên vê serîlêdanê di pelê de bi cîh bikin. .env.appName.

Xwe bi xwe dikin Fastfile, Appfile, Matchfile и Gymfile, me ew di depoyek cuda de veşart. Pelek din bi bişkojkên şîfreyê yên ji karûbarên din ve li wir veşartî bû - .env.
Hûn dikarin mînakek bibînin vir.

Tecrûbeya CICD-a mobîl: yek standardek fastlane ji bo gelek serîlêdanên mobîl

Li ser CI, bang pir neguherî; ji bo serîlêdanek taybetî mifteyek mîhengê hate zêdekirin:

# 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

Berî ku emrê bimeşînin, em depoya xwe bi skrîptan bar dikin. Ew qas xweş xuya nake:

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Vê çareseriyê ji bo nuha hiştin, her çend Fastlane ji bo dakêşana Fastfile bi rê ve çareseriyek heye çalakî import_from_git, lê ew tenê ji bo Fastfile dixebite, lê ne ji bo pelên din. Heke hûn "bi rastî xweşik" dixwazin, hûn dikarin ya xwe binivîsin action.

Komek wusa ji bo serîlêdanên Android û ReactNative hate çêkirin, pel di heman depoyê de ne, lê di şaxên cûda de iOS, android и react_native.

Gava ku tîmê serbestberdanê dixwaze hin gavek nû lê zêde bike, guhertinên di skrîptê de bi riya MR-ê di git-ê de têne tomar kirin, êdî ne hewce ye ku li sûcdarên nivîsarên şikestî bigerin, û bi gelemperî, naha divê hûn hewl bidin ku wê bişkînin.

Niha ew guman e

Berê, me wext derbas kir ku hemî nivîsan diparêzin, wan nûve dikin û hemî encamên nûvekirinê rast dikin. Gava ku sedemên xeletî û domdariya di weşanan de xeletiyên hêsan bûn ku şopandina wan di nav tevliheviya nivîsarên şêlê de ew qas dijwar bû, pir xemgîn bû. Niha xeletiyên bi vî rengî kêm bûne. Guhertin bi yekcarî li hemî serlêdanan têne kirin. Û 15 hûrdeman digire da ku serîlêdanek nû têxe pêvajoyê - li ser CI boriyek şablonê saz bike û mifteyan li depoya pêşdebiran zêde bike.

Wusa dixuye ku xala bi Fastfile ji bo Android û îmzeya serîlêdanê nayê ravekirin; heke gotar balkêş be, ez ê berdewamiyê binivîsim. Ez ê kêfxweş bibim ku pirs an pêşniyarên we "hûn ê vê pirsgirêkê çawa çareser bikin" di şîroveyan an li ser Telegram de bibînim bashkirova.

Source: www.habr.com

Add a comment