Мобилдик CICD тажрыйбасы: көптөгөн мобилдик тиркемелер үчүн бир ылдам стандарт

Мобилдик CICD тажрыйбасы: көптөгөн мобилдик тиркемелер үчүн бир ылдам стандарт
Мен fastlane аркылуу мобилдик колдонмолор үчүн үзгүлтүксүз интеграция жана жеткирүү жөнүндө айткым келет. Бардык мобилдик тиркемелерде CI/CDди кантип ишке ашырабыз, ал жерге кантип жеттик жана аягында эмне болду.

Тармакта куралда жетиштүү материал бар, ага биз башында жетишпей калганбыз, ошондуктан мен атайын куралды майда-чүйдөсүнө чейин сүрөттөбөйм, бирок бизде болгон нерселерге гана кайрылам:

Макала эки бөлүктөн турат:

  • Компанияда мобилдик CI/CDдин пайда болушуна негиздер
  • N-тиркемелер үчүн CI/CD чыгаруу үчүн техникалык чечим

Биринчи бөлүгү эски күндөр үчүн көбүрөөк ностальгия, ал эми экинчиси өзүңүзгө колдоно турган тажрыйба.

Тарыхый жактан ушундай болгон

жыл 2015

Биз жаңы эле мобилдик тиркемелерди иштеп чыга баштадык, андан кийин үзгүлтүксүз интеграция, DevOps жана башка модалуу нерселер жөнүндө эч нерсе билген эмеспиз. Ар бир тиркеменин жаңыртылышын иштеп чыгуучу өзү өзүнүн машинасынан чыгарган. Ал эми Android үчүн бул абдан жөнөкөй болсо - чогултулган, кол коюлган .apk жана аны Google Иштеп чыгуучу Консолуна жүктөдү, андан кийин 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 өзөгүнө киргизилген негизги коммуналдык болуп саналат gym и pilot, биз аны баштоого жетиштик.

Сценарийлерибиз бир аз жакшыртылды.

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

Алар жакшыртылган, анткени бардык зарыл болгон параметрлер жок xcodebuild, көрсөтүү керек - gym кайда жана эмне экенин өз алдынча түшүнөт. Жана дагы жакшыраак жөндөө үчүн, сиз ошол эле баскычтарды көрсөтсөңүз болот xcodebuild, баскычтардын аталышы гана айкыныраак.

Бул жолу, спорт залдын жана орнотулган xcpretty форматтоочунун аркасында, куруу журналдары бир топ түшүнүктүү болуп калды. Бул бузулган жыйындарды оңдоого убакытты үнөмдөй баштады, кээде релиз тобу муну өз алдынча чече алган.

Тилекке каршы, чогултуу ылдамдыгы өлчөө xcodebuild и gym Биз муну кылган жокпуз, бирок биз документтерге ишенебиз - 30% га чейин ылдамдык.

Бардык колдонмолор үчүн бирдиктүү процесс

2018-жыл жана азыркы учур

2018-жылга карата тиркемелерди куруу жана жайылтуу процесси толугу менен Дженкинске өттү, иштеп чыгуучулар машиналарынан чыгарууну токтотушту жана чыгаруу тобу гана чыгарууга укуктуу.

Биз буга чейин эле тесттерди жана статикалык анализди ишке киргизүүнү жакшырткыбыз келген жана скрипттерибиз өсүп, өскөн. Биздин колдонмолор менен бирге өсүп, өзгөрдү. Ал убакта бизде эки платформа бар экенин эске алганда, 10га жакын "тирүү" скрипттер бар.

Скриптке жаңы кадам кошкубуз келген сайын, бөлүктөрүн бардык кабык скрипттерине көчүрүп чапташыбыз керек болчу. Балким, биз кылдаттык менен иштей алмакпыз, бирок көп учурда мындай өзгөртүүлөр каталар менен аяктады, алар релиз тобу үчүн скрипттерди оңдоп, кайсы акылдуу жигит бул буйрукту кошконун жана ал эмне кылганын билүү үчүн кечке айланган. Жалпысынан алганда, бир платформа үчүн скрипттер, жок эле дегенде, бир аз окшош болгон деп айтууга болбойт. Алар, албетте, бир эле нерсени кылышкан да.

Жаңы тиркеменин жараянын баштоо үчүн, бул скрипттердин "жаңы" версиясын тандап, аны оңдоого жана "ооба, иштейт" деп айтууга бир күн сарптоо керек болчу.

2018-жылдын жайында, биз дагы бир жолу дагы эле өнүгүп келе жаткан фастлейнди карадык.

№1 тапшырма: бардык скрипт кадамдарын жыйынтыктап, аларды Fastfileде кайра жазыңыз

Биз баштаганда, биздин сценарийлер Дженкинстеги бир кабык скриптиндеги бардык кадамдардан жана балдактардан турган бут кийимдей көрүндү. Азырынча куурга жана этап боюнча бөлүүгө өтө элекпиз.

Бизде эмне бар экенин карап чыктык жана CI/CDнин сүрөттөлүшүнө дал келген 4 кадамды аныктадык:

  • куруу - көз карандылыкты орнотуу, архивди чогултуу,
  • тест — иштеп чыгуучу бирдиктин тесттерин жүргүзүү, камтууну эсептөө,
  • 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 тапшырма: N тиркемелери үчүн бир Fastfile алыңыз

Эми маселени чечүү анча деле кыйын эмес окшойт – өзгөрмөлөрдү коюп, анан кетели. Ооба, чындыгында, маселе ушундай чечилди. Бирок биз аны бузуп койгон учурда, бизде fastlane боюнча да, фастлейн жазылган Rubyде да, тармакта пайдалуу мисалдар да болгон эмес - анда 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.

Чыгаруу тобу кандайдыр бир жаңы кадамды кошкусу келгенде, скрипттеги өзгөрүүлөр gitтин MR аркылуу жазылат, бузулган скрипттердин күнөөкөрлөрүн издөөнүн кереги жок, жана жалпысынан, азыр сиз аны бузууга аракет кылышыңыз керек.

Эми бул анык

Буга чейин биз бардык скрипттерди сактоого, аларды жаңылоого жана жаңыртуулардын бардык кесепеттерин оңдоого убакыт коротчубуз. Каталардын жана релиздердин токтоп калышынын себептери жөнөкөй тамга каталары болгондо, абдан капалантты, аларды кабык скрипттеринин башаламандыгына байкоо жүргүзүү абдан кыйын болду. Азыр мындай каталар минимумга чейин кыскарды. Өзгөртүүлөр бир эле учурда бардык колдонмолорго жайылтылат. Жаңы тиркемени процесске киргизүү үчүн 15 мүнөт талап кылынат - CIде шаблон түтүгүн орнотуп, иштеп чыгуучунун репозиторийине ачкычтарды кошуңуз.

Бул Android үчүн Fastfile жана колдонмо кол менен пункту түшүнүксүз бойдон калууда окшойт, макала кызыктуу болсо, мен уландысы жазам; Комментарийлерде же Telegramда "бул көйгөйдү кантип чечет элеңиз" деген суроолоруңузду же сунуштарыңызды көргөнүмө кубанычтамын башкирова.

Source: www.habr.com

Комментарий кошуу