рдореЛрдмрд╛рдЗрд▓ рд╕реАрдЖрдИрд╕реАрдбреА рдЕрдиреБрднрд╡: рдХрдИ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╛рд╕реНрдЯрд▓реЗрди рдорд╛рдирдХ

рдореЛрдмрд╛рдЗрд▓ рд╕реАрдЖрдИрд╕реАрдбреА рдЕрдиреБрднрд╡: рдХрдИ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╛рд╕реНрдЯрд▓реЗрди рдорд╛рдирдХ
рдореИрдВ рдлрд╛рд╕реНрдЯрд▓реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЛрдмрд╛рдЗрд▓ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдФрд░ рдбрд┐рд▓реАрд╡рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╣рдо рд╕рднреА рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рд╡рд╣рд╛рдВ рддрдХ тАЛтАЛрдХреИрд╕реЗ рдкрд╣реБрдВрдЪреЗ рдФрд░ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖред

рдЯреВрд▓ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рдореМрдЬреВрдж рд╣реИ, рдЬрд┐рд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХрдореА рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЯреВрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡рд╣реА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрдм рдерд╛:

рд▓реЗрдЦ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реИрдВ:

  • рдХрдВрдкрдиреА рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рдЙрджреНрднрд╡ рдХреА рдкреГрд╖реНрдарднреВрдорд┐
  • рдПрди-рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реАрдЖрдИ/рд╕реАрдбреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХреА рд╕рдорд╛рдзрд╛рди

рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреБрд░рд╛рдиреА рдпрд╛рджреЛрдВ рдХрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдРрд╕рд╛ рдЕрдиреБрднрд╡ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕реНрд╡рдпрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд╣реА рд╣реБрдЖ

рд╡рд░реНрд╖ 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

рдЕрдм, рдлрд╛рд╕реНрдЯрд▓реЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЗрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪрд╛рдпрд╛ рдЬрд╛рдПред рдлрд╛рд╕реНрдЯрд▓реЗрди рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ: dotenv рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ. рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬрд┐рдпрд╛рдБ рд▓реЛрдб рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдлрд╛рд╕реНрдЯрд▓реЗрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВ .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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ