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

рдореЛрдмрд╛рдЗрд▓ CICD рдЕрдиреБрднрд╡: рдзреЗрд░реИ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдлрд╛рд╕реНрдЯрд▓реЗрди рдорд╛рдирдХ
рдо рдлрд╛рд╕реНрдЯрд▓реЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдореЛрдмрд╛рдЗрд▓ рдПрдкрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рд░ рдбреЗрд▓рд┐рднрд░реАрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред рд╣рд╛рдореА рдХрд╕рд░реА рд╕рдмреИ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдорд╛ CI/CD рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВ, рд╣рд╛рдореА рддреНрдпрд╣рд╛рдБ рдХрд╕рд░реА рдкреБрдЧреНрдпреМрдВ рд░ рдЕрдиреНрддрдорд╛ рдХреЗ рднрдпреЛред

рдЙрдкрдХрд░рдгрдорд╛ рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рдЫ, рдЬреБрди рд╣рд╛рдореАрд╕рдБрдЧ рд╕реБрд░реБрдорд╛ рдЕрднрд╛рд╡ рдерд┐рдпреЛ, рддреНрдпрд╕реИрд▓реЗ рдо рдЬрд╛рдирд╛рдЬрд╛рдиреА рдЙрдкрдХрд░рдгрд▓рд╛рдИ рд╡рд┐рд╕реНрддреГрдд рд░реВрдкрдорд╛ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫреИрди, рддрд░ рд╣рд╛рдореАрд╕рдБрдЧ рддреНрдпрд╕рдмреЗрд▓рд╛ рдХреЗ рдерд┐рдпреЛ рднрдиреЗрд░ рдорд╛рддреНрд░ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрдиреЗрдЫреБ:

рд▓реЗрдЦ рджреБрдИ рднрд╛рдЧрд╣рд░реБ рдорд┐рд▓реЗрд░ рдмрдиреЗрдХреЛ рдЫ:

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

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

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдкрдорд╛ рдпреЛ рдпрд╕рд░реА рднрдПрдХреЛ рдЫ

рд╡рд░реНрд╖ рез 2015 XNUMXред

рд╣рд╛рдореАрд▓реЗ рднрд░реНрдЦрд░реИ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрди рдерд╛рд▓реНрдпреМрдВ, рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг, DevOps рд░ рдЕрдиреНрдп рдлреИрд╢рдиреЗрдмрд▓ рдЪреАрдЬрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗрд╣реА рдерд╛рд╣рд╛ рдерд┐рдПрдиред рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдЕрдкрдбреЗрдЯ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдЖрдлреИрд▓реЗ рдЖрдлреНрдиреЛ рдореЗрд╕рд┐рдирдмрд╛рдЯ рд░реЛрд▓ рдЖрдЙрдЯ рдЧрд░реЗрдХреЛ рдерд┐рдпреЛред рд░ рдпрджрд┐ рдПрдиреНрдбреНрд░реЛрдЗрдбрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рдПрдХрджрдо рд╕рд░рд▓ рдЫ - рднреЗрд▓рд╛, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ .apk рд░ рдпрд╕рд▓рд╛рдИ Google рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдХрдиреНрд╕реЛрд▓рдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░реНтАНрдпреЛ, рддреНрдпрд╕рдкрдЫрд┐ iOS рдХреЛ рд▓рд╛рдЧрд┐ Xcode рдорд╛рд░реНрдлрдд рд╡рд┐рддрд░рдг рдЙрдкрдХрд░рдгрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдареВрд▓реЛ рд╕рд╛рдБрдЭ рдЫреЛрдбреНрдпреЛ - рд╕рдВрдЧреНрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕рд╣рд░реВ рдкреНрд░рд╛рдп: рддреНрд░реБрдЯрд┐рд╣рд░реВрдорд╛ рд╕рдорд╛рдкреНрдд рднрдпреЛ рд░ рд╣рд╛рдореАрд▓реЗ рдлреЗрд░рд┐ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛред рдпреЛ рдкрддреНрддрд╛ рд▓рд╛рдЧреНрдпреЛ рдХрд┐ рд╕рдмреИрднрдиреНрджрд╛ рдЙрдиреНрдирдд рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓реЗ рдорд╣рд┐рдирд╛рдорд╛ рдзреЗрд░реИ рдкрдЯрдХ рдХреЛрдб рд▓реЗрдЦреНрджреИрди, рдмрд░реБ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЬрд╛рд░реА рдЧрд░реНрджрдЫред

рд╡рд░реНрд╖ рез 2016 XNUMXред

рд╣рд╛рдореА рд╣реБрд░реНрдХреЗрдХрд╛ рдерд┐рдпреМрдВ, рд╣рд╛рдореАрд▓реЗ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рдХрд╕рд░реА рд░рд┐рд▓рд┐рдЬрдХреЛ рд▓рд╛рдЧрд┐ рдкреВрд░реИ рджрд┐рдирдмрд╛рдЯ рдореБрдХреНрдд рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рд╕реЛрдЪреЗрдХрд╛ рдерд┐рдпреМрдВ, рд░ рджреЛрд╕реНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрдирд┐ рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛ, рдЬрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рдирддрд░реНрдл рдердк рдзрдХреЗрд▓реНрдпреЛред рддреНрдпрд╣реА рд╡рд░реНрд╖, рд╣рд╛рдореАрд▓реЗ рдЬреЗрдирдХрд┐рдиреНрд╕рд▓рд╛рдИ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдпреМрдВ рд░ рдбрд░рд╛рд╡рдиреА рд▓рд┐рдкрд┐рд╣рд░реВрдХреЛ рдЧреБрдЪреНрдЫрд╛ рд▓реЗрдЦреНрдпреМрдВ, рдЬреБрди рдлрд╛рд╕реНрдЯрд▓реЗрдирд▓реЗ рдпрд╕рдХреЛ рдХрд╛рдЧрдЬрд╛рддрдорд╛ рджреЗрдЦрд╛рдЙрдБрджрдЫред

$ 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 XNUMXред

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

рдпрджреНрдпрдкрд┐, рдлрд╛рд╕реНрдЯрд▓реЗрди рдХреЛрд░рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдПрдХрд╛ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ рд╣реБрдиреН 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 рдЪрд░рдгрд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрдпреМрдВ рдЬреБрди рд╣рд╛рдореНрд░реЛ CI/CD рдХреЛ рд╡рд░реНрдгрдирд╕рдБрдЧ рдорд┐рд▓реНрдЫ:

  • рдирд┐рд░реНрдорд╛рдг - рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ, рдЕрднрд┐рд▓реЗрдЦ рд╕рдВрдХрд▓рди,
  • рдкрд░реАрдХреНрд╖рдг - рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдПрдХрд╛рдЗ рдкрд░реАрдХреНрд╖рдг, рдХрднрд░реЗрдЬ рдЧрдгрдирд╛,
  • рд╕реЛрдирд╛рд░ - рд╕рдмреИ рд▓рд┐рдиреНрдЯрд░рд╣рд░реВ рд╕реБрд░реВ рдЧрд░реНрджрдЫ рд░ рд╕реЛрдирд╛рд░рдХреНрдпреВрдмрдорд╛ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдкрдард╛рдЙрдБрджрдЫ,
  • deploy тАФ рдЕрд▓реНрдлрд╛ (TestFlight) рдорд╛ рдХрд▓рд╛рдХреГрддрд┐ рдкрдард╛рдЙрдБрджреИред

рд░ рдпрджрд┐ рддрдкрд╛рдИрдВ рд╡рд┐рд╡рд░рдгрд╣рд░реВрдорд╛ рдЬрд╛рдиреБрднрдПрди рднрдиреЗ, рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдЫреЛрдбреЗрд░, рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ:

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

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

рдХрд╛рд░реНрдп #2: N рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХрд▓ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдЕрдм рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЧрд╛рд╣реНрд░реЛ рдЫреИрди - рдЪрд░ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рдЬрд╛рдФрдВред рд╣реЛ, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рднрдпреЛред рддрд░ рддреНрдпреЛ рдХреНрд╖рдгрдорд╛ рдЬрдм рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рдмрд┐рдЧрд╛рд░реНрдпреМрдВ, рд╣рд╛рдореАрд╕рдБрдЧ рди рдд рдлрд╛рд╕реНрдЯрд▓реЗрдирдорд╛ рдиреИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдерд┐рдпреЛ, рди рд░реБрдмреАрдорд╛, рдЬрд╕рдорд╛ рдлрд╛рд╕реНрдЯрд▓реЗрди рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рди рдд рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ - рдлрд╛рд╕реНрдЯрд▓реЗрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓реЗрдЦреНрдиреЗ рд╕рдмреИрдЬрдирд╛ рддреНрдпрд╕рдмреЗрд▓рд╛ рдПрдЙрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЙрджрд╛рд╣рд░рдгрдорд╛ рд╕реАрдорд┐рдд рдерд┐рдПред рдПрдХ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ред

рдлрд╛рд╕реНрдЯрд▓реЗрдирд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдгреАрдп рдЪрд░рд╣рд░реВ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рд╕рдХреНрдЫ, рд░ рд╣рд╛рдореАрд▓реЗ рдХрд┐рдЪреЗрди рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрдЯ рдЧрд░реЗрд░ рдкрд╣рд┐рд▓реЗ рдиреИ рдпреЛ рдкреНрд░рдпрд╛рд╕ рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫреМрдВ:

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.
рддрдкрд╛рдИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдпрд╣рд╛рдБ.

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

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

рдЕрд╣рд┐рд▓реЗрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рд╕рдорд╛рдзрд╛рди рдЫреЛрдбреНрдиреБрд╣реЛрд╕реН, рдпрджреНрдпрдкрд┐ рдлрд╛рд╕реНрдЯрд▓реЗрдирд╕рдБрдЧ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рдорд╛рд░реНрдлрдд рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреЗ рд╕рдорд╛рдзрд╛рди рдЫ рдХрд╛рд░реНрдп import_from_git, рддрд░ рдпрд╕рд▓реЗ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓рдХрд╛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдХрд╛рдо рдЧрд░реНрдЫ, рддрд░ рдЕрдиреНрдп рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╣реЛрдЗрдиред рдпрджрд┐ рддрдкрд╛рдЗрдБ "рд╕рд╛рдБрдЪреНрдЪреИ рд╕реБрдиреНрджрд░" рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдЖрдлреНрдиреЛ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ action.

рдПрдЙрдЯреИ рд╕реЗрдЯ рдПрдиреНрдбреНрд░реЛрдЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ ReactNative рдХреЛ рд▓рд╛рдЧрд┐ рдмрдирд╛рдЗрдПрдХреЛ рдерд┐рдпреЛ, рдлрд╛рдЗрд▓рд╣рд░реВ рдПрдЙрдЯреИ рднрдгреНрдбрд╛рд░рдорд╛ рдЫрдиреН, рддрд░ рд╡рд┐рднрд┐рдиреНрди рд╢рд╛рдЦрд╛рд╣рд░реВрдорд╛ iOS, android ╨╕ react_native.

рдЬрдм рд░рд┐рд▓реАрдЬ рдЯреЛрд▓реАрд▓реЗ рдХреЗрд╣рд┐ рдирдпрд╛рдБ рдЪрд░рдг рдердкреНрди рдЪрд╛рд╣рдиреНрдЫ, рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ MR рдорд╛рд░реНрдлрдд git рдорд╛ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдиреНрдЫ, рддреНрдпрд╣рд╛рдБ рдЕрдм рдХреБрдиреИ рдЯреБрдХреНрд░рд╛ рд▓рд┐рдкрд┐рд╣рд░реВрдХреЛ рдЕрдкрд░рд╛рдзреАрд╣рд░реВ рдЦреЛрдЬреНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрди, рд░ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдЕрдм рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рд▓рд╛рдИ рддреЛрдбреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрдкрд░реНрдЫред

рдЕрдм рдпреЛ рдкрдХреНрдХрд╛ рдЫ

рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рдХрд╛рдпрдо рд░рд╛рдЦреНрди, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрди рд░ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХрд╣рд░реВрдХреЛ рд╕рдмреИ рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рдареАрдХ рдЧрд░реНрди рд╕рдордп рдмрд┐рддрд╛рдпреМрдВред рдпреЛ рдзреЗрд░реИ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдерд┐рдпреЛ рдЬрдм рддреНрд░реБрдЯрд┐рд╣рд░реВ рд░ рд░рд┐рд▓реАрдЬрд╣рд░реВрдорд╛ рдбрд╛рдЙрдирдЯрд╛рдЗрдордХреЛ рдХрд╛рд░рдгрд╣рд░реВ рд╕рд╛рдзрд╛рд░рдг рдЯрд╛рдЗрдкреЛрд╣рд░реВ рдерд┐рдП рдЬреБрди рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВрдХреЛ рдЬрдореНрдмрд▓рдорд╛ рдЯреНрд░реНрдпрд╛рдХ рд░рд╛рдЦреНрди рдзреЗрд░реИ рдЧрд╛рд╣реНрд░реЛ рдерд┐рдпреЛред рдЕрдм рддреНрдпрд╕реНрддрд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдиреНрдпреВрдирддрдордорд╛ рдХрдо рднрдПрдХрд╛ рдЫрдиреНред рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдПрдХреИрдЪреЛрдЯрд┐ рд╕рдмреИ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдорд╛ рд░реЛрд▓ рдЖрдЙрдЯ рд╣реБрдиреНрдЫрдиреНред рд░ рдпреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ рдирдпрд╛рдБ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд░рд╛рдЦреНрди 15 рдорд┐рдиреЗрдЯ рд▓рд╛рдЧреНрдЫ - CI рдорд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рдХреЛ рднрдгреНрдбрд╛рд░рдорд╛ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдердкреНрдиреБрд╣реЛрд╕реНред

рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рдПрдиреНрдбреНрд░реЛрдЗрдб рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХреЛ рд▓рд╛рдЧрд┐ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓рдХреЛ рдмрд┐рдиреНрджреБ рдЕрд╕реНрдкрд╖реНрдЯ рд░рд╣рдиреНрдЫ; рдпрджрд┐ рд▓реЗрдЦ рд░реЛрдЪрдХ рдЫ рднрдиреЗ, рдо рдПрдХ рдирд┐рд░рдиреНрддрд░рддрд╛ рд▓реЗрдЦреНрдиреЗрдЫреБред рдо рддрдкрд╛рдИрдХрд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ рд╡рд╛ рд╕реБрдЭрд╛рд╡рд╣рд░реВ "рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╕рд░реА рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ" рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рд╡рд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдордорд╛ рджреЗрдЦреНрди рдкрд╛рдЙрдБрджрд╛ рдЦреБрд╕реА рд╣реБрдиреЗрдЫреБред bashkirova.

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди