ΠΠΈ ΡΠ°ΠΊΠ°Π» Π΄Π° Π·Π±ΠΎΡΡΠ²Π°ΠΌ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ½ΡΠΈΡΠ°Π½Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° ΠΈ ΠΈΡΠΏΠΎΡΠ°ΠΊΠ° Π·Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ fastlane. ΠΠ°ΠΊΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ CI/CD Π½Π° ΡΠΈΡΠ΅ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΈΠ³Π½Π°Π²ΠΌΠ΅ Π΄ΠΎ ΡΠ°ΠΌΡ ΠΈ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠΈ Π½Π° ΠΊΡΠ°ΡΠΎΡ.
ΠΠ΅ΡΠ΅ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π» Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π·Π° Π°Π»Π°ΡΠΊΠ°ΡΠ°, ΡΡΠΎ Π½ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ, ΠΏΠ° Π½Π°ΠΌΠ΅ΡΠ½ΠΎ Π½Π΅ΠΌΠ° Π΄Π° ΡΠ° ΠΎΠΏΠΈΡΠ°ΠΌ Π°Π»Π°ΡΠΊΠ°ΡΠ° Π²ΠΎ Π΄Π΅ΡΠ°Π»ΠΈ, ΡΡΠΊΡ ΡΠ°ΠΌΠΎ ΡΠ΅ ΡΠ΅ ΠΎΡΠ²ΡΠ½Π°ΠΌ Π½Π° ΠΎΠ½Π° ΡΡΠΎ Π³ΠΎ ΠΈΠΌΠ°Π²ΠΌΠ΅ ΡΠΎΠ³Π°Ρ:
ΠΡΠΈΡΠΈΡΠ°Π»Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π·Π° Π±ΡΠ·Π° Π»ΠΈΠ½ΠΈΡΠ° ΠΡΠΈΠΌΠ΅ΡΠΈ ΠΎΠ΄ Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΠΈΠ΅ Π³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π·Π° iOS ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Fastlane
Π‘ΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ Π΄Π²Π° Π΄Π΅Π»Π°:
- ΠΠΎΠ·Π°Π΄ΠΈΠ½Π° Π½Π° ΠΏΠΎΡΠ°Π²Π°ΡΠ° Π½Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ 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 ΡΠΊΡΠΈΠΏΡΠΈ Π·Π° ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅ ΠΊΠΎΠΈ Π½Π° Π΅Π΄Π΅Π½ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½ ΡΠ΅ ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΠΆΠΈΠ²Π΅Π°Ρ ΡΠ²ΠΎΡ ΠΆΠΈΠ²ΠΎΡ, ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΠΎΡΠ΅ΡΠΊΠΎ Π΄Π° Π³ΠΈ ΡΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΊΡΠΈΠΏΡΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»Π°Ρ Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ°, Π° Π½ΠΈΠ΅ Π½Π΅ΠΌΠ°Π²ΠΌΠ΅ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ ΡΠ°ΠΌΡ. Π, Π²ΠΎΠΎΠΏΡΡΠΎ, Π½Π΅ΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π²Π°ΠΊΠ° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ Π½Π°ΡΠ°ΡΠ° Π±ΠΎΠ»ΠΊΠ°.
ΠΠ°Π΄Π°ΡΠ° Π±Ρ. 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, Π²Π΅ΡΠ΅ Π½Π΅ΠΌΠ° ΠΏΠΎΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π±Π°ΡΠ°Π°Ρ Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΡΠΈΡΠ΅ Π·Π° ΡΠΊΡΡΠ΅Π½ΠΈΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΈ ΠΈ Π²ΠΎΠΎΠΏΡΡΠΎ, ΡΠ΅Π³Π° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΡΠ΅ Π΄Π° Π³ΠΎ ΡΠΊΡΡΠΈΡΠ΅.
Π‘Π΅Π³Π° ΡΠΎΠ° Π΅ ΡΠΈΠ³ΡΡΠ½ΠΎ
ΠΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ, ΠΏΠΎΡΡΠΎΡΠΈΠ²ΠΌΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠ΄ΡΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΈ, Π½ΠΈΠ²Π½ΠΎ Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ ΠΈ ΠΏΠΎΠΏΡΠ°Π²Π°ΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΈΡΠΈ ΠΎΠ΄ Π°ΠΆΡΡΠΈΡΠ°ΡΠ°ΡΠ°. ΠΠ΅ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠ°Π·ΠΎΡΠ°ΡΡΠ²Π°ΡΠΊΠΈ ΠΊΠΎΠ³Π° ΠΏΡΠΈΡΠΈΠ½ΠΈΡΠ΅ Π·Π° Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΈ Π·Π°ΡΡΠΎΡΠΎΡ Π²ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΡΠ°ΡΠ° Π±Π΅Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ ΠΏΠ΅ΡΠ°ΡΠ½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΡΠΎ Π±Π΅ΡΠ΅ ΡΠΎΠ»ΠΊΡ ΡΠ΅ΡΠΊΠΎ Π΄Π° ΡΠ΅ ΡΠ»Π΅Π΄ΠΈ Π²ΠΎ ΠΌΠ΅ΡΠ΅ΠΆΠΎΡ Π½Π° ΡΠΊΡΠΈΠΏΡΠΈ Π½Π° ΡΠΊΠΎΠ»ΠΊΠ°. Π‘Π΅Π³Π° ΡΠ°ΠΊΠ²ΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡΠΌ. ΠΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»Π°Π°Ρ Π½Π° ΡΠΈΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΎΠ΄Π΅Π΄Π½Π°Ρ. Π ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΡΠ΅ 15 ΠΌΠΈΠ½ΡΡΠΈ Π·Π° Π΄Π° ΡΠ΅ ΡΡΠ°Π²ΠΈ Π½ΠΎΠ²Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π²ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ - ΠΏΠΎΡΡΠ°Π²Π΅ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½ Π½Π° CI ΠΈ Π΄ΠΎΠ΄Π°ΡΡΠ΅ Π³ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΈΡΠ΅ Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ.
Π‘Π΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΏΠΎΠ΅Π½ΡΠ°ΡΠ° ΡΠΎ Fastfile Π·Π° Android ΠΈ ΠΏΠΎΡΠΏΠΈΡΠΎΡ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΎΡΡΠ°Π½ΡΠ²Π° Π½Π΅ΠΎΠ±ΡΠ°ΡΠ½Π΅ΡΠ°, Π°ΠΊΠΎ ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°, ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅. ΠΠ΅ ΠΌΠΈ Π±ΠΈΠ΄Π΅ Π΄ΡΠ°Π³ΠΎ Π΄Π° Π³ΠΈ Π²ΠΈΠ΄Π°ΠΌ Π²Π°ΡΠΈΡΠ΅ ΠΏΡΠ°ΡΠ°ΡΠ° ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠ·ΠΈ βΠΊΠ°ΠΊΠΎ Π±ΠΈ Π³ΠΎ ΡΠ΅ΡΠΈΠ»Π΅ ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌβ Π²ΠΎ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΠΈΠ»ΠΈ Π½Π° Π’Π΅Π»Π΅Π³ΡΠ°ΠΌΠ°
ΠΠ·Π²ΠΎΡ: www.habr.com