рдореИрдВ рдлрд╛рд╕реНрдЯрд▓реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЛрдмрд╛рдЗрд▓ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдФрд░ рдбрд┐рд▓реАрд╡рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╣рдо рд╕рднреА рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рд╡рд╣рд╛рдВ рддрдХ тАЛтАЛрдХреИрд╕реЗ рдкрд╣реБрдВрдЪреЗ рдФрд░ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖред
рдЯреВрд▓ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рдореМрдЬреВрдж рд╣реИ, рдЬрд┐рд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХрдореА рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЯреВрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡рд╣реА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрдм рдерд╛:
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдлрд╛рд╕реНрдЯрд▓реЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЕрдиреНрдп рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣рдо рдлрд╛рд╕реНрдЯрд▓реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдИрдУрдПрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рд▓реЗрдЦ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реИрдВ:
- рдХрдВрдкрдиреА рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рдЙрджреНрднрд╡ рдХреА рдкреГрд╖реНрдарднреВрдорд┐
- рдПрди-рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реАрдЖрдИ/рд╕реАрдбреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХреА рд╕рдорд╛рдзрд╛рди
рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреБрд░рд╛рдиреА рдпрд╛рджреЛрдВ рдХрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдРрд╕рд╛ рдЕрдиреБрднрд╡ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕реНрд╡рдпрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд╣реА рд╣реБрдЖ
рд╡рд░реНрд╖ 2015
рд╣рдордиреЗ рдЕрднреА-рдЕрднреА рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛, рддрдм рд╣рдореЗрдВ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг, DevOps рдФрд░ рдЕрдиреНрдп рдлреИрд╢рдиреЗрдмрд▓ рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рдерд╛ред рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рдХреЛ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рдЕрдкрдиреА рдорд╢реАрди рд╕реЗ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдпрджрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдЗрдХрдЯреНрдард╛, рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд .apk
рдФрд░ рдЗрд╕реЗ Google рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛, рдлрд┐рд░ iOS рдХреЗ рд▓рд┐рдП Xcode рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрддреНрдХрд╛рд▓реАрди рд╡рд┐рддрд░рдг рдЯреВрд▓ рдиреЗ рд╣рдореЗрдВ рд╢рд╛рдирджрд╛рд░ рд╢рд╛рдореЗрдВ рджреАрдВ - рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдЕрдХреНрд╕рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП рдФрд░ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рдбреЗрд╡рд▓рдкрд░ рдорд╣реАрдиреЗ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред
рд╡рд░реНрд╖ 2016
рд╣рдо рдмрдбрд╝реЗ рд╣реЛ рдЧрдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдЪрд╛рд░ рдереЗ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рджрд┐рди рд╕реЗ рдХреИрд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдПрдХ рджреВрд╕рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреА рд╕рд╛рдордиреЗ рдЖрдпрд╛, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рдУрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ред рдЙрд╕реА рд╡рд░реНрд╖, рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЬреЗрдирдХрд┐рдВрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдмрд╣реБрдд рд╕реА рдбрд░рд╛рд╡рдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреАрдВ, рдЬреЛ рдлрд╛рд╕реНрдЯрд▓реЗрди рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдорд╛рди рдереАрдВред
$ 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
рдЗрд╕ рд╕рд╛рд▓ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдлрд╛рд╕реНрдЯрд▓реЗрди рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рд╣реЛрддреА рд╣реИред рддрдм рдЙрддрдиреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдереА рдЬрд┐рддрдиреА рдЕрдм рд╣реИ - рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдФрд░ рдЙрд╕ рд╕рдордп рдЙрдкрдХрд░рдг рд╕реНрд╡рдпрдВ рдЕрднреА рднреА рдХрдЪреНрдЪрд╛ рдерд╛: рд▓рдЧрд╛рддрд╛рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдиреЗ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдирд┐рд░рд╛рд╢ рдХрд┐рдпрд╛ рдФрд░ рдЬрд┐рд╕ рдЬрд╛рджреБрдИ рд╕реНрд╡рдЪрд╛рд▓рди рдХрд╛ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ рдЙрд╕ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдирд╛ рдХрдард┐рди рдерд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд╛рд╕реНрдЯрд▓реЗрди рдХреЛрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ рд╣реИрдВ 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 рдХреА рдЧрд░реНрдорд┐рдпреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЕрднреА рднреА рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реЗ рдлрд╛рд╕реНрдЯрд▓реЗрди рдХреА рдУрд░ рджреЗрдЦрд╛ред
рдХрд╛рд░реНрдп #1: рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд░рдгреЛрдВ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд╛рд╕реНрдЯрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ
рдЬрдм рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдХреА, рддреЛ рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЗрдирдХрд┐рдВрд╕ рдореЗрдВ рдПрдХ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рднреА рдЪрд░рдгреЛрдВ рдФрд░ рдмреИрд╕рд╛рдЦрд┐рдпреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рдлрд╝реБрдЯрдХреНрд▓реЙрде рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рдереАред рд╣рдордиреЗ рдЕрднреА рддрдХ рдЪрд░рдг рджрд░ рдЪрд░рдг рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдФрд░ рд╡рд┐рднрд╛рдЬрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ рдФрд░ 4 рдЪрд░рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЬреЛ рд╣рдорд╛рд░реЗ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддреЗ рд╣реИрдВ:
- рдирд┐рд░реНрдорд╛рдг - рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛, рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдирд╛,
- рдкрд░реАрдХреНрд╖рдг - рдбреЗрд╡рд▓рдкрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдирд╛, рдХрд╡рд░реЗрдЬ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛,
- рд╕реЛрдирд╛рд░ - рд╕рднреА рд▓рд┐рдВрдЯрд░ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рднреЗрдЬрддрд╛ рд╣реИ,
- рдкрд░рд┐рдирд┐рдпреЛрдЬрди - рдЕрд▓реНрдлрд╛ (рдЯреЗрд╕реНрдЯрдлреНрд▓рд╛рдЗрдЯ) рдкрд░ рдПрдХ рдЖрд░реНрдЯрд┐рдлреИрдХреНрдЯ рднреЗрдЬрдирд╛ред
рдФрд░ рдпрджрд┐ рдЖрдк рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдлрд╛рд╕реНрдЯрдлрд╝рд╛рдЗрд▓ рдорд┐рд▓реЗрдЧреА:
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
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ рдмреИрд╕рд╛рдЦрд┐рдпреЛрдВ рдХреА рд╣рдореЗрдВ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рд░рд╛рдХреНрд╖рд╕реА рд╕рд╛рдмрд┐рдд рд╣реБрдИ:
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
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпреЗ рдмрд┐рд▓реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ - рд╕реНрдХреАрдорд╛, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдкреНрд░реЛрд╡рд┐рдЬрди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рд╕рд╛рде рд╣реА рд╡рд┐рддрд░рдг рдкреИрд░рд╛рдореАрдЯрд░ - рдбреЗрд╡рд▓рдкрд░ рдЦрд╛рддреЗ рдХреА рдРрдкреНрдкрд▓ рдЖрдИрдбреА, рдкрд╛рд╕рд╡рд░реНрдб, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдИрдбреА, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдкрд░ред рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЗрди рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ - Gymfile
, Matchfile
╨╕ Appfile
.
рдЕрдм рдЬреЗрдирдХреАрдВрд╕ рдореЗрдВ рдЖрдк рдЫреЛрдЯреЗ рдХрдорд╛рдВрдб рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджреГрд╢реНрдп рдХреЛ рдзреБрдВрдзрд▓рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдВрдЦреЛрдВ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy
рд╣реБрд░реНрд░реЗ, рд╣рдо рдорд╣рд╛рди рд╣реИрдВ
рддреБрдореНрд╣реЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛? рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЖрджреЗрд╢. рд╕рд╛рдлрд╝-рд╕реБрдерд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдлрд╝рд╛рд╕реНрдЯрд▓реЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрд░реАрдиреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рддред рдЦрд╝реБрд╢реА рдордирд╛рддреЗ рд╣реБрдП, рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдЧрдП рдФрд░ рдЙрдирд╕реЗ рдЕрдкрдиреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬрд╝реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред
рд▓реЗрдХрд┐рди рд╕рдордп рд░рд╣рддреЗ рд╣рдореЗрдВ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╣рдореЗрдВ рднреА рдЙрдиреНрд╣реАрдВ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА 20 рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдВрдЧреА рдЬреЛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдирд╛ рдЬреАрд╡рди рдЬреАрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреА, рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЪрд▓реА рдЬрд╛рдПрдВрдЧреА, рдФрд░ рд╣рдорд╛рд░реА рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рдереА. рдФрд░, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рджрд░реНрдж рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдХрд╛рд░реНрдп #2: рдПрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдлрд╛рд╕реНрдЯрдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдЕрдм рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдЪрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдЪрд▓реЗрдВред рд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рд╕рдордп рд╣рдордиреЗ рдЗрд╕реЗ рдЦрд░рд╛рдм рдХрд┐рдпрд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рди рддреЛ рдлрд╛рд╕реНрдЯрд▓реЗрди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдереА, рди рд╣реА рд░реВрдмреА рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдлрд╛рд╕реНрдЯрд▓реЗрди рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рд╣реА рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг - рд╣рд░ рдХреЛрдИ рдЬрд┐рд╕рдиреЗ рдлрд╛рд╕реНрдЯрд▓реЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рд╡рд╣ рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рддрдХ рд╣реА рд╕реАрдорд┐рдд рдерд╛ред рдПрдХ рдбреЗрд╡рд▓рдкрд░.
рдлрд╛рд╕реНрдЯрд▓реЗрди рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд┐рдЪреЗрди рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрдЯ рдХрд░рдХреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ:
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
рдЕрдм, рдлрд╛рд╕реНрдЯрд▓реЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЗрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪрд╛рдпрд╛ рдЬрд╛рдПред рдлрд╛рд╕реНрдЯрд▓реЗрди рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ: .env
, .env.default
, .env.development
.
рдФрд░ рдлрд┐рд░ рд╣рдордиреЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЖрдЗрдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдлрд╛рд╕реНрдЯрд▓реЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЗрд╕рдХреА рдореЗрдЯрд╛ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬреА рд░рдЦреЗрдВ .env.appName
.
рдЕрдкрдиреЗ Fastfile
, Appfile
, Matchfile
╨╕ Gymfile
, рд╣рдордиреЗ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рднрдВрдбрд╛рд░ рдореЗрдВ рдЫрд┐рдкрд╛ рджрд┐рдпрд╛ред рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреА рдкрд╛рд╕рд╡рд░реНрдб рдХреБрдВрдЬрд┐рдпреЛрдВ рд╡рд╛рд▓реА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓ рд╡рд╣рд╛рдВ рдЫрд┐рдкреА рд╣реБрдИ рдереА - .env
.
рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
рд╕реАрдЖрдИ рдкрд░, рдХреЙрд▓ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ; рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреБрдВрдЬреА рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИ:
# 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
рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлрд╛рд╕реНрдЯрд▓реЗрди рдХреЗ рдкрд╛рд╕ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ import_from_git
, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдп рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрджрд┐ рдЖрдк "рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрдВрджрд░" рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ action
.
Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ ReactNative рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╕реЗрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдлрд╝рд╛рдЗрд▓реЗрдВ рдПрдХ рд╣реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рд╣реИрдВ iOS
, android
╨╕ react_native
.
рдЬрдм рд░рд┐рд▓реАрдЬрд╝ рдЯреАрдо рдХреБрдЫ рдирдпрд╛ рдЪрд░рдг рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреА рд╣реИ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди MR рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ git рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдм рдЯреВрдЯреА рд╣реБрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рджреЛрд╖рд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдм рдЖрдкрдХреЛ рдЗрд╕реЗ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдм рдЗрддрдирд╛ рддреЛ рдкрдХреНрдХрд╛ рд╣реИ
рдкрд╣рд▓реЗ, рд╣рдордиреЗ рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдпрд╣ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдерд╛ рдЬрдм рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХрд╛ рдХрд╛рд░рдг рд╕рд░рд▓ рдЯрд╛рдЗрдкреЛ рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдЕрдм рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдиреНрдпреВрдирддрдо рд╣реЛ рдЧрдпреА рд╣реИрдВред рдкрд░рд┐рд╡рд░реНрддрди рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рдирдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдореЗрдВ 15 рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ - рд╕реАрдЖрдИ рдкрд░ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдЪрд╛рдмрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдмрд┐рдВрджреБ рдЕрд╕реНрдкрд╖реНрдЯ рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдпрджрд┐ рд▓реЗрдЦ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд▓рд┐рдЦреВрдВрдЧрд╛; рдореБрдЭреЗ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдпрд╛ рд╕реБрдЭрд╛рд╡ "рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ" рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдпрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдкрд░ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреА
рд╕реНрд░реЛрдд: www.habr.com