ΠΠΈΡ
ΠΈΡΠΊΠ°Π» Π΄Π° Π³ΠΎΠ²ΠΎΡΡ Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π·Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ 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 formatter, ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΡΠ° ΡΡΠ°Π½Π°Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ΅ΡΠ»ΠΈΠ²ΠΈ. Π’ΠΎΠ²Π° Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΡΠΏΠ΅ΡΡΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΏΠΎΠΏΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΅ΠΊΠΈΠΏΡΡ ΠΏΠΎ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΡΠ°Π·Π±Π΅ΡΠ΅ ΡΠ°ΠΌ.
ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½ΠΈΡ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ xcodebuild
ΠΈ gym
ΠΠΈΠ΅ Π½Π΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ
ΠΌΠ΅, Π½ΠΎ ΡΠ΅ ΡΠ΅ Π΄ΠΎΠ²Π΅ΡΠΈΠΌ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° - Π΄ΠΎ 30% ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅.
ΠΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅Ρ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠΎΠ΄ΠΈΠ½Π° 2018 ΠΈ ΡΠ΅Π³Π°
ΠΠΎ 2018 Π³. ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ·ΡΡΠ»ΠΎ ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈ Π² Jenkins, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΡΠΏΡΡΡ Π° Π΄Π° ΠΏΡΡΠΊΠ°Ρ ΠΎΡ ΡΠ²ΠΎΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ ΡΠ°ΠΌΠΎ Π΅ΠΊΠΈΠΏΡΡ ΠΏΠΎ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠ°Π²ΠΎ Π΄Π° ΠΏΡΡΠΊΠ°.
ΠΠ΅ΡΠ΅ ΠΈΡΠΊΠ°Ρ ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΠΌ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΈ Π½Π°ΡΠΈΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΡΠ°ΡΡΡΡ Π° ΠΈ ΡΠ°ΡΡΡΡ Π°. ΠΠ°ΡΠ°ΡΠ½Π° ΠΈ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π·Π°Π΅Π΄Π½ΠΎ Ρ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎ ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π±ΡΡ Π° ΠΎΠΊΠΎΠ»ΠΎ 10. ΠΠΌΠ°ΠΉΠΊΠΈ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ, ΡΠΎΠ²Π° ΡΠ° ΠΎΠΊΠΎΠ»ΠΎ 20 βΠΆΠΈΠ²ΠΈβ ΡΠΊΡΠΈΠΏΡΠ°.
ΠΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΡΠΊΠ°Ρ ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²Π° ΡΡΡΠΏΠΊΠ° ΠΊΡΠΌ ΡΠΊΡΠΈΠΏΡΠ°, ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ ΠΏΠ°ΡΡΠ΅ΡΠ°ΡΠ° Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ°. ΠΠΎΠΆΠ΅ Π±ΠΈ Π±ΠΈΡ ΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ ΠΏΠΎ-Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ, Π½ΠΎ ΡΠ΅ΡΡΠΎ ΡΠ°ΠΊΠΈΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π·Π°Π²ΡΡΡΠ²Π°Ρ Π° Ρ ΠΏΡΠ°Π²ΠΎΠΏΠΈΡΠ½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΡΠ°Ρ Π° Π² Π²Π΅ΡΠ΅ΡΠΈ Π·Π° Π΅ΠΊΠΈΠΏΠ° ΠΏΠΎ ΠΈΠ·Π΄Π°Π²Π°Π½Π΅, Π·Π° Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ° ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΈ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ ΠΊΠΎΠΉ ΡΠΌΠ½ΠΈΠΊ Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π²ΡΡΡΠ½ΠΎΡΡ ΠΏΡΠ°Π²ΠΈ. ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠ°ΠΆΠ΅, ΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ Π·Π° Π΅Π΄Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΡΠ° ΠΏΠΎΠ½Π΅ Π΄ΠΎΠ½ΡΠΊΡΠ΄Π΅ ΡΡ ΠΎΠ΄Π½ΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΡΠ° Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ ΡΡΡΠΎΡΠΎ.
ΠΠ° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ ΠΏΡΠΎΡΠ΅Ρ Π·Π° Π½ΠΎΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΎΡΠ΄Π΅Π»ΠΈΡΠ΅ Π΅Π΄ΠΈΠ½ Π΄Π΅Π½, Π·Π° Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ βΠΏΡΡΡΠ½Π°β Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ΅Π·ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅, Π΄Π° Ρ Π΄Π΅Π±ΡΠ³Π²Π°ΡΠ΅ ΠΈ Π΄Π° ΠΊΠ°ΠΆΠ΅ΡΠ΅, ΡΠ΅ βΠ΄Π°, ΡΠ°Π±ΠΎΡΠΈβ.
ΠΡΠ΅Π· Π»ΡΡΠΎΡΠΎ Π½Π° 2018 Π³. ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Ρ ΠΌΠ΅ ΠΊΡΠΌ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΈΡ ΡΠ΅ ΡΠ°ΡΡΠ»Π΅ΠΉΠ½.
ΠΠ°Π΄Π°ΡΠ° β1: ΠΎΠ±ΠΎΠ±ΡΠ΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠΏΠΊΠΈ Π½Π° ΡΠΊΡΠΈΠΏΡΠ° ΠΈ Π³ΠΈ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π² Fastfile
ΠΠΎΠ³Π°ΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π°Ρ ΠΌΠ΅, Π½Π°ΡΠΈΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ Π° ΠΊΠ°ΡΠΎ ΠΊΡΡΠΏΠ° Π·Π° ΠΊΡΠ°ΠΊΠ°, ΡΡΡΡΠΎΡΡΠ° ΡΠ΅ ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠΏΠΊΠΈ ΠΈ ΠΏΠ°ΡΠ΅ΡΠΈΡΠΈ Π² Π΅Π΄ΠΈΠ½ shell ΡΠΊΡΠΈΠΏΡ Π² Jenkins. ΠΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠΌΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π»ΠΈ ΠΊΡΠΌ ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄ ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ ΠΏΠΎ Π΅ΡΠ°ΠΏΠΈ.
Π Π°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Ρ ΠΌΠ΅ 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
.
Π‘Π΅Π³Π° Π² Jenkins ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΡΠ΅ ΠΊΡΠ°ΡΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ Π·Π°ΠΌΡΠ³Π»ΡΠ²Π°Ρ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΈ ΡΠ° Π»Π΅ΡΠ½ΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΎΡ ΠΎΠΊΠΎΡΠΎ:
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy
Π£ΡΠ°, ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΈ ΡΠΌΠ΅
ΠΠ°ΠΊΠ²ΠΎ ΠΏΠΎΠ»ΡΡΠΈ? Π―ΡΠ½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° Π²ΡΡΠΊΠ° ΡΡΡΠΏΠΊΠ°. ΠΠ·ΡΠΈΡΡΠ΅Π½ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅, ΡΠΏΡΠ΅ΡΠ½Π°ΡΠΎ ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ Π²ΡΠ² ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π±ΡΡΠ·ΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅. Π Π°Π΄Π²Π°ΠΉΠΊΠΈ ΡΠ΅, Π½ΠΈΠ΅ ΠΈΠ·ΡΠΈΡΠ°Ρ ΠΌΠ΅ Π΄ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Ρ ΠΌΠΎΠ»Π±Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΡΠΌ ΡΠ΅Ρ Π½ΠΈΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°.
ΠΠΎ Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΡΠ°Π·Π±ΡΠ°Ρ ΠΌΠ΅, ΡΠ΅ ΡΠ΅ ΡΡΠ΅ΡΠ½Π΅ΠΌ ΡΡΡΠΈΡΠ΅ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ - Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ 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 ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡΡΠ°Π²Π° Π½Π΅ΠΎΠ±ΡΡΠ½Π΅Π½, Π°ΠΊΠΎ ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°, ΡΠ΅ Π½Π°ΠΏΠΈΡΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅. Π©Π΅ ΡΠ΅ ΡΠ°Π΄Π²Π°ΠΌ Π΄Π° Π²ΠΈΠ΄Ρ Π²Π°ΡΠΈΡΠ΅ Π²ΡΠΏΡΠΎΡΠΈ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ βΠΊΠ°ΠΊ Π±ΠΈΡ
ΡΠ΅ ΡΠ΅ΡΠΈΠ»ΠΈ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌβ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΠΈΠ»ΠΈ Π² Telegram
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com