Таҷрибаи мобилии CICD: як стандарти фаврӣ барои бисёре аз барномаҳои мобилӣ

Таҷрибаи мобилии CICD: як стандарти фаврӣ барои бисёре аз барномаҳои мобилӣ
Ман мехоҳам дар бораи ҳамгироӣ ва интиқоли пайваста барои барномаҳои мобилӣ бо истифода аз fastlane сӯҳбат кунам. Чӣ тавр мо CI/CD-ро дар ҳама замимаҳои мобилӣ татбиқ мекунем, чӣ гуна мо ба он ҷо расидем ва дар ниҳоят чӣ рӯй дод.

Дар шабака дар асбоб аллакай маводи кофӣ мавҷуд аст, ки мо дар ибтидо он қадар намерасидем, аз ин рӯ ман дидаву дониста асбобро ба таври муфассал тавсиф намекунам, балки танҳо ба он чизе ки он вақт доштем, ишора мекунам:

Мақола аз ду қисм иборат аст:

  • Замина ба пайдоиши 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 скрипти монтажӣ дорем, ки ин ё он тарзи ҳаёти худро оғоз мекунанд, таҳрир кардани онҳо душвортар хоҳад буд, зеро скриптҳо ба анборҳо мегузаранд, ва мо ба он ҷо дастрасӣ надоштем. Ва умуман дарди моро ин тавр хал кардан мумкин нест.

Таҷрибаи мобилии CICD: як стандарти фаврӣ барои бисёре аз барномаҳои мобилӣ

Вазифаи №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 барои ин ҳалли худро дорад: боркунии тағирёбандаҳо тавассути 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 насб кунед ва калидҳоро ба анбори таҳиягар илова кунед.

Чунин ба назар мерасад, ки нукта бо Fastfile барои Android ва имзои барнома нофаҳмо боқӣ мемонад, агар мақола ҷолиб бошад, ман идома медиҳам. Ман аз дидани саволҳо ё пешниҳодҳои шумо "шумо ин мушкилотро чӣ гуна ҳал мекардед" дар шарҳҳо ё дар Telegram хурсанд мешавам башкирова.

Манбаъ: will.com

Илова Эзоҳ