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

рдореЛрдмрд╛рдЗрд▓ CICD рдЕрдиреБрднрд╡: рдЕрдиреЗрдХ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА рдПрдХ рдлрд╛рд╕реНрдЯрд▓реЗрди рдорд╛рдирдХ
рдорд▓рд╛ рдлрд╛рд╕реНрдЯрд▓реЗрди рд╡рд╛рдкрд░реВрди рдореЛрдмрд╛рдЗрд▓ рдЕреЕрдкреНрд╕рд╕рд╛рдареА рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг рдЖрдгрд┐ рд╡рд┐рддрд░рдгрд╛рдмрджреНрджрд▓ рдмреЛрд▓рд╛рдпрдЪреЗ рдЖрд╣реЗ. рдЖрдореНрд╣реА рд╕рд░реНрд╡ рдореЛрдмрд╛рдИрд▓ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╡рд░ CI/CD рдХрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЛ, рдЖрдореНрд╣реА рддрд┐рдереЗ рдХрд╕реЗ рдкреЛрд╣реЛрдЪрд▓реЛ рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рдХрд╛рдп рдЭрд╛рд▓реЗ.

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

рд▓реЗрдЦрд╛рдд рджреЛрди рднрд╛рдЧ рдЖрд╣реЗрдд:

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

рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рдЬреБрдиреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдВрд╕рд╛рдареА рдЕрдзрд┐рдХ рдиреЙрд╕реНрдЯреЕрд▓реНрдЬрд┐рдпрд╛ рдЖрд╣реЗ, рдЖрдгрд┐ рджреБрд╕рд░рд╛ рдПрдХ рдЕрдиреБрднрд╡ рдЖрд╣реЗ рдЬреЛ рдЖрдкрдг рд╕реНрд╡рддрдГрд▓рд╛ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддрд╛.

рдРрддрд┐рд╣рд╛рд╕рд┐рдХрджреГрд╖реНрдЯреНрдпрд╛ рд╣реЗ рдЕрд╕реЗрдЪ рдШрдбрд▓реЗ

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

рдЖрдореНрд╣реА рдиреБрдХрддреЗрдЪ рдореЛрдмрд╛рдИрд▓ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА, рддреНрдпрд╛рдирдВрддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг, DevOps рдЖрдгрд┐ рдЗрддрд░ рдлреЕрд╢рдиреЗрдмрд▓ рдЧреЛрд╖реНрдЯреАрдВрдмрджреНрджрд▓ рдХрд╛рд╣реАрд╣реА рдорд╛рд╣рд┐рдд рдирд╡реНрд╣рддреЗ. рдкреНрд░рддреНрдпреЗрдХ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рдбреЗрд╡реНрд╣рд▓рдкрд░рдиреЗ рд╕реНрд╡рддрдГ рддреНрдпрд╛рдЪреНрдпрд╛ рдорд╢рд┐рдирдордзреВрди рдЖрдгрд▓реЗ рд╣реЛрддреЗ. рдЖрдгрд┐ рдЬрд░ Android рд╕рд╛рдареА рддреЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ - рдПрдХрддреНрд░ рдХреЗрд▓реЗрд▓реЗ, рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХреЗрд▓реЗрд▓реЗ .apk рдЖрдгрд┐ рддреЗ Google Developer Console рд╡рд░ рдЕрдкрд▓реЛрдб рдХреЗрд▓реЗ, рдирдВрддрд░ 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: рд╕рд░реНрд╡ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд░рдгрд╛рдВрдЪрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджреНрдпрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд╛

рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА, рддреЗрд╡реНрд╣рд╛ рдЖрдордЪреНрдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЬреЗрдирдХрд┐рдиреНрд╕рдордзреАрд▓ рдПрдХрд╛ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рд╕рд░реНрд╡ рдкрд╛рдпрд▒реНрдпрд╛ рдЖрдгрд┐ рдХреНрд░реЕрдЪреЗрд╕ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкрд╛рдпрдШрдбреНрдпрд╛рдВрд╕рд╛рд░рдЦреНрдпрд╛ рджрд┐рд╕рдд рд╣реЛрддреНрдпрд╛. рдЖрдореНрд╣реА рдЕрджреНрдпрд╛рдк рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЖрдгрд┐ рдЯрдкреНрдкреНрдпрд╛рдиреБрд╕рд╛рд░ рд╡рд┐рднрд╛рдЧрдгреАрд╡рд░ рд╕реНрд╡рд┐рдЪ рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реА.

рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХрд╛рдп рдЖрд╣реЗ рддреЗ рдЖрдореНрд╣реА рдкрд╛рд╣рд┐рд▓реЗ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ CI/CD рдЪреНрдпрд╛ рд╡рд░реНрдгрдирд╛рд╢реА рдЬреБрд│рдгрд╛рд░реЗ 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 рдЕрд╕реЗрдВрдмреНрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрд╕рддреАрд▓ рдЬреНрдпрд╛ рдПрдХрд╛ рдорд╛рд░реНрдЧрд╛рдиреЗ рдХрд┐рдВрд╡рд╛ рджреБрд╕рд░реНтАНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рддреНрдпрд╛рдВрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдЬреАрд╡рди рдЬрдЧреВ рд▓рд╛рдЧрддреАрд▓, рддреНрдпрд╛рдВрдирд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдгреЗ рдЕрдзрд┐рдХ рдХрдареАрдг рд╣реЛрдИрд▓, рдХрд╛рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд┐рдкреЙрдЭрд┐рдЯрд░реАрдЬрдордзреНрдпреЗ рдЬрд╛рддреАрд▓, рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рддрд┐рдереЗ рдкреНрд░рд╡реЗрд╢ рдирд╡реНрд╣рддрд╛. рдЖрдгрд┐, рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдкрд▓реНрдпрд╛ рд╡реЗрджрдирд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреЗ рд╢рдХреНрдп рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.

рдореЛрдмрд╛рдЗрд▓ 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.

рдЕрдБрдбреНрд░реЙрдЗрдб рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдЖрдгрд┐ рд░рд┐рдПрдХреНрдЯрдиреЗрдЯрд┐рд╡реНрд╣рд╕рд╛рдареА рд╕рдорд╛рди рд╕рдВрдЪ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдд рдЖрд▓рд╛ рд╣реЛрддрд╛, рдлрд╛рдЗрд▓реНрд╕ рдПрдХрд╛рдЪ рднрд╛рдВрдбрд╛рд░рд╛рдд рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╢рд╛рдЦрд╛рдВрдордзреНрдпреЗ рдЖрд╣реЗрдд iOS, android ╨╕ react_native.

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

рдЖрддрд╛ рддреЗ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╣реЗ

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

рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА Android рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрд╡рд╛рдХреНрд╖рд░реАрд╕рд╛рдареА рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓рдЪрд╛ рдореБрджреНрджрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд░рд╛рд╣рд┐рд▓рд╛ рдЖрд╣реЗ; рдЬрд░ рд▓реЗрдЦ рдордиреЛрд░рдВрдЬрдХ рдЕрд╕реЗрд▓ рддрд░ рдореА рдкреБрдвреЗ рд▓рд┐рд╣реАрди. рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдорд╡рд░ "рддреБрдореНрд╣реА рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд╕реЗ рдХрд░рд╛рд▓" рддреБрдордЪреЗ рдкреНрд░рд╢реНрди рдХрд┐рдВрд╡рд╛ рд╕реВрдЪрдирд╛ рдкрд╛рд╣реВрди рдорд▓рд╛ рдЖрдирдВрдж рд╣реЛрдИрд▓ рдмрд╛рд╖реНрдХрд┐рд░реЛрд╡рд╛.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛