Ман мехоҳам дар бораи ҳамгироӣ ва интиқоли пайваста барои барномаҳои мобилӣ бо истифода аз fastlane сӯҳбат кунам. Чӣ тавр мо CI/CD-ро дар ҳама замимаҳои мобилӣ татбиқ мекунем, чӣ гуна мо ба он ҷо расидем ва дар ниҳоят чӣ рӯй дод.
Дар шабака дар асбоб аллакай маводи кофӣ мавҷуд аст, ки мо дар ибтидо он қадар намерасидем, аз ин рӯ ман дидаву дониста асбобро ба таври муфассал тавсиф намекунам, балки танҳо ба он чизе ки он вақт доштем, ишора мекунам:
Ҳуҷҷатҳои расмии fastlane Намунаҳо аз дигар ширкатҳо Мо бо истифода аз Fastlane васлкунии замимаҳои iOS-ро автоматӣ мекунем
Мақола аз ду қисм иборат аст:
- Замина ба пайдоиши CI/CD мобилӣ дар ширкат
- Ҳалли техникӣ барои паҳн кардани CI/CD барои барномаҳои N
Қисмати аввал ҳасрати бештар барои айёми кӯҳна аст ва дуввум таҷрибаест, ки шумо метавонед ба худ татбиқ кунед.
Ин тавр буд таърихӣ
Сол 2015
Мо нав ба таҳияи замимаҳои мобилӣ шурӯъ кардем, он гоҳ мо дар бораи ҳамгироии пайваста, дар бораи DevOps ва дигар чизҳои мӯд чизе намедонистем. Ҳар як навсозии барномаро худи таҳиякунанда аз мошини худ баровардааст. Ва агар барои Android ин хеле оддӣ бошад - ҷамъоварӣ, имзошуда .apk
ва онро ба Google Developer Console бор кард, пас барои iOS абзори тақсимоти он вақт тавассути Xcode моро бо шомҳои олӣ гузошт - кӯшишҳои зеркашии бойгонӣ аксар вақт бо хатогиҳо анҷом ёфтанд ва мо маҷбур шудем, ки дубора кӯшиш кунем. Маълум шуд, ки таҳиягари пешрафтатарин дар як моҳ чанд маротиба код наменависад, балки барномаро мебарорад.
Сол 2016
Мо калон шудем, мо аллакай фикр мекардем, ки чӣ гуна таҳиягаронро аз як рӯз барои озод озод кунем ва як барномаи дуюм низ пайдо шуд, ки моро танҳо ба сӯи автоматизатсия тела дод. Дар ҳамон сол, мо бори аввал Ҷенкинсро насб кардем ва як қатор скриптҳои даҳшатнокро навиштем, ки ба онҳое, ки 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 - ҳама линтерҳоро оғоз мекунад ва гузоришҳоро ба 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
.
Ҳоло дар Ҷенкинс шумо метавонед фармонҳои кӯтоҳеро даъват кунед, ки манзараро норавшан намекунанд ва бо чашм ба осонӣ хонда мешаванд:
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy
Ура, мо олӣ ҳастем
Шумо чӣ гирифтед? Фармонҳоро барои ҳар як қадам тоза кунед. Скриптҳои тозашуда, ки дар файлҳои fastlane ба таври дақиқ ҷойгир карда шудаанд. Бо шодӣ, мо ба назди таҳиягарон давида, аз онҳо хоҳиш кардем, ки ҳама чизеро, ки ба онҳо лозим аст, ба анбори худ илова кунанд.
Аммо мо бо гузашти вақт фаҳмидем, ки мо бо ҳамон мушкилот рӯ ба рӯ мешавем - мо то ҳол 20 скрипти монтажӣ дорем, ки ин ё он тарзи ҳаёти худро оғоз мекунанд, таҳрир кардани онҳо душвортар хоҳад буд, зеро скриптҳо ба анборҳо мегузаранд, ва мо ба он ҷо дастрасӣ надоштем. Ва умуман дарди моро ин тавр хал кардан мумкин нест.
Вазифаи №2: як файли ягонаи Fastfile барои N барномаҳо гиред
Ҳоло чунин ба назар мерасад, ки ҳалли мушкилот чандон душвор нест - тағирёбандаҳоро муқаррар кунед ва биёед. Бале, дар асл, ҳамин тавр мушкилот ҳал карда шуд. Аммо дар айни замон, ки мо онро вайрон кардем, мо на дар худи fastlane таҷриба доштем, на дар Руби, ки дар он 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 барои ин ҳалли худро дорад: .env
, .env.default
, .env.development
.
Ва он гоҳ мо тасмим гирифтем, ки ин китобхонаро каме дигар истифода барем. Биёед дар анбори таҳиягарон на скриптҳои fastlane ва иттилооти метаи он, балки калидҳои беназири ин барномаро дар файл ҷойгир кунем. .env.appName
.
Худи худ Fastfile
, Appfile
, Matchfile
и Gymfile
, мо онро дар анбори алохида пинхон кардем. Дар он ҷо як файли иловагӣ бо калидҳои парол аз хидматҳои дигар пинҳон карда шуд - .env
.
Шумо метавонед як мисол дид
Дар 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 насб кунед ва калидҳоро ба анбори таҳиягар илова кунед.
Чунин ба назар мерасад, ки нукта бо Fastfile барои Android ва имзои барнома нофаҳмо боқӣ мемонад, агар мақола ҷолиб бошад, ман идома медиҳам. Ман аз дидани саволҳо ё пешниҳодҳои шумо "шумо ин мушкилотро чӣ гуна ҳал мекардед" дар шарҳҳо ё дар Telegram хурсанд мешавам
Манбаъ: will.com