ProHoster > Օրագիր > Վարչակազմը > Բջջային CICD-ի փորձ. արագընթաց շարժական մի ստանդարտ շատ բջջային հավելվածների համար
Բջջային CICD-ի փորձ. արագընթաց շարժական մի ստանդարտ շատ բջջային հավելվածների համար
Ես կցանկանայի խոսել շարժական հավելվածների շարունակական ինտեգրման և առաքման մասին՝ օգտագործելով fastlane: Ինչպես ենք մենք իրականացնում CI/CD բոլոր բջջային հավելվածների վրա, ինչպես ենք մենք հասել այնտեղ և ինչ եղավ վերջում:
Ցանցում արդեն բավականաչափ նյութ կա գործիքի վերաբերյալ, որը մեզ այնքան պակասում էր սկզբում, այնպես որ ես միտումնավոր չեմ նկարագրի գործիքը մանրամասն, այլ միայն կանդրադառնամ այն, ինչ ունեինք այն ժամանակ.
Ընկերությունում բջջային CI/CD-ի առաջացման նախապատմություն
Տեխնիկական լուծում N- հավելվածների համար CI/CD-ի տարածման համար
Առաջին մասը ավելի շատ հին օրերի նոստալգիա է, իսկ երկրորդը՝ փորձ, որը կարող ես կիրառել քեզ համար։
Պատմականորեն այսպես է եղել
Տարի 2015
Մենք հենց նոր սկսեցինք մշակել բջջային հավելվածներ, հետո ոչինչ չգիտեինք շարունակական ինտեգրման, DevOps-ի և այլ նորաձև բաների մասին։ Հավելվածի յուրաքանչյուր թարմացում թողարկվել է հենց մշակողի կողմից իր մեքենայից: Եվ եթե Android-ի համար դա բավականին պարզ է՝ հավաքված, ստորագրված .apk և այն վերբեռնեց Google Developer Console-ում, այնուհետև iOS-ի համար Xcode-ի միջոցով այն ժամանակվա բաշխման գործիքը մեզ թողեց հիանալի երեկոներ. արխիվը ներբեռնելու փորձերը հաճախ ավարտվում էին սխալներով, և մենք ստիպված էինք նորից փորձել: Պարզվեց, որ ամենաառաջադեմ ծրագրավորողը ամիսը մի քանի անգամ կոդ չի գրում, այլ թողարկում է հավելվածը։
Տարի 2016
Մենք մեծացանք, արդեն մտքեր ունեինք, թե ինչպես ազատել ծրագրավորողներին մի ամբողջ օրից թողարկման համար, և հայտնվեց նաև երկրորդ հավելվածը, որը մեզ միայն ավելի շատ մղեց դեպի ավտոմատացում։ Այդ նույն տարում մենք առաջին անգամ տեղադրեցինք Jenkins-ը և գրեցինք մի շարք սարսափելի սցենարներ, որոնք շատ նման էին այն սցենարներին, որոնք ցույց է տալիս fastlane-ն իր փաստաթղթերում:
Ցավոք, մինչ այժմ միայն մեր մշակողները գիտեին, թե ինչպես են աշխատում այս սցենարները և ինչու է անհրաժեշտ ստեղների այս անվերջ կույտը, և երբ ինչ-որ բան նորից կոտրվեց, նրանք ստացան «հիասքանչ երեկոներ» տեղեկամատյանների վերլուծության համար:
Տարի 2017
Այս տարի մենք իմացանք, որ կա այնպիսի բան, ինչպիսին fastlane է: Այնքան շատ տեղեկություն չկար, որքան հիմա՝ ինչպես սկսել, ինչպես օգտագործել: Իսկ գործիքն ինքնին դեռ կոպիտ էր այն ժամանակ. մշտական սխալները միայն հիասթափեցնում էին մեզ, և դժվար էր հավատալ նրանց խոստացած կախարդական ավտոմատացմանը:
Այնուամենայնիվ, հիմնական կոմունալ ծառայություններն են, որոնք ներառված են fastlane միջուկում gym и pilot, մեզ հաջողվեց սկսել այն։
Դրանք բարելավվել են, թեկուզ միայն այն պատճառով, որ դրա համար անհրաժեշտ ոչ բոլոր պարամետրերն են 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 ֆայլերում: Ուրախանալով, մենք վազեցինք ծրագրավորողների մոտ՝ խնդրելով նրանց ավելացնել այն ամենը, ինչ անհրաժեշտ է իրենց պահեստներում:
Բայց մենք ժամանակին հասկացանք, որ կհանդիպենք նույն դժվարություններին. մենք դեռ կունենանք 20 հավաքման սցենար, որոնք այսպես թե այնպես կսկսեն ապրել իրենց կյանքով, ավելի դժվար կլիներ դրանք խմբագրել, քանի որ սցենարները կտեղափոխվեին պահեստներ, և մենք այնտեղ մուտք չունեինք։ Եվ, ընդհանրապես, մեր ցավն այսպես լուծել չի հաջողվի։
Առաջադրանք #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.
Դուք կարող եք տեսնել մի օրինակ այստեղ.
CI-ում զանգը շատ չի փոխվել, ավելացվել է կոնկրետ հավելվածի համար կազմաձևման բանալի.
Առայժմ թողել է այս լուծումը, չնայած Fastlane-ն ունի լուծում Fastfile-ի միջոցով ներբեռնելու համար գործողությունimport_from_git, բայց այն աշխատում է միայն Fastfile-ի համար, բայց ոչ այլ ֆայլերի համար։ Եթե ցանկանում եք «իրոք գեղեցիկ», կարող եք գրել ձերը action.
Նմանատիպ հավաքածու ստեղծվել է Android հավելվածների և ReactNative-ի համար, ֆայլերը գտնվում են նույն պահեստում, բայց տարբեր ճյուղերում։ iOS, android и react_native.
Երբ թողարկող թիմը ցանկանում է ինչ-որ նոր քայլ ավելացնել, սցենարի փոփոխությունները գրանցվում են MR-ի միջոցով git-ում, այլևս կարիք չկա փնտրելու կոտրված սցենարների մեղավորներին, և ընդհանրապես, հիմա պետք է փորձել կոտրել այն։
Հիմա դա հաստատ է
Նախկինում մենք ժամանակ էինք ծախսում բոլոր սկրիպտները պահպանելու, դրանք թարմացնելու և թարմացումների բոլոր հետևանքները շտկելու համար: Շատ հիասթափեցնող էր, երբ թողարկումներում սխալների և ընդհատումների պատճառները պարզ տառասխալներ էին, որոնք այնքան դժվար էր հետևել կեղևի սցենարների խառնաշփոթին: Այժմ նման սխալները հասցված են նվազագույնի։ Փոփոխությունները կատարվում են միանգամից բոլոր հավելվածներում: Եվ 15 րոպե է պահանջվում նոր հավելվածը գործընթացի մեջ դնելու համար՝ CI-ի վրա տեղադրեք կաղապարի խողովակաշար և ավելացրեք բանալիները մշակողի պահեստում:
Թվում է, թե Android-ի համար Fastfile-ի և հավելվածի ստորագրության հետ կապված կետը մնում է անբացատրելի, եթե հոդվածը հետաքրքիր լինի, ես կգրեմ շարունակությունը։ Ուրախ կլինեմ տեսնել ձեր հարցերը կամ առաջարկները «ինչպես կլուծեիք այս խնդիրը» մեկնաբանություններում կամ Telegram-ում։ բաշկիրովա.