рдорд╛рдЭреЗ рдирд╛рд╡ рджрд┐рдорд┐рддреНрд░реА рдЖрд╣реЗ, рдореА рдХрдВрдкрдиреАрдд рдкрд░реАрдХреНрд╖рдХ рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░рддреЛ
рдпрд╛рдЖрдзреА, рдореА рдЕрдБрдбреНрд░реЙрдЗрдбрд╕рд╛рдареА рдлрд╛рдпрд░рдмреЗрд╕ рдЯреЗрд╕реНрдЯ рд▓реЕрдм рд╡рд╛рдкрд░реВрди рдкрд╛рд╣рд┐рд▓реА рд╣реЛрддреА рдЖрдгрд┐ рдорд▓рд╛ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЖрд╡рдбрд▓реЗ, рдореНрд╣рдгреВрди рдореА рдкреНрд░реЛрдЬреЗрдХреНрдЯрдЪреА iOS рдЪрд╛рдЪрдгреА рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рддреНрдпрд╛рдЪ рдкрд╛рдпрд╛рд╡рд░ рдареЗрд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. рдорд▓рд╛ рдЦреВрдк Google рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ рдЖрдгрд┐ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдкреНрд░рдердордЪ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЭрд╛рд▓реЗ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдореА рдЕрдЬреВрдирд╣реА рд╕рдВрдШрд░реНрд╖ рдХрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛рдВрд╕рд╛рдареА рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд▓реЗрдЦ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреЗ рдард░рд╡рд▓реЗ.
рддреНрдпрд╛рдореБрд│реЗ, рдЬрд░ рддреБрдордЪреНрдпрд╛рдХрдбреЗ iOS рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╡рд░ UI рдЪрд╛рдЪрдгреНрдпрд╛ рдЕрд╕рддреАрд▓, рддрд░ рддреБрдореНрд╣реА рддреНрдпрд╛ рдЖрдЬрдЪ рдЦрд░реНтАНрдпрд╛ рдЙрдкрдХрд░рдгрд╛рдВрд╡рд░ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рд╢рдХрддрд╛, рдХреГрдкрдпрд╛ рдЧреБрдб рдХреЙрд░реНрдкреЛрд░реЗрд╢рдирдиреЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗ рдЖрд╣реЗ. рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛рдВрд╕рд╛рдареА, рдорд╛рдВрдЬрд░реАрдордзреНрдпреЗ рдЖрдкрд▓реЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ.
рдХрдереЗрдордзреНрдпреЗ, рдореА рдХрд╛рд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛рд╡рд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛ - GitHub рдЖрдгрд┐ CircleCI рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдорд╡рд░реАрд▓ рдЦрд╛рдЬрдЧреА рднрд╛рдВрдбрд╛рд░. рдЕрд░реНрдЬрд╛рдЪреЗ рдирд╛рд╡ AmazingApp рдЖрд╣реЗ, bundleID рдЖрд╣реЗ com.company.amazingapp. рддреНрдпрд╛рдирдВрддрд░рдЪрд╛ рдЧреЛрдВрдзрд│ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореА рд╣рд╛ рдбреЗрдЯрд╛ рддреНрд╡рд░рд┐рдд рд╕рд╛рджрд░ рдХрд░рддреЛ.
рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдХрд╛рд╣реА рдЙрдкрд╛рдп рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реНрдпрд╛рд╕, рддреБрдордЪрд╛ рдЕрдиреБрднрд╡ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рд╢реЗрдЕрд░ рдХрд░рд╛.
1. рдЪрд╛рдЪрдгреНрдпрд╛ рд╕реНрд╡рддрдГ
UI рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╕рд╛рдареА рдирд╡реАрди рдкреНрд░рдХрд▓реНрдк рд╢рд╛рдЦрд╛ рддрдпрд╛рд░ рдХрд░рд╛:
$ git checkout develop
$ git pull
$ git checkout -b тАЬfeature/add-ui-testsтАЭ
рдЪрд▓рд╛ XCode рдордзреНрдпреЗ рдкреНрд░рдХрд▓реНрдк рдЙрдШрдбреВ рдЖрдгрд┐ UI рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╕рд╣ рдПрдХ рдирд╡реАрди рд▓рдХреНрд╖реНрдп рддрдпрд╛рд░ рдХрд░реВ [XCode -> рдлрд╛рдЗрд▓ -> рдирд╡реАрди -> рд▓рдХреНрд╖реНрдп -> тАЛтАЛiOS рдЪрд╛рдЪрдгреА рдмрдВрдбрд▓], рддреНрдпрд╛рд▓рд╛ AmazingAppUITests рд╣реЗ рд╕реНрд╡рдпрдВ-рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рддреНрдордХ рдирд╛рд╡ рджреЗрдКрди.
рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЯрд╛рд░реНрдЧреЗрдЯрдЪреНрдпрд╛ рдмрд┐рд▓реНрдб рдлреЗрдЬ рд╡рд┐рднрд╛рдЧрд╛рдд рдЬрд╛ рдЖрдгрд┐ рдЯрд╛рд░реНрдЧреЗрдЯ рдбрд┐рдкреЗрдВрдбреЗрдиреНрд╕реАрдЬ - AmazingApp, рдХрдВрдкрд╛рдЗрд▓ рд╕реЛрд░реНрд╕реЗрд╕ - AmazingAppUITests.swift рдордзреНрдпреЗ рддрдкрд╛рд╕рд╛.
рдПрдХ рдЪрд╛рдВрдЧрд▓рд╛ рд╕рд░рд╛рд╡ рдореНрд╣рдгрдЬреЗ рд╡рд┐рд╡рд┐рдз рдмрд┐рд▓реНрдб рдкрд░реНрдпрд╛рдпрд╛рдВрдирд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдпреЛрдЬрдирд╛рдВрдордзреНрдпреЗ рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ. рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ UI рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╕рд╛рдареА рдПрдХ рдпреЛрдЬрдирд╛ рддрдпрд╛рд░ рдХрд░рддреЛ [XCode -> рдЙрддреНрдкрд╛рджрди -> рдпреЛрдЬрдирд╛ -> рдирд╡реАрди рдпреЛрдЬрдирд╛] рдЖрдгрд┐ рддрд┐рд▓рд╛ рддреЗрдЪ рдирд╛рд╡ рджреЗрддреЛ: AmazingAppUITests.
рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдпреЛрдЬрдиреЗрдЪреНрдпрд╛ рдмрд┐рд▓реНрдбрдордзреНрдпреЗ рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреЗ рд▓рдХреНрд╖реНрдп рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ - AmazingApp рдЖрдгрд┐ Target UI рдЪрд╛рдЪрдгреНрдпрд╛ - AmazingAppUITests - рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд╣рд╛
рдкреБрдвреЗ, рдЖрдореНрд╣реА UI рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╕рд╛рдареА рдирд╡реАрди рдмрд┐рд▓реНрдб рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддрдпрд╛рд░ рдХрд░рддреЛ. XCode рдордзреНрдпреЗ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛ рдЖрдгрд┐ рдорд╛рд╣рд┐рддреА рд╡рд┐рднрд╛рдЧрд╛рдд рдЬрд╛. тАЬ+тАЭ рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛ рдЖрдгрд┐ рдирд╡реАрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддрдпрд╛рд░ рдХрд░рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде XCtest. рдЬреЗрд╡реНрд╣рд╛ рдХреЛрдб рд╕рд╛рдЗрдирд┐рдВрдЧрдЪрд╛ рдкреНрд░рд╢реНрди рдпреЗрддреЛ рддреЗрд╡реНрд╣рд╛ рдбрдл рд╡рд╛рдЬрд╡реВрди рдирд╛рдЪреВ рдирдпреЗ рдореНрд╣рдгреВрди рдЖрдореНрд╣рд╛рд▓рд╛ рднрд╡рд┐рд╖реНрдпрд╛рдд рдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓.
рддреБрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдордзреНрдпреЗ рдХрд┐рдорд╛рди рддреАрди рд▓рдХреНрд╖реНрдпреЗ рдЖрд╣реЗрдд: рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ, рдпреБрдирд┐рдЯ рдЪрд╛рдЪрдгреНрдпрд╛ (рд╢реЗрд╡рдЯреА, рддреНрдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗрдд, рдмрд░реЛрдмрд░?) рдЖрдгрд┐ рдЖрдореНрд╣реА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд▓рдХреНрд╖реНрдп UI рдЪрд╛рдЪрдгреНрдпрд╛.
Target AmazingApp, Build Settings tab, Code Signing Identity рд╡рд┐рднрд╛рдЧрд╛рдд рдЬрд╛. XCtest рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╛рдареА, iOS рд╡рд┐рдХрд╕рдХ рдирд┐рд╡рдбрд╛. рдХреЛрдб рд╕рд╛рдЗрдирд┐рдВрдЧ рд╢реИрд▓реА рд╡рд┐рднрд╛рдЧрд╛рдд, рдореЕрдиреНрдпреБрдЕрд▓ рдирд┐рд╡рдбрд╛. рдЖрдореНрд╣реА рдЕрдЬреВрди рдкреНрд░реЛрд╡реНрд╣рд┐рдЬрдирд┐рдВрдЧ рдкреНрд░реЛрдлрд╛рдИрд▓ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рдирд┐рд╢реНрдЪрд┐рддрдкрдгреЗ рддреНрдпрд╛рд╡рд░ рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рдиреЗ рдкрд░рдд рдпреЗрдК.
Target AmazingAppUITests рд╕рд╛рдареА рдЖрдореНрд╣реА рддреЗрдЪ рдХрд░рддреЛ, рдкрд░рдВрддреБ рдЙрддреНрдкрд╛рджрди рдмрдВрдбрд▓ рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рдХреЙрд▓рдордордзреНрдпреЗ рдЖрдореНрд╣реА com.company.amazingappuitest рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рддреЛ.
2. рдНрдкрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯ рдХрд░рдгреЗ
рдНрдкрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреГрд╖реНрдард╛рд╡рд░ рдЬрд╛, рдкреНрд░рдорд╛рдгрдкрддреНрд░реЗ, рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░реНрд╕ рдЖрдгрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╡рд┐рднрд╛рдЧрд╛рдд рдЬрд╛ рдЖрдгрд┐ рдирдВрддрд░ рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░реНрд╕ рдЖрдпрдЯрдордЪреНрдпрд╛ рдЕреЕрдк рдЖрдпрдбреА рдХреЙрд▓рдорд╡рд░ рдЬрд╛. AmazingAppUITests рдЖрдгрд┐ bundleID com.company.amazingappuitest рдирд╛рд╡рд╛рдЪрд╛ рдирд╡реАрди рдЕреЕрдк рдЖрдпрдбреА рддрдпрд╛рд░ рдХрд░рд╛.
рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рд╕рд╣ рдЖрдордЪреНрдпрд╛ рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╡рд░ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рдЖрд╣реЗ, рдкрд░рдВрддреБ... рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдмрд┐рд▓реНрдб рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдордзреНрдпреЗ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рддрдГ рдПрдХрддреНрд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рд░рдирд░ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдгреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ. рддреНрдпрд╛рдиреБрд╕рд╛рд░, рдПрдХрд╛ рдкреНрд░реЛрд╡реНрд╣рд┐рдЬрдирд┐рдВрдЧ рдкреНрд░реЛрдлрд╛рдИрд▓рд╕рд╣ рджреЛрди рдмрдВрдбрд▓ рдЖрдпрдбреАрд╡рд░ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдорд╕реНрдпрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рднреЗрдбрд╕рд╛рд╡рдд рдЖрд╣реЗ. рд╕реБрджреИрд╡рд╛рдиреЗ, рдПрдХ рд╕реЛрдкрд╛ рдЖрдгрд┐ рдореЛрд╣рдХ рдЙрдкрд╛рдп рдЖрд╣реЗ - рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЕреЕрдк рдЖрдпрдбреА. рдЖрдореНрд╣реА рдирд╡реАрди рдЕреЕрдк рдЖрдпрдбреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреА рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рддреЛ, рдкрд░рдВрддреБ рд╕реНрдкрд╖реНрдЯ рдЕреЕрдк рдЖрдпрдбреАрдРрд╡рдЬреА, рд╕реНрдХреНрд░реАрдирд╢реЙрдЯрдкреНрд░рдорд╛рдгреЗ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЕреЕрдк рдЖрдпрдбреА рдирд┐рд╡рдбрд╛.
рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░, рдЖрдореНрд╣реА developer.apple.com рд╕рд╣ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рдХреЗрд▓реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рдмреНрд░рд╛рдЙрдЭрд░ рд╡рд┐рдВрдбреЛ рдХрдореА рдХрд░рдгрд╛рд░ рдирд╛рд╣реА. рдЪрд▓ рдЬрд╛рдКрдпрд╛
рдПрдХрд╛ рд╕рдЬрдЧ рд╡рд╛рдЪрдХрд╛рдЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ рдХреА рд╣реА рдЙрдкрдпреБрдХреНрддрддрд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдНрдкрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдгрд┐ рдЧрд┐рдердм рдпрд╛ рджреЛрдиреНрд╣реАрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдЕрд╕рд▓реЗрд▓реЗ рдЦрд╛рдЬрдЧреА рднрд╛рдВрдбрд╛рд░ рдЖрдгрд┐ рдЦрд╛рддреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрдореНрд╣реА рдлреЙрд░реНрдордЪреЗ рдЦрд╛рддреЗ (рдЕрдЪрд╛рдирдХ рдЕрд╕реЗ рдХрд╛рд╣реА рдирд╕рд▓реНрдпрд╛рд╕) рддрдпрд╛рд░ рдХрд░рддреЛ [рдИрдореЗрд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд], рдордЬрдмреВрдд рдкрд╛рд╕рд╡рд░реНрдбрд╕рд╣ рдпрд╛, developer.apple.com рд╡рд░ рдиреЛрдВрджрдгреА рдХрд░рд╛ рдЖрдгрд┐ рдкреНрд░рдХрд▓реНрдк рдкреНрд░рд╢рд╛рд╕рдХ рдореНрд╣рдгреВрди рдирд┐рдпреБрдХреНрдд рдХрд░рд╛. рдкреБрдвреЗ, рдЖрдореНрд╣реА рдЦрд╛рддреНрдпрд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдХрдВрдкрдиреАрдЪреНрдпрд╛ рдЧрд┐рдердм рднрд╛рдВрдбрд╛рд░рд╛рдд рдкреНрд░рд╡реЗрд╢ рджреЗрддреЛ рдЖрдгрд┐ AmazingAppMatch рд╕рд╛рд░рдЦреНрдпрд╛ рдирд╛рд╡рд╛рдиреЗ рдирд╡реАрди рдЦрд╛рдЬрдЧреА рднрд╛рдВрдбрд╛рд░ рддрдпрд╛рд░ рдХрд░рддреЛ.
3. рдлрд╛рд╕реНрдЯрд▓реЗрди рдЖрдгрд┐ рдореЕрдЪ рдпреБрдЯрд┐рд▓рд┐рдЯреА рд╕реЗрдЯ рдХрд░рдгреЗ
рдЯрд░реНрдорд┐рдирд▓ рдЙрдШрдбрд╛, рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╕рд╣ рдлреЛрд▓реНрдбрд░рд╡рд░ рдЬрд╛ рдЖрдгрд┐ рджрд░реНрд╢рд╡рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ рдлрд╛рд╕реНрдЯрд▓реЗрди рд╕реБрд░реВ рдХрд░рд╛
$ fastlane init
рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрдкрд▓рдмреНрдз рд╡рд╛рдкрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдирд┐рд╡рдбрдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рдИрд▓. рдЪреМрдерд╛ рдкрд░реНрдпрд╛рдп рдирд┐рд╡рдбрд╛ - рдореЕрдиреНрдпреБрдЕрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк.
рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдирд╡реАрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдлрд╛рд╕реНрдЯрд▓реЗрди рдЖрд╣реЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рджреЛрди рдлрд╛рдпрд▓реА рдЖрд╣реЗрдд - рдНрдкрдлрд╛рдЗрд▓ рдЖрдгрд┐ рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓. рдереЛрдбрдХреНрдпрд╛рдд, рдЖрдореНрд╣реА Appfile рдордзреНрдпреЗ рд╕реЗрд╡рд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЛ рдЖрдгрд┐ Fastfile рдордзреНрдпреЗ рдЬреЙрдмреНрд╕ рд▓рд┐рд╣рд┐рддреЛ, рдЬреНрдпрд╛рд▓рд╛ Fastlane рд╢рдмреНрджрд╛рд╡рд▓реАрдд рд▓реЗрди рдореНрд╣рдгрддрд╛рдд. рдореА рдЕрдзрд┐рдХреГрдд рджрд╕реНрддрдРрд╡рдЬ рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:
рддреБрдордЪреНрдпрд╛ рдЖрд╡рдбрддреНрдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░рдордзреНрдпреЗ Appfile рдЙрдШрдбрд╛ рдЖрдгрд┐ рдЦрд╛рд▓реАрд▓ рдлреЙрд░реНрдорд╡рд░ рдЖрдгрд╛:
app_identifier "com.company.amazingapp" # Bundle ID
apple_dev_portal_id "[email protected]" # ╨б╨╛╨╖╨┤╨░╨╜╨╜╤Л╨╣ ╨╕╨╜╤Д╤А╨░╤Б╤В╤А╤Г╨║╤В╤Г╤А╨╜╤Л╨╣ ╨░╨║╨║╨░╤Г╨╜╤В, ╨╕╨╝╨╡╤О╤Й╨╕╨╣ ╨┐╤А╨░╨▓╨╛ ╨╜╨░ ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ iOS ╨┐╤А╨╛╨╡╨║╤В╨░ ╨▓ Apple Developer Program.
team_id "LSDY3IFJAY9" # Your Developer Portal Team ID
рдЖрдореНрд╣реА рдЯрд░реНрдорд┐рдирд▓рд╡рд░ рдкрд░рдд рдЖрд▓реЛ рдЖрдгрд┐ рдЕрдзрд┐рдХреГрдд рдореЕрдиреНрдпреБрдЕрд▓рдиреБрд╕рд╛рд░ рдЖрдореНрд╣реА рд╕рд╛рдордирд╛ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░рд╡рд╛рдд рдХрд░рддреЛ.
$ fastlane match init
$ fastlane match development
рдкреБрдвреЗ, рд╡рд┐рдирдВрддреА рдХреЗрд▓реЗрд▓рд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛ - рд░реЗрдкреЙрдЬрд┐рдЯрд░реА, рдЦрд╛рддреЗ, рдкрд╛рд╕рд╡рд░реНрдб рдЗ.
рд╣реЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛ рдореЕрдЪ рдпреБрдЯрд┐рд▓рд┐рдЯреА рд▓рд╛рдБрдЪ рдХрд░рддрд╛, рддреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рд╕рд╡рд░реНрдб рдПрдВрдЯрд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рдИрд▓. рд╣рд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЬрддрди рдХрд░рдгреЗ рдЦреВрдк рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ; CI рд╕рд░реНрд╡реНрд╣рд░ рд╕реЗрдЯ рдХрд░рддрд╛рдирд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓!
рдлрд╛рд╕реНрдЯрд▓реЗрди рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рдПрдХ рдирд╡реАрди рдлрд╛рдЗрд▓ рдЖрд▓реА рдЖрд╣реЗ - рдореЕрдЪрдлрд╛рдИрд▓. рддреЗ рддреБрдордЪреНрдпрд╛ рдЖрд╡рдбрддреНрдпрд╛ рдордЬрдХреВрд░ рд╕рдВрдкрд╛рджрдХрд╛рдд рдЙрдШрдбрд╛ рдЖрдгрд┐ рдпрд╛рдкреНрд░рдорд╛рдгреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рд╛:
git_url("https://github.com/YourCompany/AmazingAppMatch") #╨б╨╛╨╖╨┤╨░╨╜╨╜╤Л╨╣ ╨┐╤А╨╕╨▓╨░╤В╨╜╤Л╨╣ ╤А╨╡╨┐╨╛╨╖╨╕╤В╨╛╤А╨╕╨╣ ╨┤╨╗╤П ╤Е╤А╨░╨╜╨╡╨╜╨╕╤П ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨╛╨▓ ╨╕ ╨┐╤А╨╛╤Д╨░╨╣╨╗╨╛╨▓.
type("development") # The default type, can be: appstore, adhoc, enterprise or development
app_identifier("com.company.amazingapp")
username("[email protected]") # Your Infrastructure account Apple Developer Portal username
рдХреНрд░реЕрд╢рд▓рд╛рдЗрдЯрд┐рдХреНрд╕ рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ AppStore рдордзреНрдпреЗ рдкреНрд░рджрд░реНрд╢рдирд╛рд╕рд╛рдареА рдмрд┐рд▓реНрдбрд╡рд░ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореНрд╣рдгрдЬреЗрдЪ рддреБрдордЪреНрдпрд╛ рдЕрд░реНрдЬрд╛рдЪреНрдпрд╛ рдмрдВрдбрд▓ рдЖрдпрдбреАрд╡рд░ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рднрд╡рд┐рд╖реНрдпрд╛рдд рд╕рд╛рдордирд╛ рд╡рд╛рдкрд░рд╛рдпрдЪрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕ рдЖрдореНрд╣реА рддреЗ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рднрд░рддреЛ.
рдкрд░рдВрддреБ, рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдард╡рддреЗ рдХреА, рдЖрдореНрд╣реА рдЪрд╛рдЪрдгреА рдмрд┐рд▓реНрдбрд╡рд░ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЖрдпрдбреА рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ. рдореНрд╣рдгреВрди, рдлрд╛рд╕реНрдЯрдлрд╛рдЗрд▓ рдЙрдШрдбрд╛ рдЖрдгрд┐ рдирд╡реАрди рд▓реЗрди рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # ╤Б╨╛╨╖╨┤╨░╨╡╨╝ ╨╛╤В╨┤╨╡╨╗╤М╨╜╤Л╨╣ ╨▒╤А╨░╨╜╤З ╨┤╨╗╤П development ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░ ╨┤╨╗╤П ╨┐╨╛╨┤╨┐╨╕╤Б╨╕ ╤В╨╡╤Б╤В╨╛╨▓╨╛╨╣ ╤Б╨▒╨╛╤А╨║╨╕.
)
end
рд╕реЗрд╡реНрд╣ рдХрд░рд╛ рдЖрдгрд┐ рдЯрд░реНрдорд┐рдирд▓рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рд╛
fastlane testing_build_for_firebase
рдЖрдгрд┐ рдЖрдореНрд╣реА рдкрд╛рд╣рддреЛ рдХреА рдлрд╛рд╕реНрдЯрд▓реЗрдирдиреЗ рдирд╡реАрди рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╕реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрдгрд┐ рддреЗ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдареЗрд╡рд▓реЗ. рдЫрд╛рди!
XCode рдЙрдШрдбрд╛. рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдореЕрдЪ рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ com.company.* рдлреЙрд░реНрдордЪреЗ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░реЛрд╡реНрд╣рд┐рдЬрдирд┐рдВрдЧ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдЖрд╣реЗ, рдЬреЗ AmazingApp рдЖрдгрд┐ AmazingAppUITests рд▓рдХреНрд╖реНрдпрд╛рдВрд╕рд╛рдареА рдкреНрд░реЛрд╡реНрд╣рд┐рдЬрдирд┐рдВрдЧ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╡рд┐рднрд╛рдЧрд╛рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдЪрд╛рдЪрдгреНрдпрд╛ рдПрдХрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓реЗрди рдЬреЛрдбрдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рдЪрд▓ рдЬрд╛рдКрдпрд╛
рдореВрд│ рдЙрджрд╛рд╣рд░рдгрд╛рд╡рд░реВрди рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░реВ рдпрд╛ рдЬреЗрдгреЗрдХрд░реВрди рдЖрдордЪреЗ рд▓реЗрди testing_build_for_firebase рдЕрд╕реЗ рджрд┐рд╕реЗрд▓:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests"
)
scan(
scheme: 'AmazingAppUITests', # UI Test scheme
clean: true, # Recommended: This would ensure the build would not include unnecessary files
skip_detect_devices: true, # Required
build_for_testing: true, # Required
sdk: 'iphoneos', # Required
should_zip_build_products: true, # Must be true to set the correct format for Firebase Test Lab
)
firebase_test_lab_ios_xctest(
gcp_project: 'AmazingAppUITests', # Your Google Cloud project name (╨║ ╤Н╤В╨╛╨╣ ╤Б╤В╤А╨╛╤З╨║╨╡ ╨▓╨╡╤А╨╜╨╡╨╝╤Б╤П ╨┐╨╛╨╖╨╢╨╡)
devices: [ # Device(s) to run tests on
{
ios_model_id: 'iphonex', # Device model ID, see gcloud command above
ios_version_id: '12.0', # iOS version ID, see gcloud command above
locale: 'en_US', # Optional: default to en_US if not set
orientation: 'portrait' # Optional: default to portrait if not set
}
]
)
end
CircleCI рдордзреНрдпреЗ рдлрд╛рд╕реНрдЯрд▓реЗрди рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рд╕рдВрдкреВрд░реНрдг рдорд╛рд╣рд┐рддреАрд╕рд╛рдареА, рдореА рдЕрдзрд┐рдХреГрдд рдХрд╛рдЧрджрдкрддреНрд░реЗ рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ
рдЖрдордЪреНрдпрд╛ config.yml рдордзреНрдпреЗ рдирд╡реАрди рдХрд╛рд░реНрдп рдЬреЛрдбрдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:
build-for-firebase-test-lab:
macos:
xcode: "10.1.0"
working_directory: ~/project
shell: /bin/bash --login -o pipefail
steps:
- checkout
- attach_workspace:
at: ~/project
- run: sudo bundle install # ╨╛╨▒╨╜╨╛╨▓╨╗╤П╨╡╨╝ ╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╕
- run:
name: install gcloud-sdk # ╨╜╨░ mac ╨╝╨░╤И╨╕╨╜╤Г ╨╜╨╡╨╛╨▒╤Е╨╛╨┤╨╕╨╝╨╛ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М gcloud
command: |
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null ; brew install caskroom/cask/brew-cask 2> /dev/null
brew cask install google-cloud-sdk
- run:
name: build app for testing
command: fastlane testing_build_for_firebase # ╨╖╨░╨┐╤Г╤Б╨║╨░╨╡╨╝ lane ╤Б╨▒╨╛╤А╨║╨╕ ╨╕ ╨╛╤В╨┐╤А╨░╨▓╨║╨╕ ╨▓ firebase
4. рдЖрдордЪреНрдпрд╛ рдЪрд╛рдЪрдгреА рдЦрдВрдбрдкреАрдард╛рдЪреЗ рдХрд╛рдп? рдлрд╛рдпрд░рдмреЗрд╕ рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ.
рд▓реЗрдЦ рдХрд╢рд╛рд╕рд╛рдареА рд▓рд┐рд╣рд┐рд▓рд╛ рддреЗ рдЦрд╛рд▓реА рдЙрддрд░реВрдпрд╛.
рдХрджрд╛рдЪрд┐рдд рддреБрдордЪрд╛ рдЕтАНреЕрдк рдореЛрдлрдд рдпреЛрдЬрдиреЗрд╡рд░ рдлрд╛рдпрд░рдмреЗрд╕ рд╡рд╛рдкрд░рдд рдЕрд╕реЗрд▓ рдХрд┐рдВрд╡рд╛ рдЕрдЬрд┐рдмрд╛рдд рдирд╛рд╣реА. рдпрд╛рдд рдХреЛрдгрддрд╛рд╣реА рдореВрд▓рднреВрдд рдлрд░рдХ рдирд╛рд╣реА, рдХрд╛рд░рдг рдЪрд╛рдЪрдгреА рдЧрд░рдЬрд╛рдВрд╕рд╛рдареА рдЖрдореНрд╣реА рдПрдХ рд╡рд░реНрд╖ рд╡рд┐рдирд╛рдореВрд▓реНрдп рд╡рд╛рдкрд░рд╛рд╕рд╣ рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ (рдЫрд╛рди, рдмрд░реЛрдмрд░?)
рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЦрд╛рддреНрдпрд╛рдд рд▓реЙрдЧ рдЗрди рдХрд░рддреЛ (рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдХреЛрдгрддреЗрд╣реА, рдХрд╛рд╣реА рдлрд░рдХ рдкрдбрдд рдирд╛рд╣реА), рдЖрдгрд┐ рд╡рд░ рдЬрд╛рддреЛ
рд╣реЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдлрд╛рд╕реНрдЯрдлрд╛рдИрд▓ рдЗрди рд▓реЗрди рдлрд╛рдпрд░рдмреЗрд╕_рдЯреЗрд╕реНрдЯ_рд▓реЕрдм_рдЖрдпрдУрдПрд╕_рдПрдХреНрд╕рдХреНрдЯреЗрд╕реНрдЯ рдордзреАрд▓ рдорд╛рдЧреАрд▓ рдЪрд░рдгрд╛рдд gcp_project рдкреЕрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╢реА рдЬреБрд│рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ.
рдбреАрдлреЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдЖрд╣реЗрдд.
рдЯреЕрдм рдмрдВрдж рдХрд░реВ рдирдХрд╛, рддреНрдпрд╛рдЪ рдЦрд╛рддреНрдпрд╛рдЦрд╛рд▓реА рдиреЛрдВрджрдгреА рдХрд░рд╛
Google рдПрдХрд╛ рд╡рд░реНрд╖рд╛рд╕рд╛рдареА $300 рджреЗрдд рдЖрд╣реЗ, рдЬреЗ рдСрдЯреЛрдЯреЗрд╕реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд рд╕реЗрд╡реЗрдЪреНрдпрд╛ рдореЛрдлрдд рд╡рд╛рдкрд░рд╛рдЪреНрдпрд╛ рд╡рд░реНрд╖рд╛рдЪреНрдпрд╛ рд╕рдорддреБрд▓реНрдп рдЖрд╣реЗ. рдЖрдореНрд╣реА рддреБрдордЪреА рджреЗрдп рдорд╛рд╣рд┐рддреА рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рддреЛ, $1 рдЪреНрдпрд╛ рдЪрд╛рдЪрдгреА рдбреЗрдмрд┐рдЯрдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЛ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдЦрд╛рддреНрдпрд╛рдд $300 рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЛ. рдПрдХрд╛ рд╡рд░реНрд╖рд╛рдирдВрддрд░, рдкреНрд░рдХрд▓реНрдк рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЯреЕрд░рд┐рдл рдкреНрд▓реЕрдирдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓, рддреНрдпрд╛рдореБрд│реЗ рдкреИрд╢рд╛рдЪреНрдпрд╛ рд╕рдВрднрд╛рд╡реНрдп рдиреБрдХрд╕рд╛рдирд╛рдмрджреНрджрд▓ рдХрд╛рд│рдЬреА рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.
рдЪрд▓рд╛ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╣ рдЯреЕрдмрд╡рд░ рдкрд░рдд рдпреЗрдК рдЖрдгрд┐ рддреЗ рдмреНрд▓реЗрдЭ рдЯреЕрд░рд┐рдл рдкреНрд▓реЕрдирдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реВ - рдЖрддрд╛ рдорд░реНрдпрд╛рджрд╛ рдУрд▓рд╛рдВрдбрд▓реНрдпрд╛рд╕ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдкреИрд╕реЗ рднрд░рд╛рдпрдЪреЗ рдЖрд╣реЗрдд.
gcloud рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ, рдЖрдордЪрд╛ рдлрд╛рдпрд░рдмреЗрд╕ рдкреНрд░рдХрд▓реНрдк рдирд┐рд╡рдбрд╛, "рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛" рдореБрдЦреНрдп рдореЗрдиреВ рдЖрдпрдЯрдо рдирд┐рд╡рдбрд╛ рдЖрдгрд┐ рдХреНрд▓рд╛рдЙрдб рдЪрд╛рдЪрдгреА API рдЖрдгрд┐ рдХреНрд▓рд╛рдЙрдб рдЯреВрд▓реНрд╕ рдкрд░рд┐рдгрд╛рдо API рдЬреЛрдбрд╛.
рдирдВрддрд░ рдореЗрдиреВ рдЖрдпрдЯрдорд╡рд░ рдЬрд╛ тАЬIAM рдЖрдгрд┐ рдкреНрд░рд╢рд╛рд╕рдитАЭ -> рд╕реЗрд╡рд╛ рдЦрд╛рддреА -> рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рддрдпрд╛рд░ рдХрд░рд╛. рдЖрдореНрд╣реА рдкреНрд░рдХрд▓реНрдк рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреЗ рдЕрдзрд┐рдХрд╛рд░ рджреЗрддреЛ.
JSON рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ API рдХреА рддрдпрд╛рд░ рдХрд░рд╛
рдЖрдореНрд╣рд╛рд▓рд╛ рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ JSON рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓, рдкрд░рдВрддреБ рдЖрддреНрддрд╛ рдЖрдореНрд╣реА рдЪрд╛рдЪрдгреА рд▓реЕрдм рд╕реЗрдЯрдЕрдк рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ.
5. CircleCI рдЪреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рдгреЗ
рдПрдХ рд╡рд╛рдЬрд╡реА рдкреНрд░рд╢реНрди рдЙрджреНрднрд╡рддреЛ - рдкрд╛рд╕рд╡рд░реНрдбрдЪреЗ рдХрд╛рдп рдХрд░рд╛рд╡реЗ? рдЖрдордЪреНрдпрд╛ рдмрд┐рд▓реНрдб рдорд╢реАрдирдЪреА рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдпрдВрддреНрд░рдгрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреЗ рдкрд╛рд╕рд╡рд░реНрдб рдЖрдгрд┐ рдЗрддрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реЗрд▓. CircleCI рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдордзреНрдпреЗ, Environment Variables рдирд┐рд╡рдбрд╛
рдЖрдгрд┐ рдЦрд╛рд▓реАрд▓ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рд╛:
- рдХреА: GOOGLE_APPLICATION_CREDENTIALS
рдореВрд▓реНрдп: gcloud рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХреА рдЪреНрдпрд╛ json рдлрд╛рдЗрд▓рдЪреА рд╕рд╛рдордЧреНрд░реА - рдХреА: MATCH_PASSWORD
рдореВрд▓реНрдп: рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рдВрд╕рд╣ рдЧрд┐рдердм рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рд╕рд╡рд░реНрдб - рдХреА: FASTLANE_PASSWORD
рдореВрд▓реНрдп: рдНрдкрд▓ рд╡рд┐рдХрд╕рдХ рдкреЛрд░реНрдЯрд▓ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛ рдЦрд╛рддреЗ рд╕рдВрдХреЗрддрд╢рдмреНрдж
рдЖрдореНрд╣реА рдмрджрд▓ рд╕реЗрд╡реНрд╣ рдХрд░рддреЛ, PR рддрдпрд╛рд░ рдХрд░рддреЛ рдЖрдгрд┐ рддреЗ рдЖрдордЪреНрдпрд╛ рдЯреАрдо рд▓реАрдбрдХрдбреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрдирд╛рд╕рд╛рдареА рдкрд╛рдард╡рддреЛ.
рдкрд░рд┐рдгрд╛рдо
рдпрд╛ рд╕рд╛рдзреНрдпрд╛ рд╣рд╛рддрд╛рд│рдгреАрдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореА, рдЖрдореНрд╣рд╛рд▓рд╛ рдЪрд╛рдЪрдгреАрдЪреНрдпрд╛ рд╡реЗрд│реА рдбрд┐рд╡реНрд╣рд╛рдЗрд╕ рд╕реНрдХреНрд░реАрдирд╡рд░ рд╡реНрд╣рд┐рдбрд┐рдУ рд░реЗрдХреЙрд░реНрдб рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд╖рдорддреЗрд╕рд╣ рдПрдХ рдЪрд╛рдВрдЧрд▓рд╛, рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдп рд╕реНрдЯрдБрдб рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓рд╛. рдЪрд╛рдЪрдгреА рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ, рдореА iPhone X рдбрд┐рд╡реНрд╣рд╛рдЗрд╕ рдореЙрдбреЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдлрд╛рд░реНрдо рд╡рд┐рд╡рд┐рдз рдореЙрдбреЗрд▓реНрд╕ рдЖрдгрд┐ iOS рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рдВрдпреЛрдЬрдирд╛рддреВрди рд╕рдореГрджреНрдз рдирд┐рд╡рдб рдкреНрд░рджрд╛рди рдХрд░рддреЗ.
рджреБрд╕рд░рд╛ рднрд╛рдЧ Android рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдлрд╛рдпрд░рдмреЗрд╕ рдЯреЗрд╕реНрдЯ рд▓реЕрдмрдЪреНрдпрд╛ рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╕реЗрдЯрдЕрдкрд╕рд╛рдареА рд╕рдорд░реНрдкрд┐рдд рдЕрд╕реЗрд▓.
рд╕реНрддреНрд░реЛрдд: www.habr.com