рдорд▓рд╛ рдлрд╛рд╕реНрдЯрд▓реЗрди рд╡рд╛рдкрд░реВрди рдореЛрдмрд╛рдЗрд▓ рдЕреЕрдкреНрд╕рд╕рд╛рдареА рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг рдЖрдгрд┐ рд╡рд┐рддрд░рдгрд╛рдмрджреНрджрд▓ рдмреЛрд▓рд╛рдпрдЪреЗ рдЖрд╣реЗ. рдЖрдореНрд╣реА рд╕рд░реНрд╡ рдореЛрдмрд╛рдИрд▓ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╡рд░ CI/CD рдХрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЛ, рдЖрдореНрд╣реА рддрд┐рдереЗ рдХрд╕реЗ рдкреЛрд╣реЛрдЪрд▓реЛ рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рдХрд╛рдп рдЭрд╛рд▓реЗ.
рдЯреВрд▓рд╡рд░ рдиреЗрдЯрд╡рд░реНрдХрд╡рд░ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдкреБрд░реЗрд╢реА рд╕рд╛рдордЧреНрд░реА рдЖрд╣реЗ, рдЬреНрдпрд╛рдЪреА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдХрдорддрд░рддрд╛ рд╣реЛрддреА, рдореНрд╣рдгреВрди рдореА рдЬрд╛рдгреВрдирдмреБрдЬреВрди рддреНрдпрд╛ рд╕рд╛рдзрдирд╛рдЪреЗ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреЗрд╡реНрд╣рд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХрд╛рдп рд╣реЛрддреЗ рдпрд╛рдЪрд╛ рд╕рдВрджрд░реНрдн рдШреЗрдИрди:
рдЕрдзрд┐рдХреГрдд рдлрд╛рд╕реНрдЯрд▓реЗрди рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдЗрддрд░ рдХрдВрдкрдиреНрдпрд╛рдВрдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рдЖрдореНрд╣реА рдлрд╛рд╕реНрдЯрд▓реЗрди рд╡рд╛рдкрд░реВрди iOS рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдЪреА рдЕрд╕реЗрдВрдмреНрд▓реА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рддреЛ
рд▓реЗрдЦрд╛рдд рджреЛрди рднрд╛рдЧ рдЖрд╣реЗрдд:
- рдХрдВрдкрдиреАрдордзреНрдпреЗ рдореЛрдмрд╛рдИрд▓ 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 рдЕрд╕реЗрдВрдмреНрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрд╕рддреАрд▓ рдЬреНрдпрд╛ рдПрдХрд╛ рдорд╛рд░реНрдЧрд╛рдиреЗ рдХрд┐рдВрд╡рд╛ рджреБрд╕рд░реНтАНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рддреНрдпрд╛рдВрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдЬреАрд╡рди рдЬрдЧреВ рд▓рд╛рдЧрддреАрд▓, рддреНрдпрд╛рдВрдирд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдгреЗ рдЕрдзрд┐рдХ рдХрдареАрдг рд╣реЛрдИрд▓, рдХрд╛рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд┐рдкреЙрдЭрд┐рдЯрд░реАрдЬрдордзреНрдпреЗ рдЬрд╛рддреАрд▓, рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рддрд┐рдереЗ рдкреНрд░рд╡реЗрд╢ рдирд╡реНрд╣рддрд╛. рдЖрдгрд┐, рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдкрд▓реНрдпрд╛ рд╡реЗрджрдирд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреЗ рд╢рдХреНрдп рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.
рдХрд╛рд░реНрдп #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
рдЖрддрд╛, рдлрд╛рд╕реНрдЯрд▓реЗрди рдлрд╛рдЗрд▓реНрд╕рдордзреНрдпреЗ рдпрд╛ рдХреА рд╡рд╛рдкрд░рдгреЗ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛ рддреЗрдереЗ рдХрд╢рд╛ рд╡рд┐рддрд░рд┐рдд рдХрд░рд╛рдпрдЪреНрдпрд╛ рд╣реЗ рд╢реЛрдзреВрди рдХрд╛рдврд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ. рдлрд╛рд╕реНрдЯрд▓реЗрдирдХрдбреЗ рдпрд╛рд╡рд░ рдЙрдкрд╛рдп рдЖрд╣реЗ: .env
, .env.default
, .env.development
.
рдЖрдгрд┐ рдордЧ рд╣реА рд▓рд╛рдпрдмреНрд░рд░реА рдЬрд░рд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рд╡рд╛рдкрд░рд╛рдпрдЪреЗ рдард░рд╡рд▓реЗ. рдбреЗрд╡реНрд╣рд▓рдкрд░реНрд╕рдЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рдд рдлрд╛рд╕реНрдЯрд▓реЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдореЗрдЯрд╛ рдорд╛рд╣рд┐рддреА рдирд╛рд╣реА рддрд░ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдпрд╛ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреНрдпрд╛ рдЕрдирдиреНрдп рдХреАрдЬ рдареЗрд╡реВ. .env.appName
.
рд╕реНрд╡рдд: рд▓рд╛ Fastfile
, Appfile
, Matchfile
╨╕ Gymfile
, рдЖрдореНрд╣реА рддреЗ рдПрдХрд╛ рд╡реЗрдЧрд│реНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рдд рд▓рдкрд╡рд▓реЗ. рдЗрддрд░ рд╕реЗрд╡рд╛рдВрдХрдбреАрд▓ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЕрд╕рд▓реЗрд▓реА рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╛рдИрд▓ рддреЗрдереЗ рд▓рдкрд╡рд┐рд▓реА рдЧреЗрд▓реА рд╣реЛрддреА - .env
.
рдЖрдкрдг рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ рд╢рдХрддрд╛
CI рд╡рд░, рдХреЙрд▓рдордзреНрдпреЗ рдлрд╛рд░рд╕рд╛ рдмрджрд▓ рдЭрд╛рд▓реЗрд▓рд╛ рдирд╛рд╣реА; рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреА рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ:
# fastlane ios <lane_name> --env appName
$ fastlane ios build --env appName
$ fastlane ios test --env appName
$ fastlane ios run_sonar --env appName
$ fastlane ios deploy --env appName
рдХрдорд╛рдВрдбреНрд╕ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдЖрдореНрд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╕рд╣ рдЖрдордЪреА рднрд╛рдВрдбрд╛рд░ рд▓реЛрдб рдХрд░рддреЛ. рдЗрддрдХреЗ рдЫрд╛рди рджрд┐рд╕рдд рдирд╛рд╣реА:
git clone [email protected]/FastlaneCICD.git fastlane_temp
cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.env
рдлрд╛рд╕реНрдЯрд▓реЗрдирдХрдбреЗ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рджреНрд╡рд╛рд░реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЙрдкрд╛рдп рдЕрд╕рд▓рд╛ рддрд░реА, рд╣реЗ рд╕рдорд╛рдзрд╛рди рдЖрддреНрддрд╛рд╕рд╛рдареА рд╕реЛрдбрд▓реЗ import_from_git
, рдкрд░рдВрддреБ рддреЗ рдлрдХреНрдд рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓рд╕рд╛рдареА рдХрд╛рд░реНрдп рдХрд░рддреЗ, рдкрд░рдВрддреБ рдЗрддрд░ рдлрд╛рдпрд▓реАрдВрд╕рд╛рдареА рдирд╛рд╣реА. рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ "рдЦрд░реЛрдЦрд░ рд╕реБрдВрджрд░" рд╣рд╡реЗ рдЕрд╕реЗрд▓ рддрд░ рддреБрдореНрд╣реА рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рд▓рд┐рд╣реВ рд╢рдХрддрд╛ action
.
рдЕрдБрдбреНрд░реЙрдЗрдб рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдЖрдгрд┐ рд░рд┐рдПрдХреНрдЯрдиреЗрдЯрд┐рд╡реНрд╣рд╕рд╛рдареА рд╕рдорд╛рди рд╕рдВрдЪ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдд рдЖрд▓рд╛ рд╣реЛрддрд╛, рдлрд╛рдЗрд▓реНрд╕ рдПрдХрд╛рдЪ рднрд╛рдВрдбрд╛рд░рд╛рдд рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╢рд╛рдЦрд╛рдВрдордзреНрдпреЗ рдЖрд╣реЗрдд iOS
, android
╨╕ react_native
.
рдЬреЗрд╡реНрд╣рд╛ рд░рд┐рд▓реАрдЭ рдЯреАрдорд▓рд╛ рдХрд╛рд╣реА рдирд╡реАрди рдкрд╛рдпрд░реА рдЬреЛрдбрд╛рдпрдЪреА рдЕрд╕рддреЗ, рддреЗрд╡реНрд╣рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреАрд▓ рдмрджрд▓ MR рджреНрд╡рд╛рд░реЗ git рдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд, рддреБрдЯрд▓реЗрд▓реНрдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪреЗ рджреЛрд╖реА рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдпрд╛рдкреБрдвреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА рдЖрдгрд┐ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдЖрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдЦрдВрдбрд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓.
рдЖрддрд╛ рддреЗ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╣реЗ
рдкреВрд░реНрд╡реА, рдЖрдореНрд╣реА рд╕рд░реНрд╡ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕рдЪреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдгреНрдпрд╛рдд, рддреНрдпрд╛рдВрдирд╛ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреНрдпрд╛рдд рдЖрдгрд┐ рдЕрджреНрдпрддрдирд╛рдВрдЪреЗ рд╕рд░реНрд╡ рдкрд░рд┐рдгрд╛рдо рдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рдд рд╡реЗрд│ рдШрд╛рд▓рд╡рд▓рд╛. рд░рд┐рд▓реАрдЭрдордзреАрд▓ рддреНрд░реБрдЯреА рдЖрдгрд┐ рдбрд╛рдЙрдирдЯрд╛рдЗрдордЪреА рдХрд╛рд░рдгреЗ рд╣реА рдЦреВрдк рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реЛрддреА рдЬреЗрд╡реНрд╣рд╛ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪреНрдпрд╛ рдЧреЛрдВрдзрд│рд╛рдд рдорд╛рдЧреЛрд╡рд╛ рдареЗрд╡рдгреЗ рдЗрддрдХреЗ рдХрдареАрдг рд╣реЛрддреЗ рдЕрд╢рд╛ рд╕рд╛рдзреНрдпрд╛ рдЯрд╛рдпрдкреЛрдЬ рд╣реЛрддреНрдпрд╛. рдЖрддрд╛ рдЕрд╢рд╛ рдЪреБрдХрд╛ рдХрдореАрдд рдХрдореА рдЭрд╛рд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдмрджрд▓ рдПрдХрд╛рдЪ рд╡реЗрд│реА рд╕рд░реНрд╡ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдордзреНрдпреЗ рдЖрдгрд▓реЗ рдЬрд╛рддрд╛рдд. рдЖрдгрд┐ рдкреНрд░рдХреНрд░рд┐рдпреЗрдордзреНрдпреЗ рдирд╡реАрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА 15 рдорд┐рдирд┐рдЯреЗ рд▓рд╛рдЧрддрд╛рдд - CI рд╡рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯ рдХрд░рд╛ рдЖрдгрд┐ рд╡рд┐рдХрд╛рд╕рдХрд╛рдЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рдд рдХреА рдЬреЛрдбрд╛.
рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА Android рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрд╡рд╛рдХреНрд╖рд░реАрд╕рд╛рдареА рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓рдЪрд╛ рдореБрджреНрджрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд░рд╛рд╣рд┐рд▓рд╛ рдЖрд╣реЗ; рдЬрд░ рд▓реЗрдЦ рдордиреЛрд░рдВрдЬрдХ рдЕрд╕реЗрд▓ рддрд░ рдореА рдкреБрдвреЗ рд▓рд┐рд╣реАрди. рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдорд╡рд░ "рддреБрдореНрд╣реА рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд╕реЗ рдХрд░рд╛рд▓" рддреБрдордЪреЗ рдкреНрд░рд╢реНрди рдХрд┐рдВрд╡рд╛ рд╕реВрдЪрдирд╛ рдкрд╛рд╣реВрди рдорд▓рд╛ рдЖрдирдВрдж рд╣реЛрдИрд▓
рд╕реНрддреНрд░реЛрдд: www.habr.com