Բջջային CICD-ի փորձ. արագընթաց շարժական մի ստանդարտ շատ բջջային հավելվածների համար

Բջջային CICD-ի փորձ. արագընթաց շարժական մի ստանդարտ շատ բջջային հավելվածների համար
Ես կցանկանայի խոսել շարժական հավելվածների շարունակական ինտեգրման և առաքման մասին՝ օգտագործելով fastlane: Ինչպես ենք մենք իրականացնում CI/CD բոլոր բջջային հավելվածների վրա, ինչպես ենք մենք հասել այնտեղ և ինչ եղավ վերջում:

Ցանցում արդեն բավականաչափ նյութ կա գործիքի վերաբերյալ, որը մեզ այնքան պակասում էր սկզբում, այնպես որ ես միտումնավոր չեմ նկարագրի գործիքը մանրամասն, այլ միայն կանդրադառնամ այն, ինչ ունեինք այն ժամանակ.

Հոդվածը բաղկացած է երկու մասից.

  • Ընկերությունում բջջային CI/CD-ի առաջացման նախապատմություն
  • Տեխնիկական լուծում N- հավելվածների համար CI/CD-ի տարածման համար

Առաջին մասը ավելի շատ հին օրերի նոստալգիա է, իսկ երկրորդը՝ փորձ, որը կարող ես կիրառել քեզ համար։

Պատմականորեն այսպես է եղել

Տարի 2015

Մենք հենց նոր սկսեցինք մշակել բջջային հավելվածներ, հետո ոչինչ չգիտեինք շարունակական ինտեգրման, DevOps-ի և այլ նորաձև բաների մասին։ Հավելվածի յուրաքանչյուր թարմացում թողարկվել է հենց մշակողի կողմից իր մեքենայից: Եվ եթե Android-ի համար դա բավականին պարզ է՝ հավաքված, ստորագրված .apk և այն վերբեռնեց Google Developer Console-ում, այնուհետև iOS-ի համար Xcode-ի միջոցով այն ժամանակվա բաշխման գործիքը մեզ թողեց հիանալի երեկոներ. արխիվը ներբեռնելու փորձերը հաճախ ավարտվում էին սխալներով, և մենք ստիպված էինք նորից փորձել: Պարզվեց, որ ամենաառաջադեմ ծրագրավորողը ամիսը մի քանի անգամ կոդ չի գրում, այլ թողարկում է հավելվածը։

Տարի 2016

Մենք մեծացանք, արդեն մտքեր ունեինք, թե ինչպես ազատել ծրագրավորողներին մի ամբողջ օրից թողարկման համար, և հայտնվեց նաև երկրորդ հավելվածը, որը մեզ միայն ավելի շատ մղեց դեպի ավտոմատացում։ Այդ նույն տարում մենք առաջին անգամ տեղադրեցինք Jenkins-ը և գրեցինք մի շարք սարսափելի սցենարներ, որոնք շատ նման էին այն սցենարներին, որոնք ցույց է տալիս fastlane-ն իր փաստաթղթերում:

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

Ցավոք, մինչ այժմ միայն մեր մշակողները գիտեին, թե ինչպես են աշխատում այս սցենարները և ինչու է անհրաժեշտ ստեղների այս անվերջ կույտը, և երբ ինչ-որ բան նորից կոտրվեց, նրանք ստացան «հիասքանչ երեկոներ» տեղեկամատյանների վերլուծության համար:

Տարի 2017

Այս տարի մենք իմացանք, որ կա այնպիսի բան, ինչպիսին fastlane է: Այնքան շատ տեղեկություն չկար, որքան հիմա՝ ինչպես սկսել, ինչպես օգտագործել: Իսկ գործիքն ինքնին դեռ կոպիտ էր այն ժամանակ. մշտական ​​սխալները միայն հիասթափեցնում էին մեզ, և դժվար էր հավատալ նրանց խոստացած կախարդական ավտոմատացմանը:

Այնուամենայնիվ, հիմնական կոմունալ ծառայություններն են, որոնք ներառված են fastlane միջուկում gym и pilot, մեզ հաջողվեց սկսել այն։

Մեր սցենարները մի փոքր բարելավվել են։

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

Դրանք բարելավվել են, թեկուզ միայն այն պատճառով, որ դրա համար անհրաժեշտ ոչ բոլոր պարամետրերն են xcodebuild, դուք պետք է նշեք - gym ինքնուրույն կհասկանա, թե որտեղ և ինչ է: Եվ ավելի լավ կարգավորելու համար կարող եք նշել նույն ստեղները, ինչ ներսում xcodebuild, ավելի պարզ է միայն ստեղների անվանումը։

Այս անգամ մարզասրահի և ներկառուցված xcpretty ձևաչափիչի շնորհիվ շինարարական տեղեկամատյանները շատ ավելի ընթեռնելի են դարձել: Սա սկսեց խնայել ժամանակ կոտրված հավաքները շտկելու վրա, և երբեմն թողարկման թիմը կարող էր ինքնուրույն պարզել դա:

Ցավոք, հավաքման արագության չափումներ xcodebuild и gym Մենք դա չենք արել, բայց մենք կվստահենք փաստաթղթերին՝ մինչև 30% արագացում:

Մեկ գործընթաց բոլոր դիմումների համար

Տարի 2018 և այժմ

Մինչև 2018 թվականը հավելվածների ստեղծման և թողարկման գործընթացն ամբողջությամբ տեղափոխվեց Ջենկինս, մշակողները դադարեցրին թողարկումն իրենց մեքենաներից, և թողարկելու իրավունք ուներ միայն թողարկող թիմը:

Մենք արդեն ցանկանում էինք բարելավել թեստերի և ստատիկ վերլուծությունների մեկնարկը, և մեր սցենարները աճեցին և աճեցին: Աճեց և փոխվեց մեր հավելվածների հետ մեկտեղ: Այն ժամանակ մոտ 10 հավելված կար, հաշվի առնելով, որ մենք ունենք երկու հարթակ, դա մոտ 20 «կենդանի» սցենար է։

Ամեն անգամ, երբ մենք ցանկանում էինք նոր քայլ ավելացնել սցենարին, մենք պետք է պատճենեինք կտորները բոլոր կեղևի սցենարներում: Միգուցե մենք կարող էինք ավելի զգույշ աշխատել, բայց հաճախ նման փոփոխություններն ավարտվում էին տառասխալներով, որոնք վերածվում էին երեկոների թողարկման թիմի համար՝ ուղղելու սցենարները և պարզելու, թե որ խելացի տղան է ավելացրել այս հրամանը և ինչ է այն իրականում անում: Ընդհանուր առմամբ, չի կարելի ասել, որ մեկ հարթակի համար հավաքման սցենարները գոնե ինչ-որ չափով նման էին: Չնայած նրանք, անշուշտ, նույն բանն արեցին։

Նոր հավելվածի համար գործընթաց սկսելու համար անհրաժեշտ էր մեկ օր հատկացնել այս սկրիպտների «թարմ» տարբերակը ընտրելու, վրիպազերծելու և ասելու, որ «այո, այն աշխատում է»:

2018 թվականի ամռանը մենք ևս մեկ անգամ նայեցինք դեպի դեռ զարգացող արագընթաց ուղին:

Առաջադրանք թիվ 1. ամփոփել սցենարի բոլոր քայլերը և վերաշարադրել դրանք Fastfile-ում

Երբ մենք սկսեցինք, մեր սցենարները նմանվում էին ոտքի շորի, որը բաղկացած էր բոլոր քայլերից և հենակներից Ջենկինսի մեկ պատյանով գրված սցենարով: Մենք դեռ չենք անցել խողովակաշարի և փուլային բաժանման։

Մենք նայեցինք մեր ունեցածին և բացահայտեցինք 4 քայլ, որոնք համապատասխանում են մեր CI/CD-ի նկարագրությանը.

  • կառուցել - կախյալների տեղադրում, արխիվի հավաքում,
  • թեստ - մշակողի միավորի թեստերի իրականացում, ծածկույթի հաշվարկ,
  • sonar - գործարկում է բոլոր linters և ուղարկում հաշվետվություններ SonarQube,
  • տեղակայել — արտեֆակտ ուղարկել ալֆա (TestFlight):

Եվ եթե մանրամասների մեջ չմտնեք՝ բաց թողնելով գործողություններում օգտագործվող ստեղները, դուք կստանաք այս 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

Իրականում, մեր առաջին Fastfile-ը հրեշավոր ստացվեց՝ հաշվի առնելով որոշ հենակները, որոնք մեզ դեռ պետք էին, և այն պարամետրերի քանակը, որոնք մենք փոխարինեցինք.

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

Վերոնշյալ օրինակում մենք պետք է նշենք պարամետրերի միայն մի մասը. սրանք կառուցման պարամետրերն են՝ սխեման, կոնֆիգուրացիա, Տրամադրման պրոֆիլի անունները, ինչպես նաև բաշխման պարամետրերը՝ մշակողի հաշվի Apple ID-ն, գաղտնաբառը, հավելվածի ID-ն և այլն: վրա. Որպես առաջին մոտարկում, մենք այս բոլոր ստեղները տեղադրեցինք հատուկ ֆայլերում. Gymfile, Matchfile и Appfile.

Այժմ Jenkins-ում կարող եք զանգահարել կարճ հրամաններ, որոնք չեն մշուշում տեսարանը և հեշտությամբ ընթեռնելի են աչքով.

# fastlane ios <lane_name>

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

Ուռայ, մենք հիանալի ենք

Ի՞նչ ստացաք: Մաքրել հրամանները յուրաքանչյուր քայլի համար: Մաքրված սցենարներ՝ կոկիկ դասավորված fastlane ֆայլերում: Ուրախանալով, մենք վազեցինք ծրագրավորողների մոտ՝ խնդրելով նրանց ավելացնել այն ամենը, ինչ անհրաժեշտ է իրենց պահեստներում:

Բայց մենք ժամանակին հասկացանք, որ կհանդիպենք նույն դժվարություններին. մենք դեռ կունենանք 20 հավաքման սցենար, որոնք այսպես թե այնպես կսկսեն ապրել իրենց կյանքով, ավելի դժվար կլիներ դրանք խմբագրել, քանի որ սցենարները կտեղափոխվեին պահեստներ, և մենք այնտեղ մուտք չունեինք։ Եվ, ընդհանրապես, մեր ցավն այսպես լուծել չի հաջողվի։

Բջջային CICD-ի փորձ. արագընթաց շարժական մի ստանդարտ շատ բջջային հավելվածների համար

Առաջադրանք #2. ստացեք մեկ Fastfile N հավելվածների համար

Հիմա թվում է, թե խնդրի լուծումն այնքան էլ դժվար չէ՝ սահմանեք փոփոխականները, և գնանք։ Այո, փաստորեն, խնդիրը հենց այդպես էլ լուծվեց։ Բայց այն պահին, երբ մենք դա տապալեցինք, մենք ոչ բուն fastlane-ի, ոչ Ruby-ի փորձ ունեինք, որում գրված է fastlane, ոչ էլ օգտակար օրինակներ ցանցում. բոլոր նրանք, ովքեր այն ժամանակ գրում էին fastlane-ի մասին, սահմանափակվում էին մեկ օրինակով մեկ դիմումի համար: մեկ մշակող.

Fastlane-ը կարող է կարգավորել շրջակա միջավայրի փոփոխականները, և մենք արդեն փորձել ենք դա՝ սահմանելով Keychain գաղտնաբառը.

ENV['KEYCHAIN_PASSWORD']

Մեր սցենարները դիտելուց հետո մենք բացահայտեցինք ընդհանուր մասերը.

#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

Այժմ, որպեսզի սկսեինք օգտագործել այս բանալիները fastlane ֆայլերում, մենք պետք է պարզեինք, թե ինչպես դրանք մատուցել այնտեղ: Fastlane-ը դրա համար լուծում ունի. փոփոխականների բեռնում dotenv-ի միջոցով. Փաստաթղթում ասվում է, որ եթե ձեզ համար կարևոր է բեռնել ստեղները տարբեր նպատակների համար, ստեղծեք մի քանի կազմաձևման ֆայլեր fastlane գրացուցակում: .env, .env.default, .env.development.

Եվ հետո մենք որոշեցինք օգտագործել այս գրադարանը մի փոքր այլ կերպ: Եկեք մշակողների պահոցում տեղադրենք ոչ թե fastlane սկրիպտները և դրա մետա տեղեկատվությունը, այլ այս հավելվածի եզակի բանալիները ֆայլում: .env.appName.

Իրենք Fastfile, Appfile, Matchfile и Gymfile, մենք այն թաքցրել ենք առանձին պահոցում։ Այնտեղ թաքնված էր այլ ծառայություններից գաղտնաբառի բանալիներով լրացուցիչ ֆայլ. .env.
Դուք կարող եք տեսնել մի օրինակ այստեղ.

Բջջային CICD-ի փորձ. արագընթաց շարժական մի ստանդարտ շատ բջջային հավելվածների համար

CI-ում զանգը շատ չի փոխվել, ավելացվել է կոնկրետ հավելվածի համար կազմաձևման բանալի.

# 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

Նախքան հրամանները գործարկելը, մենք բեռնում ենք մեր պահեստը սկրիպտներով: Այնքան էլ գեղեցիկ տեսք չունի.

git clone [email protected]/FastlaneCICD.git fastlane_temp

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

Առայժմ թողել է այս լուծումը, չնայած Fastlane-ն ունի լուծում Fastfile-ի միջոցով ներբեռնելու համար գործողություն import_from_git, բայց այն աշխատում է միայն Fastfile-ի համար, բայց ոչ այլ ֆայլերի համար։ Եթե ​​ցանկանում եք «իրոք գեղեցիկ», կարող եք գրել ձերը action.

Նմանատիպ հավաքածու ստեղծվել է Android հավելվածների և ReactNative-ի համար, ֆայլերը գտնվում են նույն պահեստում, բայց տարբեր ճյուղերում։ iOS, android и react_native.

Երբ թողարկող թիմը ցանկանում է ինչ-որ նոր քայլ ավելացնել, սցենարի փոփոխությունները գրանցվում են MR-ի միջոցով git-ում, այլևս կարիք չկա փնտրելու կոտրված սցենարների մեղավորներին, և ընդհանրապես, հիմա պետք է փորձել կոտրել այն։

Հիմա դա հաստատ է

Նախկինում մենք ժամանակ էինք ծախսում բոլոր սկրիպտները պահպանելու, դրանք թարմացնելու և թարմացումների բոլոր հետևանքները շտկելու համար: Շատ հիասթափեցնող էր, երբ թողարկումներում սխալների և ընդհատումների պատճառները պարզ տառասխալներ էին, որոնք այնքան դժվար էր հետևել կեղևի սցենարների խառնաշփոթին: Այժմ նման սխալները հասցված են նվազագույնի։ Փոփոխությունները կատարվում են միանգամից բոլոր հավելվածներում: Եվ 15 րոպե է պահանջվում նոր հավելվածը գործընթացի մեջ դնելու համար՝ CI-ի վրա տեղադրեք կաղապարի խողովակաշար և ավելացրեք բանալիները մշակողի պահեստում:

Թվում է, թե Android-ի համար Fastfile-ի և հավելվածի ստորագրության հետ կապված կետը մնում է անբացատրելի, եթե հոդվածը հետաքրքիր լինի, ես կգրեմ շարունակությունը։ Ուրախ կլինեմ տեսնել ձեր հարցերը կամ առաջարկները «ինչպես կլուծեիք այս խնդիրը» մեկնաբանություններում կամ Telegram-ում։ բաշկիրովա.

Source: www.habr.com

Добавить комментарий