ΠžΠΏΡ‹Ρ‚ мобильного CICD: ΠΎΠ΄ΠΈΠ½ стандарт fastlane Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠžΠΏΡ‹Ρ‚ мобильного CICD: ΠΎΠ΄ΠΈΠ½ стандарт fastlane Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
Π― Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΈ доставкС для ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fastlane. Как ΠΌΡ‹ внСдряСм CI/CD Π½Π° всС ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΊ этому шли ΠΈ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π² ΠΈΡ‚ΠΎΠ³Π΅.

Π’ сСти ΡƒΠΆΠ΅ достаточно ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΠΏΠΎ инструмСнту, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π»ΠΎ Π½Π°ΠΌ Π½Π° стартС, поэтому я Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ инструмСнт, Π° лишь сошлюсь Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Ρƒ нас Ρ‚ΠΎΠ³Π΄Π°:

Π‘Ρ‚Π°Ρ‚ΡŒΡ состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

  • ΠŸΡ€Π΅Π΄Ρ‹ΡΡ‚ΠΎΡ€ΠΈΡ появлСния мобильного CI/CD Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ
  • ВСхничСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ раскатки CI/CD Π½Π° N-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ β€” большС Π½ΠΎΡΡ‚Π°Π»ΡŒΠ³ΠΈΡ ΠΏΠΎ Π±Ρ‹Π»Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π°ΠΌ, Π° вторая ΠΆΠ΅ β€” ΠΎΠΏΡ‹Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρƒ сСбя.

Π’Π°ΠΊ историчСски слоТилось

Π“ΠΎΠ΄ 2015

ΠœΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡Π°Π»ΠΈ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ‚ΠΎΠ³Π΄Π° Π΅Ρ‰Π΅ ΠΌΡ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π»ΠΈ ΠΏΡ€ΠΎ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΎ DevOps ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π½Ρ‹Π΅ ΡˆΡ‚ΡƒΠΊΠΈ. КаТдоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ прилоТСния Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹Π²Π°Π» сам Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ со своСй ΠΌΠ°ΡˆΠΈΠ½Ρ‹. И Ссли для Android это достаточно просто β€” собрал, подписал .apk ΠΈ Π·Π°ΠΊΠΈΠ½ΡƒΠ» Π² Google Developer Console, Ρ‚ΠΎ для iOS Ρ‚ΠΎΠ³Π΄Π°ΡˆΠ½ΠΈΠΉ инструмСнт дистрибуции Ρ‡Π΅Ρ€Π΅Π· Xcode оставлял Π½Π°ΠΌ ΡˆΠΈΠΊΠ°Ρ€Π½Ρ‹Π΅ Π²Π΅Ρ‡Π΅Ρ€Π° β€” ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π°Ρ€Ρ…ΠΈΠ² часто Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π»ΠΈΡΡŒ ошибками ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Ρ€Π°Π·. ΠŸΠΎΠ»ΡƒΡ‡Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ самый ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ нСсколько Ρ€Π°Π· Π² мСсяц Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΊΠΎΠ΄, Π° занимаСтся Ρ€Π΅Π»ΠΈΠ·ΠΎΠΌ прилоТСния.

Π“ΠΎΠ΄ 2016

ΠœΡ‹ подросли, Π·Π° ΠΏΠ»Π΅Ρ‡Π°ΠΌΠΈ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ мысли ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΡ‚ Ρ†Π΅Π»ΠΎΠ³ΠΎ дня для Ρ€Π΅Π»ΠΈΠ·Π°, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ появилось Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сильнСС нас ΠΏΠΎΠ΄Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΎ ΠΊ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π³ΠΎΠ΄ ΠΌΡ‹ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ поставили Jenkins ΠΈ написали ΠΊΡƒΡ‡ΠΊΡƒ ΡΡ‚Ρ€Π°ΡˆΠ½Π΅Π½ΡŒΠΊΠΈΡ… скриптов, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Π½Π° Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ 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. Π‘Ρ‹Π»ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ сСйчас β€” ΠΊΠ°ΠΊ завСсти, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π”Π° ΠΈ сам инструмСнт Π±Ρ‹Π» Ρ‚ΠΎΠ³Π΄Π° Π΅Ρ‰Π΅ сыроват: постоянныС ошибки, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΠΎΠ²Ρ‹Π²Π°Π»ΠΈ нас ΠΈ Π² Π²ΠΎΠ»ΡˆΠ΅Π±Π½ΡƒΡŽ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΈ ΠΎΠ±Π΅Ρ‰Π°Π»ΠΈ, Π²Π΅Ρ€ΠΈΠ»ΠΎΡΡŒ с Ρ‚Ρ€ΡƒΠ΄ΠΎΠΌ.

Однако основныС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, входящиС Π² ядро fastlane, β€” gym ΠΈ pilot, Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ завСсти.

Наши скрипты Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π»Π°Π³ΠΎΡ€ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ.

$ fastlane gymΒ  β€”-workspace "Example.xcworkspace" 
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  --scheme "AppName" 
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  β€”-buildlog_path "/tmp" 
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  -β€”clean

ΠžΠ±Π»Π°Π³ΠΎΡ€ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ хотя Π±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅ всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для xcodebuild, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ β€” gym ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΉΠΌΠ΅Ρ‚ Π³Π΄Π΅ ΠΈ Ρ‡Ρ‚ΠΎ Π»Π΅ΠΆΠΈΡ‚. А для Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΎΠΉ настройки ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ самыС ΠΊΠ»ΡŽΡ‡ΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ Π² xcodebuild, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΉΠΌΠΈΠ½Π³ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ понятнСС.

На этот Ρ€Π°Π·, благодаря gym ΠΈ встроСнному Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅Ρ€Ρƒ xcpretty, Π»ΠΎΠ³ΠΈ сборки стали Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Ρ‡ΠΈΠ²Π΅Π΅. Π­Ρ‚ΠΎ стало ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя Π½Π° ΠΏΠΎΡ‡ΠΈΠ½ΠΊΡƒ сломанных сборки, Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π² этом ΠΌΠΎΠ³Π»Π° ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Ρ€Π΅Π»ΠΈΠ·-ΠΊΠΎΠΌΠ°Π½Π΄Π°.

К соТалСнию, Π·Π°ΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠΎ скорости сборки xcodebuild ΠΈ gym ΠΌΡ‹ Π½Π΅ сдСлали, Π½ΠΎ Π±ΡƒΠ΄Π΅ΠΌ Π²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ β€” Π΄ΠΎ 30% ускорСния.

Π•Π΄ΠΈΠ½Ρ‹ΠΉ процСсс Π½Π° всС прилоТСния

Π“ΠΎΠ΄ 2018 ΠΈ настоящСС врСмя

К 2018 Π³ΠΎΠ΄Ρƒ сам процСсс сборки ΠΈ Π²Ρ‹ΠΊΠ°Ρ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅Π΅Ρ…Π°Π» Π½Π° Jenkins, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ пСрСстали Ρ€Π΅Π»ΠΈΠ·ΠΈΡ‚ΡŒ со своих машин, ΠΏΡ€Π°Π²ΠΎ Π½Π° Ρ€Π΅Π»ΠΈΠ· ΠΈΠΌΠ΅Π»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π»ΠΈΠ·-ΠΊΠΎΠΌΠ°Π½Π΄Π°.

Нам ΡƒΠΆΠ΅ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π΄ΠΎΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ запуск тСстов ΠΈ статичСский Π°Π½Π°Π»ΠΈΠ·, Π° наши скрипты росли ΠΈ росли. Росли ΠΈ мСнялись вмСстС с нашими прилоТСниями. На Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±Ρ‹Π»ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 10. Учитывая, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρƒ нас Π΄Π²Π΅ — это порядка 20 Β«ΠΆΠΈΠ²ΡƒΡ‰ΠΈΡ…Β» скриптов.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ шаг Π² скрипт, ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡ‚ΠΈΡ‚ΡŒ кусочки Π²ΠΎ всС shell-скрипты. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Π΅Π΅, Π½ΠΎ часто Ρ‚Π°ΠΊΠΈΠ΅ измСнСния Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π»ΠΈΡΡŒ Π² Π²Π΅Ρ‡Π΅Ρ€Π° Ρ€Π΅Π»ΠΈΠ·-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° ΠΏΠΎΡ‡ΠΈΠ½ΠΊΡƒ скриптов ΠΈ выяснСния, ΠΊΡ‚ΠΎ ΠΈΠ· ΡƒΠΌΠ½ΠΈΠΊΠΎΠ² Π΄ΠΎΠ±Π°Π²ΠΈΠ» эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π²ΠΎΠΎΠ±Ρ‰Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. Π’ Ρ†Π΅Π»ΠΎΠΌ, нСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ скрипты для сборки ΠΏΠΎΠ΄ ΠΎΠ΄Π½Ρƒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ Π±Ρ‹Π»ΠΈ Ρ…ΠΎΡ‚ΡŒ сколько-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌΠΈ. Π₯отя бСзусловно Π΄Π΅Π»Π°Π»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠΆΠ΅.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ завСсти процСсс для Π½ΠΎΠ²ΠΎΠ³ΠΎ прилоТСния β€” Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ дСнь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Β«ΡΠ²Π΅ΠΆΡƒΡŽΒ» Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΠ· этих скриптов, ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Β«Π΄Π°, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Β».

Π›Π΅Ρ‚ΠΎΠΌ 2018 ΠΌΡ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· посмотрСли Π² сторону всС Π΅Ρ‰Π΅ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ fastlane.

Π—Π°Π΄Π°Ρ‡Π° β„–1: ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ всС шаги скриптов ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… Π² Fastfile

Когда ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈ, наши скрипты выглядСли портянкой ΠΈΠ· всСх шагов ΠΈ костылСй Π² ΠΎΠ΄Π½ΠΎΠΌ shell-скриптС Π² Jenkins. ΠœΡ‹ Π΅Ρ‰Π΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ Π½Π° pipeline ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ stage.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Π»ΠΈ Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΠ»ΠΈ 4 шага, подходящих ΠΏΠΎΠ΄ описаниС нашСго CI/CD:

  • build β€” установка зависимостСй, сборка Π°Ρ€Ρ…ΠΈΠ²Π°,
  • test β€” запуск unit-тСстов Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, подсчСт покрытия,
  • sonar β€” запуск всСх Π»ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ² ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ² Π² SonarQube,
  • deploy β€” ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° Π² Π°Π»ΡŒΡ„Ρƒ (TestFlight).

И Ссли Π½Π΅ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² подробности, ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ Ρƒ actions, получится Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ 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

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ: это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сборки β€” схСма, конфигурация, названия Provision Profile, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ дистрибуции β€” Apple ID Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прилоТСния ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ, ΠΌΡ‹ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ всС эти ΠΊΠ»ΡŽΡ‡ΠΈ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ β€” Gymfile, Matchfile ΠΈ Appfile.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Jenkins ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ «Π·Π°ΠΌΡ‹Π»ΠΈΠ²Π°ΡŽΡ‚» взгляд ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π³Π»Π°Π·ΠΎΠΌ:

# fastlane ios <lane_name>

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

Π£Ρ€Π°, ΠΌΡ‹ ΠΌΠΎΠ»ΠΎΠ΄Ρ†Ρ‹

Π§Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ? ΠŸΠΎΠ½ΡΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ шага. ΠŸΡ€ΠΈΡ‡Π΅ΡΠ°Π½Π½Ρ‹Π΅ скрипты, Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Ρ‹ fastlane. ΠžΠ±Ρ€Π°Π΄ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ, ΠΌΡ‹ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ±Π΅ΠΆΠ°Π»ΠΈ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ с ΠΏΡ€ΠΎΡΡŒΠ±ΠΎΠΉ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ всС Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π² свои Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Но воврСмя осознали, Ρ‡Ρ‚ΠΎ столкнСмся с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ слоТностями β€” Ρƒ нас всС Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ 20 скриптов сборки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Π½Π°Ρ‡Π½ΡƒΡ‚ ΠΆΠΈΡ‚ΡŒ своСй Тизнью, ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ слоТнСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ скрипты ΠΏΠ΅Ρ€Π΅Π΅Π΄ΡƒΡ‚ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Π° Ρƒ нас доступа Ρ‚ΡƒΠ΄Π° Π½Π΅Ρ‚. И, Π² ΠΎΠ±Ρ‰Π΅ΠΌ, Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ боль Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ получится.

ΠžΠΏΡ‹Ρ‚ мобильного CICD: ΠΎΠ΄ΠΈΠ½ стандарт fastlane Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π° β„–2: ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Fastfile для N-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

БСйчас ΡƒΠΆΠ΅ каТСтся, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ слоТно β€” Π·Π°Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈ ΠΏΠΎΠ΅Ρ…Π°Π»ΠΈ. Π”Π°, собствСнно, Ρ‚Π°ΠΊ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ. Но Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ это Π²ΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Π»ΠΈ, Ρƒ нас Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΠΈ экспСртизы Π² самом fastlane, Π½ΠΈ Π² Ruby, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ написан fastlane, Π½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π² сСти β€”Β ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΊΡ‚ΠΎ писал ΠΏΡ€ΠΎ 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: ΠΎΠ΄ΠΈΠ½ стандарт fastlane Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

На 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 Ρ‡Π΅Ρ€Π΅Π· action import_from_git, Π½ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Fastfile, для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΆΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² β€” Π½Π΅Ρ‚. Если хочСтся «прям совсСм красиво», ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой action.

Аналогичный Π½Π°Π±ΠΎΡ€ сдСлали для Android ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ReactNative, Ρ„Π°ΠΉΠ»Ρ‹ Π»Π΅ΠΆΠ°Ρ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Π½ΠΎ Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π²Π΅Ρ‚ΠΊΠ°Ρ… iOS, android ΠΈ react_native.

Когда Ρ€Π΅Π»ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ…ΠΎΡ‡Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ шаг, измСнСния Π² скриптС Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· MR Π² git, большС Π½Π΅ Π½Π°Π΄ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊΠΎΠ² ΠΏΠΎΠ»ΠΎΠΌΠ°Π½Π½Ρ‹Ρ… скриптов, Π΄Π° ΠΈ Π² Ρ†Π΅Π»ΠΎΠΌ β€” ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, это Π½Π°Π΄ΠΎ ΠΏΠΎΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ всС

РаньшС ΠΌΡ‹ Ρ‚Ρ€Π°Ρ‚ΠΈΠ»ΠΈ врСмя Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ всСх скриптов, ΠΈΡ… ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡ‡ΠΈΠ½ΠΊΡƒ всСх послСдствий ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ. Π‘Ρ‹Π»ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΎΠ±ΠΈΠ΄Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ошибок ΠΈ простоСв Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² Π±Ρ‹Π»ΠΈ простыми ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ°ΠΌΠΈ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ‚Π°ΠΊ слоТно ΡƒΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π² мСшанинС shell-скрипта. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ ошибки свСдСны ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ. ИзмСнСния Π½Π°ΠΊΠ°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ сразу Π½Π° всС прилоТСния. А Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ завСсти Π² процСсс стоит 15 ΠΌΠΈΠ½ΡƒΡ‚ β€” Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ pipeline Π½Π° CI ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, остался нСосвСщСнным ΠΏΡƒΠ½ΠΊΡ‚ с Fastfile для Android ΠΈ подпись ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ссли ΡΡ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсна, Π½Π°ΠΏΠΈΡˆΡƒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅. Π‘ΡƒΠ΄Ρƒ Ρ€Π°Π΄Π° вашим вопросам ΠΈΠ»ΠΈ прСдлоТСниям «ΠΊΠ°ΠΊ Π±Ρ‹ Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ эту Π·Π°Π΄Π°Ρ‡Ρƒ» Π² коммСнтариях ΠΈΠ»ΠΈ Π² Telegram bashkirova.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ