ProHoster > Blog > İdarə > 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:
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.
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.
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:
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:
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.
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.
CI-də zəng çox dəyişməyib, xüsusi proqram üçün konfiqurasiya açarı əlavə edilib:
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ətimport_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.