Π― Π±Ρ Ρ
ΠΎΡΠ΅Π»Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΎ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ΅ Π΄Π»Ρ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ fastlane. ΠΠ°ΠΊ ΠΌΡ Π²Π½Π΅Π΄ΡΡΠ΅ΠΌ CI/CD Π½Π° Π²ΡΠ΅ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΌΡ ΠΊ ΡΡΠΎΠΌΡ ΡΠ»ΠΈ ΠΈ ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π² ΠΈΡΠΎΠ³Π΅.
Π ΡΠ΅ΡΠΈ ΡΠΆΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° ΠΏΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΠΊ Π½Π΅ Ρ Π²Π°ΡΠ°Π»ΠΎ Π½Π°ΠΌ Π½Π° ΡΡΠ°ΡΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ Π½Π΅ Π±ΡΠ΄Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π° Π»ΠΈΡΡ ΡΠΎΡΠ»ΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π±ΡΠ»ΠΎ Ρ Π½Π°Ρ ΡΠΎΠ³Π΄Π°:
ΠΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ fastlane ΠΡΠΈΠΌΠ΅ΡΡ Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠ±ΠΎΡΠΊΡ iOS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Fastlane
Π‘ΡΠ°ΡΡΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ:
- ΠΡΠ΅Π΄ΡΡΡΠΎΡΠΈΡ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ 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 ΡΠΊΡΠΈΠΏΡΠΎΠ² ΡΠ±ΠΎΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅ Π½Π°ΡΠ½ΡΡ ΠΆΠΈΡΡ ΡΠ²ΠΎΠ΅ΠΉ ΠΆΠΈΠ·Π½ΡΡ, ΠΏΡΠ°Π²ΠΈΡΡ ΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠΊΡΠΈΠΏΡΡ ΠΏΠ΅ΡΠ΅Π΅Π΄ΡΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π° Ρ Π½Π°Ρ Π΄ΠΎΡΡΡΠΏΠ° ΡΡΠ΄Π° Π½Π΅Ρ. Π, Π² ΠΎΠ±ΡΠ΅ΠΌ, ΡΠ΅ΡΠΈΡΡ Π½Π°ΡΡ Π±ΠΎΠ»Ρ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ.
ΠΠ°Π΄Π°ΡΠ° β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 Π΅ΡΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅: .env
, .env.default
, .env.development
.
Π ΡΠΎΠ³Π΄Π° ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ. ΠΠΎΠΌΠ΅ΡΡΠΈΠΌ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π½Π΅ ΡΠΊΡΠΈΠΏΡΡ fastlane ΠΈ Π΅Π³ΠΎ ΠΌΠ΅ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π° ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ»Π΅ .env.appName
.
Π‘Π°ΠΌΠΈ Fastfile
, Appfile
, Matchfile
ΠΈ Gymfile
, ΠΌΡ ΡΠΏΡΡΡΠ°Π»ΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. Π’ΡΠ΄Π° ΠΆΠ΅ ΡΠΏΡΡΡΠ°Π»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Ρ ΠΊΠ»ΡΡΠ°ΠΌΠΈ-ΠΏΠ°ΡΠΎΠ»ΡΠΌΠΈ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² βΒ .env
.
ΠΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ
ΠΠ° 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, Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½Π°Π΄ΠΎ ΠΈΡΠΊΠ°ΡΡ Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊΠΎΠ² ΠΏΠΎΠ»ΠΎΠΌΠ°Π½Π½ΡΡ ΡΠΊΡΠΈΠΏΡΠΎΠ², Π΄Π° ΠΈ Π² ΡΠ΅Π»ΠΎΠΌ β ΡΠ»ΠΎΠΌΠ°ΡΡ ΡΠ΅ΠΏΠ΅ΡΡ, ΡΡΠΎ Π½Π°Π΄ΠΎ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡΡ.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΡΠ½ΠΎ Π²ΡΠ΅
Π Π°Π½ΡΡΠ΅ ΠΌΡ ΡΡΠ°ΡΠΈΠ»ΠΈ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π²ΡΠ΅Ρ ΡΠΊΡΠΈΠΏΡΠΎΠ², ΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡΠΈΠ½ΠΊΡ Π²ΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΉ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ. ΠΡΠ»ΠΎ ΠΎΡΠ΅Π½Ρ ΠΎΠ±ΠΈΠ΄Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡΠΈΠ½Ρ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ ΠΏΡΠΎΡΡΠΎΠ΅Π² ΡΠ΅Π»ΠΈΠ·ΠΎΠ² Π±ΡΠ»ΠΈ ΠΏΡΠΎΡΡΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΊΠ°ΠΌΠΈ, Π·Π° ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠ°ΠΊ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΡΠ»Π΅Π΄ΠΈΡΡ Π² ΠΌΠ΅ΡΠ°Π½ΠΈΠ½Π΅ shell-ΡΠΊΡΠΈΠΏΡΠ°. Π’Π΅ΠΏΠ΅ΡΡ ΠΆΠ΅ ΡΠ°ΠΊΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ²Π΅Π΄Π΅Π½Ρ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΡ. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π°ΠΊΠ°ΡΡΠ²Π°ΡΡΡΡ ΡΡΠ°Π·Ρ Π½Π° Π²ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΠΎΠΈΡ 15 ΠΌΠΈΠ½ΡΡ β Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠΉ pipeline Π½Π° CI ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠ»ΡΡΠΈ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΠ°ΠΆΠ΅ΡΡΡ, ΠΎΡΡΠ°Π»ΡΡ Π½Π΅ΠΎΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ ΠΏΡΠ½ΠΊΡ Ρ Fastfile Π΄Π»Ρ Android ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π΅ΡΠ»ΠΈ ΡΡΠ°ΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°, Π½Π°ΠΏΠΈΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠ΄Ρ ΡΠ°Π΄Π° Π²Π°ΡΠΈΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ «ΠΊΠ°ΠΊ Π±Ρ Π²Ρ ΡΠ΅ΡΠΈΠ»ΠΈ ΡΡΡ Π·Π°Π΄Π°ΡΡ» Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
ΠΈΠ»ΠΈ Π² Telegram
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com