Мобильді CICD тәжірибесі: көптеген мобильді қосымшалар үшін бір жылдам стандарт

Мобильді CICD тәжірибесі: көптеген мобильді қосымшалар үшін бір жылдам стандарт
Мен fastlane көмегімен мобильді қолданбаларды үздіксіз біріктіру және жеткізу туралы айтқым келеді. Біз барлық мобильді қосымшаларда CI/CD қалай енгіземіз, біз оған қалай жеттік және соңында не болды.

Құралда желіде бізге басында жетіспейтін материал жеткілікті, сондықтан мен құралды егжей-тегжейлі сипаттамаймын, тек сол кезде болған нәрсеге сілтеме жасаймын:

Мақала екі бөлімнен тұрады:

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

Бірінші бөлім - ескі күндерге деген сағыныш, ал екіншісі - өзіңізге қолдануға болатын тәжірибе.

Тарихи түрде солай болды

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 өзегіне кіретін негізгі утилиталар болып табылады 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 файлында қайта жазыңыз

Біз бастаған кезде, біздің сценарийлер Дженкинстегі бір қабық сценарийіндегі барлық қадамдар мен балдақтардан тұратын аяқ киім сияқты көрінді. Құбырға, кезең-кезеңге бөлуге әлі өткен жоқпыз.

Бізде бар нәрселерді қарап шықтық және CI/CD сипаттамасына сәйкес келетін 4 қадамды анықтадық:

  • құрастыру - тәуелділіктерді орнату, мұрағатты жинау,
  • тест — әзірлеуші ​​блогының сынақтарын жүргізу, қамтуды есептеу,
  • sonar - барлық линтерлерді іске қосады және есептерді SonarQube-ге жібереді,
  • deploy — артефактты альфаға жіберу (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 идентификаторы, құпия сөз, қолданба идентификаторы және т.б. қосулы. Бірінші жуықтау ретінде біз барлық осы кілттерді арнайы файлдарға орналастырамыз - Gymfile, Matchfile и Appfile.

Енді Дженкинсте көріністі бұлдыратпайтын және көзбен оңай оқуға болатын қысқа командаларды шақыруға болады:

# fastlane ios <lane_name>

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

Ура, біз кереметпіз

Сіз не алдыңыз? Әрбір қадам үшін пәрмендерді тазалаңыз. Тазаланған сценарийлер, жылдам файлдарда ұқыпты орналастырылған. Қуанып, біз әзірлеушілерге жүгіріп барып, олардан репозиторийлеріне қажеттінің бәрін қосуды өтіндік.

Бірақ уақыт өте келе біз дәл осындай қиындықтарға тап болатынымызды түсіндік - бізде әлі де 20 құрастыру сценарийі болады, олар бір жолмен немесе басқаша өз өмірлерін сүре бастайды, оларды өңдеу қиынырақ болар еді, өйткені сценарийлер репозиторийлерге ауысады, және ол жерге біздің қолымыз жетпеді. Ал, жалпы, біздің дертімізді бұлай шешу мүмкін емес.

Мобильді CICD тәжірибесі: көптеген мобильді қосымшалар үшін бір жылдам стандарт

№2 тапсырма: N қолданбаларға арналған жалғыз Fastfile алыңыз

Енді мәселені шешу соншалықты қиын емес сияқты - айнымалы мәндерді орнатыңыз, ал кеттік. Иә, шын мәнінде, мәселе осылай шешілді. Бірақ біз оны бұрмалаған сәтте бізде фастлейннің өзінде де, фастлейн жазылған 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-де бұл үшін шешім бар: dotenv арқылы айнымалы мәндерді жүктеу. Құжаттама әртүрлі мақсаттарға арналған кілттерді жүктеу маңызды болса, fastlane каталогында бірнеше конфигурация файлдарын жасаңыз. .env, .env.default, .env.development.

Содан кейін біз бұл кітапхананы басқаша пайдалануды шештік. Әзірлеушілердің репозиторийіне жылдам сценарийлер мен оның мета ақпаратын емес, файлдағы осы қолданбаның бірегей кілттерін орналастырайық. .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-да «бұл мәселені қалай шешер едіңіз» деген сұрақтарыңызды немесе ұсыныстарыңызды көруге қуаныштымын. башкирова.

Ақпарат көзі: www.habr.com

пікір қалдыру