рд╡реЗрд░реНрдл рдмрд┐рд▓реНрдбрд░рдордзреНрдпреЗ рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдЯреЕрдЧрд┐рдВрдЧ: рддреЗ рдХрд╛ рдЖрдгрд┐ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рд╡реЗрд░реНрдл рдмрд┐рд▓реНрдбрд░рдордзреНрдпреЗ рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдЯреЕрдЧрд┐рдВрдЧ: рддреЗ рдХрд╛ рдЖрдгрд┐ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

werf Kubernetes рд▓рд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд┐рддрд░реАрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдордЪреА рдореБрдХреНрдд рд╕реНрд░реЛрдд GitOps CLI рдЙрдкрдпреБрдХреНрддрддрд╛ рдЖрд╣реЗ. IN рд░рд┐рд▓реАрдЬ v1.1 рдЗрдореЗрдЬ рдХрд▓реЗрдХреНрдЯрд░рдордзреНрдпреЗ рдПрдХ рдирд╡реАрди рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рд╕рд╛рджрд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ: рд╕рд╛рдордЧреНрд░реАрджреНрд╡рд╛рд░реЗ рдкреНрд░рддрд┐рдорд╛ рдЯреЕрдЧ рдХрд░рдгреЗ рдХрд┐рдВрд╡рд╛ рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдЯреЕрдЧрд┐рдВрдЧ. рдЖрддреНрддрд╛рдкрд░реНрдпрдВрдд, werf рдордзреАрд▓ рдард░рд╛рд╡рд┐рдХ рдЯреЕрдЧрд┐рдВрдЧ рдпреЛрдЬрдиреЗрдордзреНрдпреЗ Git рдЯреЕрдЧ, Git рд╢рд╛рдЦрд╛ рдХрд┐рдВрд╡рд╛ Git рдХрдорд┐рдЯ рджреНрд╡рд╛рд░реЗ рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рдЯреЕрдЧ рдХрд░рдгреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рд╣реЛрддреЗ. рдкрд░рдВрддреБ рдпрд╛ рд╕рд░реНрд╡ рдпреЛрдЬрдирд╛рдВрдЪреЗ рддреЛрдЯреЗ рдЖрд╣реЗрдд рдЬреЗ рдирд╡реАрди рдЯреЕрдЧрд┐рдВрдЧ рдзреЛрд░рдгрд╛рдиреЗ рдкреВрд░реНрдгрдкрдгреЗ рд╕реЛрдбрд╡рд▓реЗ рдЖрд╣реЗрдд. рддреНрдпрд╛рдмрджреНрджрд▓рдЪреЗ рддрдкрд╢реАрд▓ рдЖрдгрд┐ рддреЗ рдЗрддрдХреЗ рдЪрд╛рдВрдЧрд▓реЗ рдХрд╛ рдЖрд╣реЗ рддреЗ рдХрдЯ рдЕрдВрддрд░реНрдЧрдд рдЖрд╣реЗ.

рдПрдХрд╛ Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реАрдордзреВрди рдорд╛рдпрдХреНрд░реЛ рд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕рдЪрд╛ рд╕рдВрдЪ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░рдгреЗ

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

рдЕрд╢реА рдкрд░рд┐рд╕реНрдерд┐рддреА рдЕрд╕рддреЗ рдЬреЗрд╡реНрд╣рд╛ рд╕реЗрд╡рд╛ рдЦрд░реЛрдЦрд░ рд╕реНрд╡рддрдВрддреНрд░ рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рдПрдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдирд╕рддрд╛рдд. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рддреЗ рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдордзреНрдпреЗ рдЕрд╕рддреАрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рдкреНрд░рдХрд╛рд╢рди рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд▓реНрдкрд╛рдордзреНрдпреЗ рд╕реНрд╡рддрдВрддреНрд░ CI/CD рдкреНрд░рдХреНрд░рд┐рдпреЗрджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.

рддрдерд╛рдкрд┐, рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд, рд╡рд┐рдХрд╛рд╕рдХ рдЕрдиреЗрдХрджрд╛ рдПрдХрдЪ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдиреЗрдХ рдорд╛рдпрдХреНрд░реЛрд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕рдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛рдд, рдкрд░рдВрддреБ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░ рднрд╛рдВрдбрд╛рд░ рдЖрдгрд┐ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреЗ... рд╣реА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдУрд╡реНрд╣рд░рдХрд┐рд▓ рдЖрд╣реЗ. рд╣реАрдЪ рдкрд░рд┐рд╕реНрдерд┐рддреА рдЖрд╣реЗ рдЬреНрдпрд╛рдЪреА рдкреБрдвреЗ рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рдЬрд╛рдИрд▓: рдЕрд╢рд╛ рдЕрдиреЗрдХ рд╕реВрдХреНрд╖реНрдо рд╕реЗрд╡рд╛ рдПрдХрд╛рдЪ рдкреНрд░рдХрд▓реНрдк рднрд╛рдВрдбрд╛рд░рд╛рдд рд╕реНрдерд┐рдд рдЖрд╣реЗрдд рдЖрдгрд┐ CI/CD рдордзреНрдпреЗ рдПрдХрд╛рдЪ рдкреНрд░рдХреНрд░рд┐рдпреЗрджреНрд╡рд╛рд░реЗ рд░рд┐рд▓реАрдЬ рд╣реЛрддрд╛рдд.

Git рд╢рд╛рдЦрд╛ рдЖрдгрд┐ Git рдЯреЕрдЧрджреНрд╡рд╛рд░реЗ рдЯреЕрдЧ рдХрд░рдгреЗ

рд╕рдордЬрд╛ рд╕рд░реНрд╡рд╛рдд рд╕рд╛рдорд╛рдиреНрдп рдЯреЕрдЧрд┐рдВрдЧ рдзреЛрд░рдг рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ - рдЯреЕрдЧ-рдХрд┐рдВрд╡рд╛-рд╢рд╛рдЦрд╛. Git рд╢рд╛рдЦрд╛рдВрд╕рд╛рдареА, рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╕рд╣ рдкреНрд░рддрд┐рдорд╛ рдЯреЕрдЧ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рдПрдХрд╛ рд╡реЗрд│реА рдПрдХрд╛ рд╢рд╛рдЦреЗрд╕рд╛рдареА рддреНрдпрд╛ рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдиреЗ рдлрдХреНрдд рдПрдХ рдкреНрд░рдХрд╛рд╢рд┐рдд рдкреНрд░рддрд┐рдорд╛ рдЕрд╕рддреЗ. Git рдЯреЕрдЧрд╕рд╛рдареА, рдЯреЕрдЧрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рдорд╛ рдЯреЕрдЧ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд.

рдЬреЗрд╡реНрд╣рд╛ рдирд╡реАрди рдЧрд┐рдЯ рдЯреЕрдЧ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ - рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЬреЗрд╡реНрд╣рд╛ рдирд╡реАрди рдЖрд╡реГрддреНрддреА рд░рд┐рд▓реАрдЭ рдХреЗрд▓реА рдЬрд╛рддреЗ рддреЗрд╡реНрд╣рд╛ - рдбреЙрдХрд░ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреАрд▓ рд╕рд░реНрд╡ рдкреНрд░рдХрд▓реНрдк рдкреНрд░рддрд┐рдорд╛рдВрд╕рд╛рдареА рдПрдХ рдирд╡реАрди рдбреЙрдХрд░ рдЯреЕрдЧ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓:

  • myregistry.org/myproject/frontend:v1.1.10
  • myregistry.org/myproject/myservice1:v1.1.10
  • myregistry.org/myproject/myservice2:v1.1.10
  • myregistry.org/myproject/myservice3:v1.1.10
  • myregistry.org/myproject/myservice4:v1.1.10
  • myregistry.org/myproject/myservice5:v1.1.10
  • myregistry.org/myproject/database:v1.1.10

рд╣реА рдирд╡реАрди рдкреНрд░рддрд┐рдорд╛ рдирд╛рд╡реЗ рд╣реЗрд▓реНрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕рджреНрд╡рд╛рд░реЗ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдкрд╛рдард╡рд┐рд▓реА рдЬрд╛рддрд╛рдд. рдХрдорд╛рдВрдбрд╕рд╣ рддреИрдирд╛рддреА рд╕реБрд░реВ рдХрд░рддрд╛рдирд╛ werf deploy рдлреАрд▓реНрдб рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдд рдЖрд╣реЗ image рдмрджрд▓рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддрд┐рдореЗрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдореБрд│реЗ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд░рд┐рд╕реЛрд░реНрд╕реЗрд╕рдордзреНрдпреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЗ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛рдд рдЖрдгрд┐ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреЗ.

рд╕рдорд╕реНрдпрд╛: рдЬреЗрд╡реНрд╣рд╛, рдЦрд░рдВ рддрд░, рдорд╛рдЧреАрд▓ рд░реЛрд▓рдЖрдЙрдЯ (рдЧрд┐рдЯ рдЯреЕрдЧ) рдкрд╛рд╕реВрди рдкреНрд░рддрд┐рдореЗрдЪреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓рд▓реА рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХреЗрд╡рд│ рддреНрдпрд╛рдЪрд╛ рдбреЙрдХрд░ рдЯреЕрдЧ, рдЕрд╕реЗ рдШрдбрддреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдд рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдиреБрд╕рд╛рд░, рдХрд╛рд╣реА рдбрд╛рдЙрдирдЯрд╛рдЗрдо рд╢рдХреНрдп рдЖрд╣реЗ. рдЬрд░реА рд╣реЗ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреЗ рдХреЛрдгрддреЗрд╣реА рдЦрд░реЗ рдХрд╛рд░рдг рдирд╡реНрд╣рддреЗ.

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

Git рдХрдорд┐рдЯ рджреНрд╡рд╛рд░реЗ рдЯреЕрдЧ рдХрд░рдгреЗ

werf рдХрдбреЗ Git рдХрдорд┐рдЯрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЯреЕрдЧрд┐рдВрдЧ рдзреЛрд░рдг рджреЗрдЦреАрд▓ рдЖрд╣реЗ.

Git-commit рд╣реЗ Git рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреАрд▓ рд╕рд╛рдордЧреНрд░реАрд╕рд╛рдареА рдПрдХ рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХ рдЖрд╣реЗ рдЖрдгрд┐ Git рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреАрд▓ рдлрд╛рдпрд▓реАрдВрдЪреНрдпрд╛ рд╕рдВрдкрд╛рджрди рдЗрддрд┐рд╣рд╛рд╕рд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдбреЙрдХрд░ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рдкреНрд░рддрд┐рдорд╛ рдЯреЕрдЧ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рдгреЗ рддрд░реНрдХрд╕рдВрдЧрдд рдЖрд╣реЗ.

рддрдерд╛рдкрд┐, Git рдХрдорд┐рдЯрджреНрд╡рд╛рд░реЗ рдЯреЕрдЧрд┐рдВрдЧрдЪреЗ Git рд╢рд╛рдЦрд╛ рдХрд┐рдВрд╡рд╛ Git рдЯреЕрдЧрджреНрд╡рд╛рд░реЗ рдЯреЕрдЧ рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗрдЪ рддреЛрдЯреЗ рдЖрд╣реЗрдд:

  • рдПрдХ рд░рд┐рдХреНрдд рдХрдорд┐рдЯ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рдЬреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рдлрд╛рдпрд▓реА рдмрджрд▓рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рдбреЙрдХрд░ рдЯреЕрдЧ рдмрджрд▓рд▓рд╛ рдЬрд╛рдИрд▓.
  • рдПрдХ рдорд░реНрдЬ рдХрдорд┐рдЯ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рдЬреЗ рдлрд╛рдЗрд▓реНрд╕ рдмрджрд▓рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЗрдореЗрдЬрдЪрд╛ рдбреЙрдХрд░ рдЯреЕрдЧ рдмрджрд▓рд▓рд╛ рдЬрд╛рдИрд▓.
  • рдПрдХ рд╡рдЪрдирдмрджреНрдзрддрд╛ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдЬреА Git рдордзреАрд▓ рддреНрдпрд╛ рдлрд╛рдпрд▓реА рдмрджрд▓рддреЗ рдЬреНрдпрд╛ рдкреНрд░рддрд┐рдореЗрдордзреНрдпреЗ рдЖрдпрд╛рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдд рдирд╛рд╣реАрдд рдЖрдгрд┐ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рдбреЙрдХрд░ рдЯреЕрдЧ рдкреБрдиреНрд╣рд╛ рдмрджрд▓рд▓рд╛ рдЬрд╛рдИрд▓.

Git рд╢рд╛рдЦреЗрдЪреЗ рдирд╛рд╡ рдЯреЕрдЧ рдХрд░рдгреЗ рдкреНрд░рддрд┐рдорд╛ рдЖрд╡реГрддреНрддреА рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдд рдирд╛рд╣реА

Git рд╢рд╛рдЦрд╛рдВрд╕рд╛рдареА рдЯреЕрдЧрд┐рдВрдЧ рдзреЛрд░рдгрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрдгрдЦреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ.

рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдиреЗ рдЯреЕрдЧ рдХрд░рдгреЗ рдЬреЛрдкрд░реНрдпрдВрдд рддреНрдпрд╛ рд╢рд╛рдЦреЗрд╡рд░реАрд▓ рдХрдорд┐рдЯ рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдорд╛рдиреЗ рдПрдХрддреНрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рддреЛрдкрд░реНрдпрдВрдд рдХрд╛рд░реНрдп рдХрд░рддреЗ.

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

рдпрд╛ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдПрдХрд╛ рд╢рд╛рдЦреЗрдд рдПрдХрд╛рдорд╛рдЧреЛрдорд╛рдЧ рдкреБрд╢ рдХреЗрд▓реНрдпрд╛рдиреЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рджрд░рдореНрдпрд╛рди рдХрдореА рдХрд╛рд▓рд╛рд╡рдзреАрд╕рд╣, рдЬреБрдиреА рдХрдорд┐рдЯ рдирд╡реАрдирдкреЗрдХреНрд╖рд╛ рдирдВрддрд░ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ: рдЗрдореЗрдЬрдЪреА рдЬреБрдиреА рдЖрд╡реГрддреНрддреА Git рд╢рд╛рдЦрд╛ рдЯреЕрдЧ рд╡рд╛рдкрд░реВрди рдирд╡реАрди рдУрд╡реНрд╣рд░рд░рд╛рдЗрдЯ рдХрд░реЗрд▓. рдЕрд╢рд╛ рд╕рдорд╕реНрдпрд╛ CI/CD рдкреНрд░рдгрд╛рд▓реАрджреНрд╡рд╛рд░реЗ рд╕реЛрдбрд╡рд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, GitLab CI рдордзреНрдпреЗ рдирдВрддрд░рдЪреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрдорд┐рдЯрдЪреНрдпрд╛ рдорд╛рд▓рд┐рдХреЗрд╕рд╛рдареА рд▓рд╛рдБрдЪ рдХреЗрд▓реА рдЬрд╛рддреЗ). рддрдерд╛рдкрд┐, рд╕рд░реНрд╡ рдкреНрд░рдгрд╛рд▓реА рдпрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реАрдд рдЖрдгрд┐ рдЕрд╢рд╛ рдореВрд▓рднреВрдд рд╕рдорд╕реНрдпрд╛ рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдорд╛рд░реНрдЧ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдЯреЕрдЧрд┐рдВрдЧ рдореНрд╣рдгрдЬреЗ рдХрд╛рдп?

рддрд░, рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдЯреЕрдЧрд┐рдВрдЧ рдореНрд╣рдгрдЬреЗ рдХрд╛рдп - рд╕рд╛рдордЧреНрд░реАрджреНрд╡рд╛рд░реЗ рдкреНрд░рддрд┐рдорд╛ рдЯреЕрдЧ рдХрд░рдгреЗ.

рдбреЙрдХрд░ рдЯреЕрдЧ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреЗ Git рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡реНрд╣ (Git рд╢рд╛рдЦрд╛, Git рдЯреЕрдЧ...) рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдд рдирд╛рд╣реАрдд, рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдЪреЗрдХрд╕рдо рдЖрд╣реЗ:

  • рдкреНрд░рддрд┐рдореЗрдЪреА рд╕рд╛рдордЧреНрд░реА. рдЗрдореЗрдЬ рдЖрдпрдбреА рдЯреЕрдЧ рддреНрдпрд╛рдЪреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЛ. рдирд╡реАрди рдЖрд╡реГрддреНрддреА рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛, рдкреНрд░рддрд┐рдореЗрддреАрд▓ рдлрд╛рдпрд▓реА рдмрджрд▓рд▓реНрдпрд╛ рдирд╕рд▓реНрдпрд╛рд╕ рд╣рд╛ рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХ рдмрджрд▓рдгрд╛рд░ рдирд╛рд╣реА;
  • Git рдордзреНрдпреЗ рд╣реА рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЗрддрд┐рд╣рд╛рд╕. рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ Git рд╢рд╛рдЦрд╛рдВрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рдорд╛ рдЖрдгрд┐ werf рджреНрд╡рд╛рд░реЗ рднрд┐рдиреНрди рдмрд┐рд▓реНрдб рдЗрддрд┐рд╣рд╛рд╕рд╛рдордзреНрдпреЗ рднрд┐рдиреНрди ID рдЯреЕрдЧ рдЕрд╕рддреАрд▓.

рдЕрд╕рд╛ рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рдЯреЕрдЧ рддрдерд╛рдХрдерд┐рдд рдЖрд╣реЗ рдкреНрд░рддрд┐рдорд╛ рд╕реНрдЯреЗрдЬ рд╕реНрд╡рд╛рдХреНрд╖рд░реА.

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдореЗрдордзреНрдпреЗ рдЯрдкреНрдкреНрдпрд╛рдВрдЪрд╛ рд╕рдВрдЪ рдЕрд╕рддреЛ: from, before-install, git-archive, install, imports-after-install, before-setup... git-latest-patch рдЗ. рдкреНрд░рддреНрдпреЗрдХ рдЯрдкреНрдкреНрдпрд╛рдд рдПрдХ рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХ рдЕрд╕рддреЛ рдЬреЛ рддреНрдпрд╛рддреАрд▓ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЛ - рд╕реНрдЯреЗрдЬ рд╕реНрд╡рд╛рдХреНрд╖рд░реА (рд╕реНрдЯреЗрдЬ рд╕реНрд╡рд╛рдХреНрд╖рд░реА).

рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕рд▓реЗрд▓реА рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдорд╛ рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЪрд╛рдЪреНрдпрд╛ рддрдерд╛рдХрдерд┐рдд рд╕реНрд╡рд╛рдХреНрд╖рд░реАрд╕рд╣ рдЯреЕрдЧ рдХреЗрд▓реЗрд▓реА рдЖрд╣реЗ - рдЯрдкреНрдкреЗ рд╕реНрд╡рд╛рдХреНрд╖рд░реА, - рдЬреЗ рдкреНрд░рддрд┐рдореЗрдЪреНрдпрд╛ рд╕рд░реНрд╡ рдЯрдкреНрдкреНрдпрд╛рдВрд╕рд╛рдареА рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рдд рдЖрд╣реЗ.

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдореЗрд╕рд╛рдареА werf.yaml рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдмрддреАрдд, рд╕реНрд╡рддрдГрдЪреА рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдиреБрд╕рд╛рд░, рдПрдХ рдбреЙрдХрд░ рдЯреЕрдЧ рдЕрд╕реЗрд▓.

рд╕реНрдЯреЗрдЬ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдпрд╛ рд╕рд░реНрд╡ рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рддреЗ:

  • рд░рд┐рдХрд╛рдореНрдпрд╛ Git рдХрдорд┐рдЯрд╕рд╛рдареА рдкреНрд░рддрд┐рд░реЛрдзрдХ.
  • Git рдХрдорд┐рдЯрд▓рд╛ рдкреНрд░рддрд┐рд░реЛрдзрдХ рдлрд╛рдпрд▓реА рдмрджрд▓рддрд╛рдд рдЬреЗ рдкреНрд░рддрд┐рдореЗрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рд╣реАрдд.
  • рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рдЬреБрдиреНрдпрд╛ рдЧрд┐рдЯ рдХрдорд┐рдЯрд╕рд╛рдареА рдмрд┐рд▓реНрдб рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рддрд╛рдирд╛ рдкреНрд░рддрд┐рдореЗрдЪреА рд╡рд░реНрддрдорд╛рди рдЖрд╡реГрддреНрддреА рдУрд╡реНрд╣рд░рд╣реЙрд▓ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рдд рдирд╛рд╣реА.

рд╣реЗ рдЖрддрд╛ рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реЗрд▓реЗ рдЯреЕрдЧрд┐рдВрдЧ рдзреЛрд░рдг рдЖрд╣реЗ рдЖрдгрд┐ рд╕рд░реНрд╡ CI рдкреНрд░рдгрд╛рд▓реАрдВрд╕рд╛рдареА werf рдордзреНрдпреЗ рдбреАрдлреЙрд▓реНрдЯ рдЖрд╣реЗ.

werf рдордзреНрдпреЗ рдХрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рд╛рд╡реЗ рдЖрдгрд┐ рдХрд╕реЗ рд╡рд╛рдкрд░рд╛рд╡реЗ

рдХрдорд╛рдВрдбрд▓рд╛ рдЖрддрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░реНрдпрд╛рдп рдЖрд╣реЗ werf publish: --tag-by-stages-signature=true|false

рд╕реАрдЖрдп рд╕рд┐рд╕реНрдЯрдордордзреНрдпреЗ, рдЯреЕрдЧрд┐рдВрдЧ рдзреЛрд░рдг рдХрдорд╛рдВрдбрджреНрд╡рд╛рд░реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рддреЗ werf ci-env. рдкреВрд░реНрд╡реА, рддреНрдпрд╛рд╕рд╛рдареА рдкреЕрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рд╣реЛрддреЗ werf ci-env --tagging-strategy=tag-or-branch. рдЖрддрд╛, рдЖрдкрдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реНрдпрд╛рд╕ werf ci-env --tagging-strategy=stages-signature рдХрд┐рдВрд╡рд╛ рд╣рд╛ рдкрд░реНрдпрд╛рдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рдирдХрд╛, werf рдореБрд▓рднреВрддрд░рд┐рддреНрдпрд╛ рдЯреЕрдЧрд┐рдВрдЧ рдзреЛрд░рдг рд╡рд╛рдкрд░реЗрд▓ stages-signature. рд╕рдВрдШ werf ci-env рдХрдорд╛рдВрдбрд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдзреНрд╡рдЬ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд╕реЗрдЯ рдХрд░реЗрд▓ werf build-and-publish (рдХрд┐рдВрд╡рд╛ werf publish), рддреНрдпрд╛рдореБрд│реЗ рдпрд╛ рдЖрджреЗрд╢рд╛рдВрд╕рд╛рдареА рдХреЛрдгрддреЗрд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реНрдпрд╛рдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдЬреНрдЮрд╛:

werf publish --stages-storage :local --images-repo registry.hello.com/web/core/system --tag-by-stages-signature

... рдЦрд╛рд▓реАрд▓ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛:

  • registry.hello.com/web/core/system/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d
  • registry.hello.com/web/core/system/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6

рддреЛ рдЖрд╣реЗ 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d - рд╣реА рдкреНрд░рддрд┐рдореЗрдЪреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рдВрдЪреА рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдЖрд╣реЗ backendрдЖрдгрд┐ f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 - рдкреНрд░рддрд┐рдорд╛ рдЯрдкреНрдкреНрдпрд╛рдВрдЪреА рд╕реНрд╡рд╛рдХреНрд╖рд░реА frontend.

рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЗ рд╡рд╛рдкрд░рддрд╛рдирд╛ werf_container_image ╨╕ werf_container_env рд╣реЗрд▓реНрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕рдордзреНрдпреЗ рдХрд╛рд╣реАрд╣реА рдмрджрд▓рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА: рд╣реА рдлрдВрдХреНрд╢рдиреНрд╕ рдЖрдкреЛрдЖрдк рдпреЛрдЧреНрдп рдкреНрд░рддрд┐рдорд╛ рдирд╛рд╡реЗ рддрдпрд╛рд░ рдХрд░рддреАрд▓.

рд╕реАрдЖрдп рд╕рд┐рд╕реНрдЯрдордордзреАрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рдЙрджрд╛рд╣рд░рдг:

type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deploy

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреА рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдд рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ:

рдПрдХреВрдг

  • рдирд╡реАрди рдкрд░реНрдпрд╛рдп werf publish --tag-by-stages-signature=true|false.
  • рдирд╡реАрди рдкрд░реНрдпрд╛рдп рдореВрд▓реНрдп werf ci-env --tagging-strategy=stages-signature|tag-or-branch (рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рдХреЗрд▓реНрдпрд╛рд╕, рдбреАрдлреЙрд▓реНрдЯ рдЕрд╕реЗрд▓ stages-signature).
  • рдЖрдкрдг рдпрд╛рдкреВрд░реНрд╡реА Git рдХрдорд┐рдЯрд╕рд╛рдареА рдЯреЕрдЧрд┐рдВрдЧ рдкрд░реНрдпрд╛рдп рд╡рд╛рдкрд░рд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕ (WERF_TAG_GIT_COMMIT рдХрд┐рдВрд╡рд╛ рдкрд░реНрдпрд╛рдп werf publish --tag-git-commit COMMIT), рдирдВрддрд░ рдЯреЕрдЧрд┐рдВрдЧ рдзреЛрд░рдгрд╛рд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рд╛ рдЯрдкреНрдкреЗ - рд╕реНрд╡рд╛рдХреНрд╖рд░реА.
  • рдирд╡реАрди рдЯреЕрдЧрд┐рдВрдЧ рдпреЛрдЬрдиреЗрд╡рд░ рдирд╡реАрди рдкреНрд░рдХрд▓реНрдк рддреНрд╡рд░рд┐рдд рд╕реНрд╡рд┐рдЪ рдХрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ.
  • werf 1.1 рдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛рдирд╛, рдЬреБрдиреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдирд╛ рдирд╡реАрди рдЯреЕрдЧрд┐рдВрдЧ рдпреЛрдЬрдиреЗрд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╕рд▓реНрд▓рд╛ рджрд┐рд▓рд╛ рдЬрд╛рддреЛ, рдкрд░рдВрддреБ рдЬреБрдиреЗ рдЯреЕрдЧ-рдХрд┐рдВрд╡рд╛-рд╢рд╛рдЦрд╛ рдЕрдЬреВрдирд╣реА рд╕рдорд░реНрдерд┐рдд рдЖрд╣реЗ.

рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдЯреЕрдЧрд┐рдВрдЧ рд▓реЗрдЦрд╛рдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рддреЗ:

  • рд░рд┐рдХрд╛рдореНрдпрд╛ рдЧрд┐рдЯ рдХрдорд┐рдЯрд╕рд╛рдареА рдбреЙрдХрд░ рдЯреЕрдЧ рдирд╛рд╡рд╛рдЪрд╛ рдкреНрд░рддрд┐рдХрд╛рд░.
  • Git рд╡рд░ рдбреЙрдХрд░ рдЯреЕрдЧ рдирд╛рд╡рд╛рдЪреА рд▓рд╡рдЪрд┐рдХрддрд╛ рдкреНрд░рддрд┐рдореЗрд╢реА рдЕрд╕рдВрдмрджреНрдз рдлрд╛рдЗрд▓реНрд╕ рдмрджрд▓рддреЗ.
  • рдЧреАрдЯ рд╢рд╛рдЦрд╛рдВрд╕рд╛рдареА рдЬреБрдиреНрдпрд╛ рдЧрд┐рдЯ рдХрдорд┐рдЯрд╕рд╛рдареА рдмрд┐рд▓реНрдб рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рддрд╛рдирд╛ рдЗрдореЗрдЬрдЪреА рд╡рд░реНрддрдорд╛рди рдЖрд╡реГрддреНрддреА рдУрд╡реНрд╣рд░рд╣реЙрд▓ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рдд рдирд╛рд╣реА.

рд╡рд╛рдкрд░ рдХрд░рд╛! рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдпреЗрдереЗ рднреЗрдЯ рджреНрдпрд╛рдпрд▓рд╛ рд╡рд┐рд╕рд░реВ рдирдХрд╛ GitHubрд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рд╡рд┐рджреНрдпрдорд╛рди рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА, рдПрдХ рдкреНрд▓рд╕ рдЬреЛрдбрд╛, рдПрдХ PR рддрдпрд╛рд░ рдХрд░рд╛ рдХрд┐рдВрд╡рд╛ рдлрдХреНрдд рдкреНрд░рдХрд▓реНрдкрд╛рдЪрд╛ рд╡рд┐рдХрд╛рд╕ рдкрд╣рд╛.

PS

рдЖрдордЪреНрдпрд╛ рдмреНрд▓реЙрдЧрд╡рд░ рджреЗрдЦреАрд▓ рд╡рд╛рдЪрд╛:

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

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