
Es vēlētos runāt par nepārtrauktu integrāciju un mobilo lietotņu piegādi, izmantojot fastlane. Kā mēs ieviešam CI/CD visās mobilajās lietojumprogrammās, kā mēs tur nokļuvām un kas notika beigās.
Tīklā jau ir pietiekami daudz materiāla par rīku, kura mums tik ļoti pietrūka sākumā, tāpēc es apzināti neaprakstīšu rīku sīkāk, bet atsaukšos tikai uz to, kas mums bija toreiz:
Raksts sastāv no divām daļām:
- Mobilā CI/CD parādīšanās uzņēmumā fons
- Tehniskais risinājums CI/CD ieviešanai N-lietojumprogrammām
Pirmā daļa ir vairāk nostalģija pēc vecajiem laikiem, bet otrā ir pieredze, ko varat attiecināt uz sevi.
Tā tas notika vēsturiski
Gads 2015
Mēs tikko sākām izstrādāt mobilās aplikācijas, tad neko nezinājām par nepārtrauktu integrāciju, par DevOps un citām modernām lietām. Katru lietojumprogrammas atjauninājumu no savas mašīnas izlaida pats izstrādātājs. Un, ja operētājsistēmai Android tas ir pavisam vienkārši - salikts, parakstīts .apk un augšupielādēja to Google Developer Console, tad iOS toreizējais izplatīšanas rīks, izmantojot Xcode, mums atstāja lieliskus vakarus - mēģinājumi lejupielādēt arhīvu bieži beidzās ar kļūdām, un mums bija jāmēģina vēlreiz. Izrādījās, ka progresīvākais izstrādātājs vairākas reizes mēnesī neraksta kodu, bet gan izlaiž aplikāciju.
Gads 2016
Mēs izaugām, mums jau bija domas par to, kā atbrīvot izstrādātājus no veselas dienas izlaišanai, un parādījās arī otra aplikācija, kas mūs tikai vairāk virzīja uz automatizāciju. Tajā pašā gadā mēs pirmo reizi instalējām Jenkins un uzrakstījām virkni biedējošu skriptu, kas ir ļoti līdzīgi tiem, ko fastlane parāda savā dokumentācijā.
$ 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 "appleId@example.com"
-p "PASS_APPLE_ID"Diemžēl līdz šim tikai mūsu izstrādātāji zināja, kā šie skripti darbojas un kāpēc ir vajadzīga šī nebeidzamā atslēgu kaudze, un, kad atkal kaut kas sabojājās, viņi saņēma “skaistos vakarus” žurnālu analīzei.
Gads 2017
Šogad mēs uzzinājām, ka ir tāda lieta kā fastlane. Nebija tik daudz informācijas kā tagad – kā tādu iesākt, kā to izmantot. Un pats rīks tajā laikā vēl bija neapstrādāts: pastāvīgās kļūdas mūs tikai sarūgtināja, un bija grūti noticēt maģiskajai automatizācijai, ko viņi solīja.
Tomēr galvenās utilītas, kas iekļautas fastlane kodolā, ir gym и pilot, mums izdevās to sākt.
Mūsu skripti ir nedaudz uzlaboti.
$ fastlane gym —-workspace "Example.xcworkspace"
--scheme "AppName"
—-buildlog_path "/tmp"
-—cleanTie ir uzlaboti, kaut vai tāpēc, ka nav visi nepieciešamie parametri xcodebuild, jums jānorāda - gym patstāvīgi sapratīs, kur un kas atrodas. Lai veiktu precīzāku noregulējumu, varat norādīt tos pašus taustiņus, kas norādīti xcodebuild, skaidrāks ir tikai taustiņu nosaukumi.
Šoreiz, pateicoties sporta zālei un iebūvētajam xcpretty formatētājam, būvniecības žurnāli ir kļuvuši daudz salasāmāki. Tas sāka ietaupīt laiku, lai salabotu bojātus mezglus, un dažreiz atbrīvošanas komanda to varēja izdomāt pati.
Diemžēl montāžas ātruma mērījumi xcodebuild и gym Mēs to nedarījām, taču uzticēsimies dokumentācijai — līdz pat 30% paātrinājums.
Viens process visiem lietojumiem
2018. gads un tagadne
Līdz 2018. gadam lietojumprogrammu izveides un izlaišanas process pilnībā pārcēlās uz Jenkins, izstrādātāji pārtrauca izlaišanu no savām iekārtām, un tikai izlaišanas komandai bija tiesības izlaist.
Mēs jau vēlējāmies uzlabot testu un statiskās analīzes palaišanu, un mūsu skripti auga un auga. Auga un mainījās kopā ar mūsu lietojumprogrammām. Tobrīd bija ap 10 aplikāciju.Ņemot vērā, ka mums ir divas platformas, tie ir aptuveni 20 “dzīvi” skripti.
Katru reizi, kad vēlējāmies skriptam pievienot jaunu darbību, mums bija jākopē un jāielīmē daļas visos čaulas skriptos. Varbūt varējām strādāt rūpīgāk, taču bieži šādas izmaiņas beidzās ar drukas kļūdām, kas izvērtās par vakariem, kad izlaiduma komanda laboja skriptus un noskaidroja, kurš gudrais puisis pievienoja šo komandu un ko tā patiesībā dara. Kopumā nevar teikt, ka vienas platformas montāžas skripti bija vismaz kaut cik līdzīgi. Lai gan viņi noteikti darīja to pašu.
Lai sāktu jaunas lietojumprogrammas procesu, bija jāpavada diena, lai atlasītu šo skriptu “svaigu” versiju, to atkļūdotu un pateiktu, ka “jā, tas darbojas”.
2018. gada vasarā atkal skatījāmies uz joprojām attīstošo fastlane.
1. uzdevums: apkopojiet visas skripta darbības un pārrakstiet tās Fastfile
Kad mēs sākām, mūsu skripti izskatījās kā kāju lupatiņa, kas sastāv no visiem soļiem un kruķiem vienā apvalka skriptā Dženkinsā. Mēs vēl neesam pārgājuši uz cauruļvadu un sadalīšanu pa posmiem.
Mēs apskatījām to, kas mums ir, un noteicām 4 darbības, kas atbilst mūsu CI/CD aprakstam:
- būvēt - atkarību instalēšana, arhīva komplektēšana,
- tests — izstrādātāju vienības testu izpilde, pārklājuma aprēķināšana,
- hidrolokators — palaiž visas līnijsistēmas un nosūta ziņojumus SonarQube,
- izvietot — artefakta nosūtīšana uz alfa (TestFlight).
Un, ja neiedziļināsities detaļās, izlaižot darbībās izmantotos taustiņus, jūs iegūsit šo 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
endFaktiski mūsu pirmais Fastfile izrādījās briesmīgs, ņemot vērā dažus mums joprojām nepieciešamos kruķus un aizstāto parametru skaitu:
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: "appleId@example.com",
app_identifier: "com.example.app",
dev_portal_team_id: "TEAM_ID_NUMBER_DEV",
team_id: "ITS_TEAM_ID")
endIepriekš minētajā piemērā norādīta tikai daļa no parametriem, kas mums jānorāda: tie ir būvēšanas parametri — shēma, konfigurācija, nodrošinājuma profila nosaukumi, kā arī izplatīšanas parametri — izstrādātāja konta Apple ID, parole, lietojumprogrammas ID utt. ieslēgts. Kā pirmo tuvinājumu mēs visas šīs atslēgas ievietojam īpašos failos - Gymfile, Matchfile и Appfile.
Tagad Dženkinsā varat izsaukt īsas komandas, kas neaizmiglo skatu un ir viegli salasāmas ar aci:
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deployUrā, mēs esam lieliski
Ko tu dabūji? Skaidras komandas katram solim. Iztīrīti skripti, glīti sakārtoti fastlane failos. Priecādamies skrējām pie izstrādātājiem, lūdzot pievienot visu nepieciešamo viņu krātuvēm.
Bet mēs laikus sapratām, ka saskarsimies ar tām pašām grūtībām - mums joprojām būs 20 montāžas skripti, kas tā vai citādi sāks dzīvot paši, tos rediģēt būs grūtāk, jo skripti pārcelsies uz krātuvēm, un mums tur nebija piekļuves. Un vispār mūsu sāpes tā atrisināt nebūs iespējams.

2. uzdevums: iegūstiet vienu Fastfile N lietojumprogrammām
Tagad šķiet, ka problēmas risināšana nemaz nav tik grūta – iestati mainīgos, un ejam. Jā, patiesībā tā problēma tika atrisināta. Bet tajā brīdī, kad mēs to saskrūvējām, mums nebija ne kompetences par pašu fastlane, ne Ruby, kurā rakstīts fastlane, ne arī noderīgu piemēru tīklā - visi, kas toreiz rakstīja par fastlane, aprobežojās ar piemēru vienai lietojumprogrammai. viens izstrādātājs.
Fastlane var apstrādāt vides mainīgos, un mēs to jau esam izmēģinājuši, iestatot Keychain paroli:
ENV['KEYCHAIN_PASSWORD']Pēc mūsu skriptu apskatīšanas mēs identificējām kopīgās daļas:
#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
APPLE_ID=appleID@example.com
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789Tagad, lai sāktu lietot šīs atslēgas fastlane failos, mums bija jāizdomā, kā tās tur nogādāt. Fastlane tam ir risinājums: . Dokumentācijā teikts, ka, ja jums ir svarīgi ielādēt atslēgas dažādiem mērķiem, izveidojiet vairākus konfigurācijas failus fastlane direktorijā .env, .env.default, .env.development.
Un tad mēs nolēmām izmantot šo bibliotēku nedaudz savādāk. Izstrādātāju repozitorijā ievietosim nevis fastlane skriptus un to metainformāciju, bet gan šīs lietojumprogrammas unikālās atslēgas failā .env.appName.
Paši Fastfile, Appfile, Matchfile и Gymfile, mēs to paslēpām atsevišķā repozitorijā. Tur tika paslēpts papildu fails ar paroles atslēgām no citiem pakalpojumiem - .env.
Jūs varat redzēt piemēru .

CI tīklā zvans nav īpaši mainījies; ir pievienota noteiktas lietojumprogrammas konfigurācijas atslēga:
# 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 appNamePirms komandu palaišanas mēs ielādējam mūsu repozitoriju ar skriptiem. Neizskatās tik jauki:
git clone git@repository.com/FastlaneCICD.git fastlane_temp
cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.envPagaidām atstāja šo risinājumu, lai gan Fastlane ir risinājums Fastfile lejupielādei, izmantojot import_from_git, taču tas darbojas tikai Fastfile, bet ne citiem failiem. Ja vēlaties "patiešām skaistu", varat rakstīt savu action.
Līdzīgs komplekts tika izveidots Android lietojumprogrammām un ReactNative, faili atrodas vienā repozitorijā, bet dažādās filiālēs iOS, android и react_native.
Kad izlaiduma komanda vēlas pievienot kādu jaunu soli, izmaiņas skriptā tiek ierakstītas caur MR iekšā git, vairs nav jāmeklē skriptu lūšanas vaininieki un vispār tagad jāmēģina to lauzt.
Tagad tas ir noteikti
Iepriekš mēs pavadījām laiku visu skriptu uzturēšanai, to atjaunināšanai un visu atjaunināšanas seku novēršanai. Tas bija ļoti neapmierinoši, kad kļūdu un dīkstāves iemesli laidienos bija vienkāršas drukas kļūdas, kurām bija tik grūti izsekot čaulas skriptu jucekliem. Tagad šādas kļūdas ir samazinātas līdz minimumam. Izmaiņas tiek ieviestas visās lietojumprogrammās vienlaikus. Un jaunas lietojumprogrammas ieviešana procesā aizņem 15 minūtes — izveidojiet veidnes konveijeru CI un pievienojiet atslēgas izstrādātāja repozitorijai.
Šķiet, ka jēga ar Fastfile for Android un aplikācijas parakstu paliek neizskaidrota, ja raksts būs interesants, rakstīšu turpinājumu. Priecāšos redzēt jūsu jautājumus vai ieteikumus “kā jūs atrisinātu šo problēmu” komentāros vai Telegram .
Avots: www.habr.com
