Mobil CICD təcrübəsi: bir çox mobil proqramlar üçün bir sürətli standart

Mobil CICD təcrübəsi: bir çox mobil proqramlar üçün bir sürətli standart
Fastlane istifadə edərək mobil proqramlar üçün davamlı inteqrasiya və çatdırılma haqqında danışmaq istərdim. Bütün mobil proqramlarda CI/CD-ni necə tətbiq edirik, oraya necə çatdıq və sonda nə oldu.

Alətdə şəbəkədə artıq kifayət qədər material var ki, bizdə əvvəldən çatışmırdı, ona görə də mən qəsdən aləti ətraflı təsvir etməyəcəm, ancaq o zaman əldə etdiklərimizə istinad edəcəyəm:

Məqalə iki hissədən ibarətdir:

  • Şirkətdə mobil CI/CD-nin yaranmasının fonu
  • N-proqramlar üçün CI/CD-nin yayılması üçün texniki həll

Birinci hissə daha çox köhnə günlərin nostaljisi, ikincisi isə özünüzə tətbiq edə biləcəyiniz bir təcrübədir.

Tarixən belə olub

İl 2015

Biz yenicə mobil proqramlar hazırlamağa başladıq, sonra davamlı inteqrasiya, DevOps və digər dəbli şeylər haqqında heç nə bilmirdik. Tətbiqin hər bir yeniləməsi tərtibatçının özü tərəfindən öz maşınından hazırlanmışdır. Və Android üçün bu olduqca sadədirsə - yığılmış, imzalanmışdır .apk və onu Google Developer Console-a yüklədik, sonra iOS üçün o zaman Xcode vasitəsilə paylama aləti bizi gözəl axşamlarla tərk etdi - arxivi yükləmək cəhdləri çox vaxt xətalarla başa çatdı və biz yenidən cəhd etməli olduq. Məlum oldu ki, ən qabaqcıl tərtibatçı ayda bir neçə dəfə kod yazmır, əksinə tətbiqi buraxır.

İl 2016

Böyüdük, bir buraxılış üçün bütün gün ərzində tərtibatçıları necə azad etmək barədə fikirlərimiz var idi və ikinci bir tətbiq də ortaya çıxdı, bu da bizi daha çox avtomatlaşdırmaya sövq etdi. Elə həmin il biz Jenkins-i ilk dəfə quraşdırdıq və fastlane-in sənədlərində göstərdiyinə çox oxşar olan bir dəstə qorxulu skript yazdıq.

$ 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"

Təəssüf ki, indiyə qədər yalnız tərtibatçılarımız bu skriptlərin necə işlədiyini və bu sonsuz düymələr yığınının nə üçün lazım olduğunu bilirdilər və bir şey yenidən pozulduqda, qeydləri təhlil etmək üçün "gözəl axşamlar" əldə etdilər.

İl 2017

Bu il öyrəndik ki, fastlane kimi bir şey var. İndiki qədər çox məlumat yox idi - birini necə başlamaq, necə istifadə etmək. Və alətin özü o dövrdə hələ də kobud idi: daimi səhvlər bizi yalnız məyus etdi və onların vəd etdikləri sehrli avtomatlaşdırmaya inanmaq çətin idi.

Bununla belə, fastlane nüvəsinə daxil olan əsas kommunal xidmətlərdir gym и pilot, başlamağa müvəffəq olduq.

Ssenarilərimiz bir az təkmilləşdi.

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

Bütün parametrlər lazım olmadığı üçün onlar təkmilləşdirilmişdir xcodebuild, qeyd etməlisiniz - gym harada və nəyin olduğunu müstəqil şəkildə anlayacaq. Və daha dəqiq tənzimləmə üçün, ilə eyni düymələri təyin edə bilərsiniz xcodebuild, yalnız düymələrin adlandırılması daha aydındır.

Bu dəfə idman zalı və quraşdırılmış xcpretty formatlayıcısı sayəsində qurma qeydləri daha oxunaqlı oldu. Bu, pozulmuş montajları düzəltməyə vaxta qənaət etməyə başladı və bəzən buraxılış qrupu bunu özləri anlaya bilirdilər.

Təəssüf ki, montaj sürətinin ölçülməsi xcodebuild и gym Biz bunu etmədik, lakin sənədlərə etibar edəcəyik - 30%-ə qədər sürətləndirmə.

Bütün tətbiqlər üçün vahid proses

2018 və indiki il

2018-ci ilə qədər proqramların qurulması və yayılması prosesi tamamilə Jenkins-ə keçdi, tərtibatçılar maşınlarından buraxmağı dayandırdılar və yalnız buraxılış komandası buraxmaq hüququna sahib idi.

Biz artıq testlərin və statik analizlərin işə salınmasını təkmilləşdirmək istəyirdik və skriptlərimiz böyüdü və böyüdü. Tətbiqlərimizlə birlikdə böyüdü və dəyişdi. O vaxt iki platformamız olduğunu nəzərə alsaq, təxminən 10 "canlı" skript var idi.

Hər dəfə skriptə yeni bir addım əlavə etmək istədikdə parçaları bütün shell skriptlərinə kopyalayıb yapışdırmalı olurduq. Ola bilsin ki, biz daha diqqətlə işləyə bilərdik, lakin tez-tez bu cür dəyişikliklər yazı səhvləri ilə başa çatırdı, bu, buraxılış komandasının skriptləri düzəltmək və hansı ağıllı adamın bu əmri əlavə etdiyini və əslində nə etdiyini öyrənmək üçün axşamlara çevrildi. Ümumiyyətlə, bir platforma üçün montaj skriptlərinin ən azı bir qədər oxşar olduğunu söyləmək olmaz. Baxmayaraq ki, onlar mütləq eyni şeyi etdilər.

Yeni tətbiqetmə prosesinə başlamaq üçün bu skriptlərin “təzə” versiyasını seçmək, onu sazlamaq və “bəli, işləyir” demək üçün bir gün sərf etmək lazım idi.

2018-ci ilin yayında biz bir daha inkişaf etməkdə olan fastlane istiqamətinə baxdıq.

Tapşırıq №1: bütün skript addımlarını ümumiləşdirin və onları Fastfile-də yenidən yazın

Başladığımız zaman, skriptlərimiz Jenkins-də bir qabıq skriptində bütün addımlardan və qoltuqlardan ibarət ayaq örtüyü kimi görünürdü. Biz hələ boru kəmərinə və mərhələ-mərhələ bölünməyə keçməmişik.

Biz əlimizdə olanlara baxdıq və CI/CD-mizin təsvirinə uyğun 4 addım müəyyən etdik:

  • qurmaq - asılılıqların quraşdırılması, arxivin yığılması,
  • test - inkişaf etdirici vahid testlərini həyata keçirmək, əhatə dairəsini hesablamaq,
  • sonar - bütün linterləri işə salır və SonarQube-ə hesabat göndərir,
  • deploy — artefaktın alfaya göndərilməsi (TestFlight).

Təfərrüatlara girməsəniz, hərəkətlərdə istifadə olunan düymələri buraxsanız, bu Fastfile əldə edəcəksiniz:

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

Əslində, hələ də ehtiyac duyduğumuz bəzi qoltuqağaqları və əvəz etdiyimiz parametrlərin sayını nəzərə alaraq, ilk Fastfile-imiz dəhşətli oldu:

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

Yuxarıdakı misalda, parametrlərin yalnız bir hissəsini göstərməliyik: bunlar qurma parametrləridir - sxem, konfiqurasiya, Təminat profili adları, həmçinin paylama parametrləri - inkişaf etdirici hesabının Apple ID-si, parol, proqram ID-si və s. haqqında. İlk təxmin olaraq, bütün bu açarları xüsusi fayllara qoyuruq - Gymfile, Matchfile и Appfile.

İndi Jenkins-də görünüşü bulanıq etməyən və gözlə asanlıqla oxunan qısa əmrlərə zəng edə bilərsiniz:

# fastlane ios <lane_name>

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

Hurray, biz əlayıq

Nə aldınız? Hər addım üçün əmrləri təmizləyin. Təmizlənmiş skriptlər, fastlane fayllarında səliqə ilə düzülmüşdür. Sevinərək, tərtibatçıların yanına qaçdıq və onlardan lazım olan hər şeyi öz depolarına əlavə etmələrini xahiş etdik.

Ancaq zamanla başa düşdük ki, eyni çətinliklərlə qarşılaşacağıq - hələ də bu və ya digər şəkildə öz həyatlarını yaşamağa başlayacaq 20 montaj skriptimiz olacaq, onları redaktə etmək daha çətin olacaq, çünki skriptlər depolara keçəcək, və bizim oraya çıxışımız yox idi. Və ümumiyyətlə, dərdimizi bu yolla həll etmək mümkün olmayacaq.

Mobil CICD təcrübəsi: bir çox mobil proqramlar üçün bir sürətli standart

Tapşırıq №2: N proqram üçün tək Fastfile əldə edin

İndi deyəsən problemi həll etmək o qədər də çətin deyil - dəyişənləri təyin edin və gedək. Bəli, əslində problem belə həll olundu. Amma biz onu sındırdığımız anda nə fastlane-in özündə, nə də fastlane-in yazıldığı Ruby-də təcrübəmiz var idi, nə də şəbəkədə faydalı nümunələr - o zaman fastlane haqqında yazan hər kəs bir ərizə üçün bir nümunə ilə məhdudlaşırdı. bir inkişaf etdirici.

Fastlane mühit dəyişənlərini idarə edə bilər və biz artıq Anahtarlık parolunu təyin etməklə bunu sınamışıq:

ENV['KEYCHAIN_PASSWORD']

Skriptlərimizə baxdıqdan sonra ümumi hissələri müəyyən etdik:

#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

İndi bu açarları fastlane fayllarında istifadə etməyə başlamaq üçün onları oraya necə çatdıracağımızı anlamalı olduq. Fastlane-in bunun üçün bir həlli var: dotenv vasitəsilə dəyişənlərin yüklənməsi. Sənədlərdə deyilir ki, açarları müxtəlif məqsədlər üçün yükləmək sizin üçün vacibdirsə, fastlane qovluğunda bir neçə konfiqurasiya faylı yaradın. .env, .env.default, .env.development.

Və sonra biz bu kitabxanadan bir az fərqli istifadə etmək qərarına gəldik. Gəlin tərtibatçıların repozitoriyasına fastlane skriptlərini və onun meta məlumatlarını deyil, faylda bu tətbiqin unikal açarlarını yerləşdirək. .env.appName.

Özləri Fastfile, Appfile, Matchfile и Gymfile, biz onu ayrı bir depoda gizlətdik. Orada digər xidmətlərdən parol açarları olan əlavə bir fayl gizləndi - .env.
Bir nümunə görə bilərsiniz burada.

Mobil CICD təcrübəsi: bir çox mobil proqramlar üçün bir sürətli standart

CI-də zəng çox dəyişməyib, xüsusi proqram üçün konfiqurasiya açarı əlavə edilib:

# 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

Əmrləri işə salmazdan əvvəl biz depomuzu skriptlərlə yükləyirik. O qədər də gözəl görünmür:

git clone [email protected]/FastlaneCICD.git fastlane_temp

cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.env

Fastlane vasitəsilə Fastfile yükləmək üçün həll yolu olsa da, bu həlli hələlik tərk etdi fəaliyyət import_from_git, lakin o, yalnız Fastfile üçün işləyir, digər fayllar üçün deyil. "Həqiqətən gözəl" istəyirsinizsə, özünüz yaza bilərsiniz action.

Bənzər bir dəst Android proqramları və ReactNative üçün hazırlanmışdır, fayllar eyni depodadır, lakin müxtəlif filiallardadır. iOS, android и react_native.

Buraxılış komandası yeni bir addım əlavə etmək istədikdə, skriptdəki dəyişikliklər git-də MR vasitəsilə qeydə alınır, artıq pozulmuş skriptlərin günahkarlarını axtarmağa ehtiyac yoxdur və ümumiyyətlə, indi onu pozmağa çalışmaq lazımdır.

İndi bu mütləqdir

Əvvəllər biz bütün skriptləri saxlamağa, onları yeniləməyə və yeniləmələrin bütün nəticələrini düzəltməyə vaxt sərf edirdik. Səhvlərin və buraxılışlarda dayanma müddətinin səbəbləri qabıq skriptlərinin qarışıqlığında izləmək çox çətin olan sadə yazı xətləri olduqda çox məyusedici idi. İndi belə səhvlər minimuma endirilib. Dəyişikliklər bir anda bütün tətbiqlərə yayılır. Prosesə yeni bir tətbiqin qoyulması 15 dəqiqə çəkir - CI-də şablon kəməri qurun və açarları tərtibatçının deposuna əlavə edin.

Deyəsən, Fastfile for Android və proqram imzası ilə bağlı məqam açıqlanmır, əgər məqalə maraqlıdırsa, davamını yazacam; "Bu problemi necə həll edərdiniz" suallarınızı və ya təkliflərinizi şərhlərdə və ya Telegramda görməkdən şad olaram başkirova.

Mənbə: www.habr.com

Добавить комментарий