Мобилно искуство CICD: Π΅Π΄Π΅Π½ стандард Π·Π° Π±Ρ€Π·Π° Π»Π΅Π½Ρ‚Π° Π·Π° ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

Мобилно искуство CICD: Π΅Π΄Π΅Π½ стандард Π·Π° Π±Ρ€Π·Π° Π»Π΅Π½Ρ‚Π° Π·Π° ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ
Π‘ΠΈ сакал Π΄Π° Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌ Π·Π° ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΈ испорака Π·Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ fastlane. Како ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ CI/CD Π½Π° ситС ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊΠΎ стигнавмС Π΄ΠΎ Ρ‚Π°ΠΌΡƒ ΠΈ ΡˆΡ‚ΠΎ сС случи Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚.

Π’Π΅ΡœΠ΅ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π» Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π·Π° Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π°, ΡˆΡ‚ΠΎ Π½ΠΈ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡΡƒΠ²Π°ΡˆΠ΅ Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚, ΠΏΠ° Π½Π°ΠΌΠ΅Ρ€Π½ΠΎ Π½Π΅ΠΌΠ° Π΄Π° ја опишам Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π° Π²ΠΎ Π΄Π΅Ρ‚Π°Π»ΠΈ, Ρ‚ΡƒΠΊΡƒ само ќС сС осврнам Π½Π° ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π³ΠΎ ΠΈΠΌΠ°Π²ΠΌΠ΅ Ρ‚ΠΎΠ³Π°Ρˆ:

Π‘Ρ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° сС состои ΠΎΠ΄ Π΄Π²Π° Π΄Π΅Π»Π°:

  • Позадина Π½Π° ΠΏΠΎΡ˜Π°Π²Π°Ρ‚Π° Π½Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ CI/CD Π²ΠΎ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ˜Π°Ρ‚Π°
  • Π’Π΅Ρ…Π½ΠΈΡ‡ΠΊΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡƒΡˆΡ‚Π°ΡšΠ΅ CI/CD Π·Π° N-Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

ΠŸΡ€Π²ΠΈΠΎΡ‚ Π΄Π΅Π» Π΅ повСќС Π½ΠΎΡΡ‚Π°Π»Π³ΠΈΡ˜Π° Π·Π° старитС Π²Ρ€Π΅ΠΌΠΈΡšΠ°, Π° Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ Π΅ искуство ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° сСбС.

Π’Π°ΠΊΠ° сС случувало историски

Π“ΠΎΠ΄ΠΈΠ½Π° 2015 Π³ΠΎΠ΄ΠΈΠ½Π°

Π‘Π°ΠΌΠΎ ΡˆΡ‚ΠΎ ΠΏΠΎΡ‡Π½Π°Π²ΠΌΠ΅ Π΄Π° Ρ€Π°Π·Π²ΠΈΠ²Π°ΠΌΠ΅ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚ΠΎΠ³Π°Ρˆ Π½Π΅ Π·Π½Π°Π΅Π²ΠΌΠ΅ Π½ΠΈΡˆΡ‚ΠΎ Π·Π° ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°, Π·Π° DevOps ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ. Π‘Π΅ΠΊΠΎΠ΅ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° бСшС спровСдСно ΠΎΠ΄ самиот Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ ΠΎΠ΄ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° машина. И Π°ΠΊΠΎ Π·Π° Андроид Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Сдноставно - склопСно, ΠΏΠΎΡ‚ΠΏΠΈΡˆΠ°Π½ΠΎ .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. НСмашС Ρ‚ΠΎΠ»ΠΊΡƒ ΠΌΠ½ΠΎΠ³Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ ΠΈΠΌΠ° сСга - ΠΊΠ°ΠΊΠΎ Π΄Π° сС Π·Π°ΠΏΠΎΡ‡Π½Π΅, ΠΊΠ°ΠΊΠΎ Π΄Π° сС користи. И самата Π°Π»Π°Ρ‚ΠΊΠ° бСшС сè ΡƒΡˆΡ‚Π΅ Π³Ρ€ΡƒΠ±Π° Π²ΠΎ Ρ‚ΠΎΠ° Π²Ρ€Π΅ΠΌΠ΅: ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ само Π½Π΅ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€Π°Π° ΠΈ бСшС Ρ‚Π΅ΡˆΠΊΠΎ Π΄Π° сС ΠΏΠΎΠ²Π΅Ρ€ΡƒΠ²Π° Π²ΠΎ ΠΌΠ°Π³ΠΈΡ‡Π½Π°Ρ‚Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° ΡˆΡ‚ΠΎ ја Π²Π΅Ρ‚ΠΈΡ˜Π°.

Π‘Π΅ΠΏΠ°ΠΊ, Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΡƒΠ½Π°Π»Π½ΠΈ услуги Π²ΠΊΠ»ΡƒΡ‡Π΅Π½ΠΈ Π²ΠΎ Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ 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 Π³ΠΎΠ΄ΠΈΠ½Π°, ΡƒΡˆΡ‚Π΅ Сднаш ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Π²ΠΌΠ΅ ΠΊΠΎΠ½ сè ΡƒΡˆΡ‚Π΅ Π²ΠΎ Ρ€Π°Π·Π²ΠΎΡ˜ fastlane.

Π—Π°Π΄Π°Ρ‡Π° Π±Ρ€. 1: ΡΡƒΠΌΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΈ ситС Ρ‡Π΅ΠΊΠΎΡ€ΠΈ Π½Π° скриптата ΠΈ ΠΏΡ€Π΅ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π³ΠΈ Π²ΠΎ Fastfile

Кога ΠΏΠΎΡ‡Π½Π°Π²ΠΌΠ΅, Π½Π°ΡˆΠΈΡ‚Π΅ скрипти ΠΈΠ·Π³Π»Π΅Π΄Π°Π° ΠΊΠ°ΠΊΠΎ ΠΊΡ€ΠΏΠ° Π·Π° Π½ΠΎΠ·Π΅ составСна ΠΎΠ΄ ситС Ρ‡Π΅ΠΊΠΎΡ€ΠΈ ΠΈ ΠΏΠ°Ρ‚Π΅Ρ€ΠΈΡ†ΠΈ Π²ΠΎ Π΅Π΄Π½Π° скрипта Π½Π° школка Π²ΠΎ ЏСнкинс. Π‘Γ¨ ΡƒΡˆΡ‚Π΅ Π½Π΅ смС ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π»Π΅ Π½Π° гасовод ΠΈ ΠΏΠΎΠ΄Π΅Π»Π±Π° ΠΏΠΎ Ρ„Π°Π·Π°.

Π Π°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ ΡˆΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π°Π²ΠΌΠ΅ 4 Ρ‡Π΅ΠΊΠΎΡ€ΠΈ ΠΊΠΎΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Π°Ρ‚ Π½Π° описот Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ CI/CD:

  • ΠΈΠ·Π³Ρ€Π°Π΄Π±Π° - ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ Π½Π° зависности, ΡΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π°,
  • тСст - ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° тСстови Π·Π° програмСрски Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ, ΠΏΡ€Π΅ΡΠΌΠ΅Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° покриСноста,
  • сонар - Π³ΠΈ лансира ситС Π»ΠΈΠ½Ρ‚Π΅Ρ€ΠΈ ΠΈ ΠΈΡΠΏΡ€Π°ΡœΠ° ΠΈΠ·Π²Π΅ΡˆΡ‚Π°ΠΈ Π΄ΠΎ SonarQube,
  • распорСди - ΠΈΡΠΏΡ€Π°ΡœΠ°ΡšΠ΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Π½Π° Π°Π»Ρ„Π° (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 ID Π½Π° смСтката Π½Π° Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΎΡ‚, Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°, ID Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈΡ‚Π½. Π½Π°. Како ΠΏΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΡƒΠ²Π°ΡšΠ΅, Π³ΠΈ ставамС ситС ΠΎΠ²ΠΈΠ΅ ΠΊΠ»ΡƒΡ‡Π΅Π²ΠΈ Π²ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»Π½ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ - Gymfile, Matchfile ΠΈ Appfile.

Π‘Π΅Π³Π° Π²ΠΎ ЏСнкинс ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΎΠ²ΠΈΠΊΠ°Ρ‚Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΠΎΠΈ Π½Π΅ Π³ΠΎ Π·Π°ΠΌΠ°Ρ‚ΡƒΠ²Π°Π°Ρ‚ ΠΏΠΎΠ³Π»Π΅Π΄ΠΎΡ‚ ΠΈ сС лСсно Ρ‡ΠΈΡ‚Π»ΠΈΠ²ΠΈ со ΠΎΠΊΠΎ:

# fastlane ios <lane_name>

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

Π£Ρ€Π°, супСр смС

Π¨Ρ‚ΠΎ Π΄ΠΎΠ±ΠΈ? Π˜ΡΡ‡ΠΈΡΡ‚Π΅Ρ‚Π΅ Π³ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Π·Π° сСкој Ρ‡Π΅ΠΊΠΎΡ€. Π˜ΡΡ‡ΠΈΡΡ‚Π΅Π½ΠΈ скрипти, ΡƒΡ€Π΅Π΄Π½ΠΎ распорСдСни Π²ΠΎ Ρ„Π°Ρ˜Π»ΠΎΠ²ΠΈ fastlane. Π‘ΠΎ радост, истрчавмС кај ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π±Π°Ρ€Π°Ρ˜ΡœΠΈ ΠΎΠ΄ Π½ΠΈΠ² Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°Ρ‚ сè ΡˆΡ‚ΠΎ ΠΈΠΌ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π²ΠΎ Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π°.

Но, со Π²Ρ€Π΅ΠΌΠ΅ сфативмС Π΄Π΅ΠΊΠ° ќС Π½Π°ΠΈΠ΄Π΅ΠΌΠ΅ Π½Π° иститС Ρ‚Π΅ΡˆΠΊΠΎΡ‚ΠΈΠΈ - сè ΡƒΡˆΡ‚Π΅ ќС ΠΈΠΌΠ°ΠΌΠ΅ 20 скрипти Π·Π° ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅ ΠΊΠΎΠΈ Π½Π° Π΅Π΄Π΅Π½ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ ќС ΠΏΠΎΡ‡Π½Π°Ρ‚ Π΄Π° ΠΆΠΈΠ²Π΅Π°Ρ‚ свој ΠΆΠΈΠ²ΠΎΡ‚, ќС Π±ΠΈΠ΄Π΅ ΠΏΠΎΡ‚Π΅ΡˆΠΊΠΎ Π΄Π° Π³ΠΈ ΡƒΡ€Π΅Π΄ΡƒΠ²Π°ΠΌΠ΅, бидСјќи скриптитС ќС сС ΠΏΡ€Π΅Ρ„Ρ€Π»Π°Ρ‚ Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π°, Π° Π½ΠΈΠ΅ Π½Π΅ΠΌΠ°Π²ΠΌΠ΅ пристап Π΄ΠΎ Ρ‚Π°ΠΌΡƒ. И, Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ, Π½Π΅ΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π²Π°ΠΊΠ° Π΄Π° сС Ρ€Π΅ΡˆΠΈ Π½Π°ΡˆΠ°Ρ‚Π° Π±ΠΎΠ»ΠΊΠ°.

Мобилно искуство CICD: Π΅Π΄Π΅Π½ стандард Π·Π° Π±Ρ€Π·Π° Π»Π΅Π½Ρ‚Π° Π·Π° ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

Π—Π°Π΄Π°Ρ‡Π° Π±Ρ€. 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: Π΅Π΄Π΅Π½ стандард Π·Π° Π±Ρ€Π·Π° Π»Π΅Π½Ρ‚Π° Π·Π° ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

На 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.

Кога Ρ‚ΠΈΠΌΠΎΡ‚ Π·Π° издавањС сака Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ нСкој Π½ΠΎΠ² Ρ‡Π΅ΠΊΠΎΡ€, ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²ΠΎ сцСнариото сС снимаат ΠΏΡ€Π΅ΠΊΡƒ MR Π²ΠΎ git, вСќС Π½Π΅ΠΌΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π΄Π° сС Π±Π°Ρ€Π°Π°Ρ‚ Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΡ†ΠΈΡ‚Π΅ Π·Π° ΡΠΊΡ€ΡˆΠ΅Π½ΠΈΡ‚Π΅ скрипти ΠΈ Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ, сСга Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΡΠΊΡ€ΡˆΠΈΡ‚Π΅.

Π‘Π΅Π³Π° Ρ‚ΠΎΠ° Π΅ сигурно

ΠŸΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ, ΠΏΠΎΡ‚Ρ€ΠΎΡˆΠΈΠ²ΠΌΠ΅ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° ситС скрипти, Π½ΠΈΠ²Π½ΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ ΠΈ ΠΏΠΎΠΏΡ€Π°Π²Π°ΡšΠ΅ Π½Π° ситС послСдици ΠΎΠ΄ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ°Ρ‚Π°. Π‘Π΅ΡˆΠ΅ ΠΌΠ½ΠΎΠ³Ρƒ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΡƒΠ²Π°Ρ‡ΠΊΠΈ ΠΊΠΎΠ³Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ ΠΈ Π·Π°ΡΡ‚ΠΎΡ˜ΠΎΡ‚ Π²ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΡ˜Π°Ρ‚Π° Π±Π΅Π° Сдноставни ΠΏΠ΅Ρ‡Π°Ρ‚Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ ΡˆΡ‚ΠΎ бСшС Ρ‚ΠΎΠ»ΠΊΡƒ Ρ‚Π΅ΡˆΠΊΠΎ Π΄Π° сС слСди Π²ΠΎ ΠΌΠ΅Ρ‚Π΅ΠΆΠΎΡ‚ Π½Π° скрипти Π½Π° школка. Π‘Π΅Π³Π° Ρ‚Π°ΠΊΠ²ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ сС свСдСни Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ. ΠŸΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ сС ΠΏΡ€Π΅Ρ„Ρ€Π»Π°Π°Ρ‚ Π½Π° ситС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ одСднаш. И ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ сС 15 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π·Π° Π΄Π° сС стави Π½ΠΎΠ²Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ процСсот - поставСтС шаблон Π½Π° CI ΠΈ Π΄ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ Π³ΠΈ ΠΊΠ»ΡƒΡ‡Π΅Π²ΠΈΡ‚Π΅ Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΎΡ‚.

Π‘Π΅ Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΏΠΎΠ΅Π½Ρ‚Π°Ρ‚Π° со Fastfile Π·Π° Android ΠΈ потписот Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° останува Π½Π΅ΠΎΠ±Ρ˜Π°ΡΠ½Π΅Ρ‚Π°, Π°ΠΊΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π΅ интСрСсна, ќС напишам ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅. ЌС ΠΌΠΈ Π±ΠΈΠ΄Π΅ Π΄Ρ€Π°Π³ΠΎ Π΄Π° Π³ΠΈ Π²ΠΈΠ΄Π°ΠΌ Π²Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€Π°ΡˆΠ°ΡšΠ° ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠ·ΠΈ β€žΠΊΠ°ΠΊΠΎ Π±ΠΈ Π³ΠΎ Ρ€Π΅ΡˆΠΈΠ»Π΅ овој ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌβ€œ Π²ΠΎ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ ΠΈΠ»ΠΈ Π½Π° Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌΠ° Π±Π°ΡˆΠΊΠΈΡ€ΠΎΠ²Π°.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€