рдПрдЙрдЯрд╛ Git рднрдгреНрдбрд╛рд░рдмрд╛рдЯ рдорд╛рдЗрдХреНрд░реЛ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд╕реЗрдЯ рд░реЛрд▓ рдЖрдЙрдЯ рдЧрд░реНрджреИ
рдПрдЙрдЯрд╛ рдЕрд╡рд╕реНрдерд╛ рдкреНрд░рд╛рдпрдГ рддрдм рд╣реБрдиреНрдЫ рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдзреЗрд░реИ рд╡рд╛ рдХрдо рд╕реНрд╡рддрдиреНрддреНрд░ рд╕реЗрд╡рд╛рд╣рд░реВрдорд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реБрдиреНрдЫред рдпреА рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд░рд┐рд▓реАрдЬ рд╕реНрд╡рддрдиреНрддреНрд░ рд░реВрдкрдорд╛ рд╣реБрди рд╕рдХреНрдЫ: рдПрдХ рд╡рд╛ рдзреЗрд░реИ рд╕реЗрд╡рд╛рд╣рд░реВ рдПрдХ рдкрдЯрдХрдорд╛ рдЬрд╛рд░реА рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЬрдмрдХрд┐ рдмрд╛рдБрдХреА рдХреБрдиреИ рдкрд░рд┐рд╡рд░реНрддрди рдмрд┐рдирд╛ рдХрд╛рдо рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреБрдкрд░реНрдЫред рддрд░ рдХреЛрдб рднрдгреНрдбрд╛рд░рдг рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рдпрд╕реНрддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗрд╡рд╛рд╣рд░реВ рдПрдХрд▓ рднрдгреНрдбрд╛рд░рдорд╛ рд░рд╛рдЦреНрди рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫред
рддреНрдпрд╣рд╛рдБ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рд╣рд░реВ рдЫрдиреН рдЬрдм рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рд╛рдБрдЪреНрдЪреИ рд╕реНрд╡рддрдиреНрддреНрд░ рдЫрдиреН рд░ рдПрдХрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫреИрдирдиреНред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рддрд┐рдиреАрд╣рд░реВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрдиреЗрдЫрдиреН рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд░рд┐рд▓реАрдЬ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ CI/CD рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдорд╛рд░реНрдлрдд рдЧрд░рд┐рдиреЗрдЫред
рдпрджреНрдпрдкрд┐, рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛рдорд╛, рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдкреНрд░рд╛рдпрдГ рдПрдЙрдЯреИ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рдзреЗрд░реИ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕реЗрд╕рд╣рд░реВрдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░реНрдЫрдиреН, рддрд░ рдкреНрд░рддреНрдпреЗрдХрдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рднрдгреНрдбрд╛рд░ рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ... рд╕реНрдкрд╖реНрдЯ рдУрднрд░рдХрд┐рд▓ рд╣реЛред рдпреЛ рдЕрд╡рд╕реНрдерд╛ рд╣реЛ рдЬреБрди рдердк рдЫрд▓рдлрд▓ рдЧрд░рд┐рдиреЗрдЫ: рдзреЗрд░реИ рддреНрдпрд╕реНрддрд╛ рд▓рдШреБ рд╕реЗрд╡рд╛рд╣рд░реВ рдПрдХрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрдгреНрдбрд╛рд░рдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдЫрдиреН рд░ CI/CD рдорд╛ рдПрдХрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рд░реНрдлрдд рд░рд┐рд▓реАрдЬрд╣рд░реВ рд╣реБрдиреНрдЫрдиреНред
Git рд╢рд╛рдЦрд╛ рд░ 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
рдпреА рдирдпрд╛рдБ рдЫрд╡рд┐ рдирд╛рдорд╣рд░реВ рд╣реЗрд▓реНрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВ рдорд╛рд░реНрдлрдд Kubernetes рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдкрдард╛рдЗрдиреНрдЫред рдЖрджреЗрд╢рдХреЛ рд╕рд╛рде рддреИрдирд╛рддреА рд╕реБрд░реБ рдЧрд░реНрджрд╛ werf deploy
рдХреНрд╖реЗрддреНрд░ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рднрдЗрд░рд╣реЗрдХреЛ рдЫ image
рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░рд┐рдПрдХреЛ рдЫрд╡рд┐ рдирд╛рдордХреЛ рдХрд╛рд░рдгрд▓реЗ Kubernetes рд╕рдВрд╕рд╛рдзрдирдорд╛ рд╕рдореНрдмрджреНрдз рд╕реНрд░реЛрддрд╣рд░реВ рдкреНрд░рдХрдЯ рд░ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрджреИред
рд╕рдорд╕реНрдпрд╛: рдХреЗрд╕рдорд╛ рдЬрдм, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдЫрд╡рд┐рдХреЛ рд╕рд╛рдордЧреНрд░реА рдЕрдШрд┐рд▓реНрд▓реЛ рд░реЛрд▓рдЖрдЙрдЯ (рдЧрд┐рдЯ рдЯреНрдпрд╛рдЧ) рдкрдЫрд┐ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХреЛ рдЫреИрди, рддрд░ рдпрд╕рдХреЛ рдбрдХрд░ рдЯреНрдпрд╛рдЧ рдорд╛рддреНрд░, рдпреЛ рд╣реБрдиреНрдЫред рдЕрддрд┐рд░рд┐рдХреНрдд рдпреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрджреИ рд░, рддрджрдиреБрд╕рд╛рд░, рдХреЗрд╣реА рдбрд╛рдЙрдирдЯрд╛рдЗрдо рд╕рдореНрднрд╡ рдЫред рдпрджреНрдпрдкрд┐ рдпреЛ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрди рдХреБрдиреИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рдерд┐рдПрдиред
рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╣рд╛рд▓рдХреЛ рдЯреНрдпрд╛рдЧрд┐рдЩ рдпреЛрдЬрдирд╛рдХреЛ рд╕рд╛рде рдзреЗрд░реИ рдЕрд▓рдЧ Git рднрдгреНрдбрд╛рд░рд╣рд░реВ рдмрд╛рдбреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рд░ рдпреА рдзреЗрд░реИ рднрдгреНрдбрд╛рд░рд╣рд░реВрдХреЛ рд░реЛрд▓рдЖрдЙрдЯ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдпрд╕реНрддреЛ рдпреЛрдЬрдирд╛ рдУрднрд░рд▓реЛрдб рд░ рдЬрдЯрд┐рд▓ рд╣реБрди рдЬрд╛рдиреНрдЫред рдзреЗрд░реИ рд╕реЗрд╡рд╛рд╣рд░реВрд▓рд╛рдИ рдПрдХрд▓ рднрдгреНрдбрд╛рд░рдорд╛ рдорд┐рд▓рд╛рдПрд░ рдбрдХрд░ рдЯреНрдпрд╛рдЧрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рд╣реБрдиреНрдЫ рддрд╛рдХрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреБрди: рд╕реБрд░реБ рд╣реБрдБрджреИрдиред
Git рдХрдорд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдЯреНрдпрд╛рдЧ рдЧрд░реНрджреИ
werf рд╕рдБрдЧ Git рдХрдорд┐рдЯрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЯреНрдпрд╛рдЧрд┐рдЩ рд░рдгрдиреАрддрд┐ рдкрдирд┐ рдЫред
Git-commit рдПрдХ Git рднрдгреНрдбрд╛рд░рдХреЛ рд╕рд╛рдордЧреНрд░реАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛ рд░ Git рднрдгреНрдбрд╛рд░рдорд╛ рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд╕рдореНрдкрд╛рджрди рдЗрддрд┐рд╣рд╛рд╕рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫ, рддреНрдпрд╕реИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдЫрд╡рд┐рд╣рд░реВ рдЯреНрдпрд╛рдЧ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рддрд╛рд░реНрдХрд┐рдХ рджреЗрдЦрд┐рдиреНрдЫред
рдпрджреНрдпрдкрд┐, Git рдХрдорд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдЯреНрдпрд╛рдЧ рдЧрд░реНрдиреЗ Git рд╢рд╛рдЦрд╛рд╣рд░реВ рд╡рд╛ Git рдЯреНрдпрд╛рдЧрд╣рд░реВ рджреНрд╡рд╛рд░рд╛ рдЯреНрдпрд╛рдЧрд┐рдЩрдХреЛ рд░реВрдкрдорд╛ рд╕рдорд╛рди рд╣рд╛рдирд┐рд╣рд░реВ рдЫрдиреН:
- рдПрдЙрдЯрд╛ рдЦрд╛рд▓реА рдХрдорд┐рдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЬрд╕рд▓реЗ рдХреБрдиреИ рдкрдирд┐ рдлрд╛рдЗрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджреИрди, рддрд░ рдЫрд╡рд┐рдХреЛ рдбрдХрд░ рдЯреНрдпрд╛рдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗрдЫред
- рдорд░реНрдЬ рдХрдорд┐рдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЬрд╕рд▓реЗ рдлрд╛рдЗрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджреИрди, рддрд░ рдЫрд╡рд┐рдХреЛ рдбрдХрд░ рдЯреНрдпрд╛рдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗрдЫред
- рдПрдЙрдЯрд╛ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЬрд╕рд▓реЗ Git рдорд╛ рддреА рдлрд╛рдЗрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджрдЫ рдЬреБрди рдЫрд╡рд┐рдорд╛ рдЖрдпрд╛рдд рдЧрд░рд┐рдПрдХреЛ рдЫреИрди, рд░ рдЫрд╡рд┐рдХреЛ рдбрдХрд░ рдЯреНрдпрд╛рдЧ рдлреЗрд░рд┐ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗрдЫред
Git рд╢рд╛рдЦрд╛ рдирд╛рдо рдЯреНрдпрд╛рдЧ рдЧрд░реНрджреИ рдЫрд╡рд┐ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рдЧрд░реНрджреИрди
Git рд╢рд╛рдЦрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЯреНрдпрд╛рдЧрд┐рдЩ рд░рдгрдиреАрддрд┐рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЕрд░реНрдХреЛ рд╕рдорд╕реНрдпрд╛ рдЫред
рд╢рд╛рдЦрд╛рдХреЛ рдирд╛рдордмрд╛рдЯ рдЯреНрдпрд╛рдЧрд┐рдЩрд▓реЗ рдХрд╛рдо рдЧрд░реНрджрдЫ рдЬрдмрд╕рдореНрдо рддреНрдпреЛ рд╢рд╛рдЦрд╛рдорд╛ рдХрдорд┐рдЯрд╣рд░реВ рдХреНрд░рдорд┐рдХ рд░реВрдкрдорд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░рд┐рдиреНрдЫред
рдпрджрд┐ рд╣рд╛рд▓рдХреЛ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд рд╢рд╛рдЦрд╛рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдкреБрд░рд╛рдиреЛ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рд▓рд╛рдИ рдкреБрди: рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдерд╛рд▓реНрдЫ рднрдиреЗ, werf рд▓реЗ рдкреБрд░рд╛рдиреЛ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЫрд╡рд┐рдХреЛ рдирдпрд╛рдБ рдирд┐рд░реНрдорд┐рдд рд╕рдВрд╕реНрдХрд░рдгрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдбрдХрд░ рдЯреНрдпрд╛рдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЫрд╡рд┐рд▓рд╛рдИ рдкреБрди: рд▓реЗрдЦреНрдиреЗрдЫред рдЕрдмрджреЗрдЦрд┐ рдпреЛ рдЯреНрдпрд╛рдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрд╣рд░реВрд▓реЗ рдкреЛрдбрд╣рд░реВ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрджрд╛ рдЫрд╡рд┐рдХреЛ рдлрд░рдХ рд╕рдВрд╕реНрдХрд░рдг рддрд╛рдиреНрдиреЗ рдЬреЛрдЦрд┐рдо рдЪрд▓рд╛рдЙрдБрдЫ, рдЬрд╕рдХреЛ рдкрд░рд┐рдгрд╛рдо рд╕реНрд╡рд░реВрдк рд╣рд╛рдореНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ CI рдкреНрд░рдгрд╛рд▓реАрд╕рдБрдЧ рдЬрдбрд╛рди рдЧреБрдорд╛рдЙрдиреЗрдЫ рд░ рдбрд┐рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬ рд╣реБрдиреЗрдЫред
рдердк рд░реВрдкрдорд╛, рддрд┐рдиреАрд╣рд░реВ рдмреАрдЪрдХреЛ рдЫреЛрдЯреЛ рдЕрд╡рдзрд┐рдХреЛ рд╕рд╛рде рдПрдХ рд╢рд╛рдЦрд╛рдорд╛ рдХреНрд░рдорд┐рдХ рдкреБрд╢рд╣рд░реВ рд╕рдВрдЧ, рдкреБрд░рд╛рдиреЛ рдХрдорд┐рдЯ рдирдпрд╛рдБ рднрдиреНрджрд╛ рдкрдЫрд┐ рдХрдореНрдкрд╛рдЗрд▓ рд╣реБрди рд╕рдХреНрдЫ: рдЫрд╡рд┐рдХреЛ рдкреБрд░рд╛рдиреЛ рд╕рдВрд╕реНрдХрд░рдгрд▓реЗ Git рд╢рд╛рдЦрд╛ рдЯреНрдпрд╛рдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдирдпрд╛рдБрд▓рд╛рдИ рдЕрдзрд┐рд▓реЗрдЦрди рдЧрд░реНрдиреЗрдЫред рддреНрдпрд╕реНрддрд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ CI/CD рдкреНрд░рдгрд╛рд▓реАрджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, GitLab CI рдорд╛ рдкрдЫрд┐рд▓реНрд▓реЛрдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрдорд┐рдЯрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕реБрд░реБ рдЧрд░рд┐рдПрдХреЛ рдЫ)ред рдпрджреНрдпрдкрд┐, рд╕рдмреИ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрд▓реЗ рдпрд╕рд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджреИрдирдиреН рд░ рдпрд╕реНрддреЛ рдЖрдзрд╛рд░рднреВрдд рд╕рдорд╕реНрдпрд╛рд▓рд╛рдИ рд░реЛрдХреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдердк рднрд░рдкрд░реНрджреЛ рддрд░рд┐рдХрд╛ рд╣реБрдиреБрдкрд░реНрджрдЫред
рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдЯреНрдпрд╛рдЧрд┐рдЩ рдХреЗ рд╣реЛ?
рддреНрдпрд╕реЛрднрдП, рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдЯреНрдпрд╛рдЧрд┐рдЩ рднрдиреЗрдХреЛ рдХреЗ рд╣реЛ - рд╕рд╛рдордЧреНрд░реАрджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐рд╣рд░реВ рдЯреНрдпрд╛рдЧ рдЧрд░реНрдиреЗред
рдбрдХрд░ рдЯреНрдпрд╛рдЧрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди, рдпреЛ Git primitives (Git branch, Git рдЯреНрдпрд╛рдЧ...) рд╣реЛрдЗрди рдЬреБрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рддрд░ рдпрд╕рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЪреЗрдХрд╕рдо:
- рдЫрд╡рд┐ рдХреЛ рд╕рд╛рдордЧреНрд░реАред рдЫрд╡рд┐ рдЖрдИрдбреА рдЯреНрдпрд╛рдЧрд▓реЗ рдпрд╕рдХреЛ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рдЧрд░реНрджрдЫред рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛, рдпреЛ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗ рдЫреИрди рдпрджрд┐ рдЫрд╡рд┐рдорд╛ рдлрд╛рдЗрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрди рднрдиреЗ;
- Git рдорд╛ рдпреЛ рдЫрд╡рд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдЗрддрд┐рд╣рд╛рд╕ред werf рдорд╛рд░реНрдлрдд рдмрд┐рднрд┐рдиреНрди Git рд╢рд╛рдЦрд╛рд╣рд░реВ рд░ рдмрд┐рднрд┐рдиреНрди рдирд┐рд░реНрдорд╛рдг рдЗрддрд┐рд╣рд╛рд╕рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫрд╡рд┐рд╣рд░реВрдорд╛ рдлрд░рдХ ID рдЯреНрдпрд╛рдЧрд╣рд░реВ рд╣реБрдиреЗрдЫрдиреНред
рдпрд╕реНрддреЛ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рдЯреНрдпрд╛рдЧ рддрдерд╛рдХрдерд┐рдд рдЫ рдЫрд╡рд┐ рдЪрд░рдг рд╣рд╕реНрддрд╛рдХреНрд╖рд░.
рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдЪрд░рдгрд╣рд░реВрдХреЛ рд╕реЗрдЯ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ: from
, before-install
, git-archive
, install
, imports-after-install
, before-setup
, ... git-latest-patch
рдЖрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдгрдХреЛ рдПрдХ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реБрдиреНрдЫ рдЬрд╕рд▓реЗ рдпрд╕рдХреЛ рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рдЧрд░реНрджрдЫ - рдЪрд░рдг рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (рдордЮреНрдЪ рд╣рд╕реНрддрд╛рдХреНрд╖рд░).
рдЕрдиреНрддрд┐рдо рдЫрд╡рд┐, рдпреА рдЪрд░рдгрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реА, рдпреА рдЪрд░рдгрд╣рд░реВрдХреЛ рд╕реЗрдЯрдХреЛ рддрдерд╛рдХрдерд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд╕рдБрдЧ рдЯреНрдпрд╛рдЧ рдЧрд░рд┐рдПрдХреЛ рдЫ - рдЪрд░рдг рд╣рд╕реНрддрд╛рдХреНрд╖рд░, - рдЬреБрди рдЫрд╡рд┐рдХреЛ рд╕рдмреИ рдЪрд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЧрд░реНрджреИрдЫред
рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдмрд╛рдЯ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐рдХреЛ рд▓рд╛рдЧрд┐ werf.yaml
рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд╕реНрдерд╛рдорд╛, рддреНрдпрд╣рд╛рдБ рдпрд╕рдХреЛ рдЖрдлреНрдиреИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реБрдиреЗрдЫ рд░, рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдбрдХрд░ рдЯреНрдпрд╛рдЧред
рдЪрд░рдг рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд▓реЗ рдпреА рд╕рдмреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрджрдЫ:
- рдЦрд╛рд▓реА Git рдХрдорд┐рдЯрд╣рд░реВрдХреЛ рдкреНрд░рддрд┐рд░реЛрдзреАред
- Git рдХрдорд┐рдЯрдХреЛ рдкреНрд░рддрд┐рд░реЛрдзреА рдлрд╛рдЗрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджрдЫ рдЬреБрди рдЫрд╡рд┐рд╕рдБрдЧ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдЫреИрдиред
- рд╢рд╛рдЦрд╛рдХреЛ рдкреБрд░рд╛рдиреЛ Git рдХрдорд┐рдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрдорд╛рдг рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрджрд╛ рдЫрд╡рд┐рдХреЛ рд╣рд╛рд▓рдХреЛ рд╕рдВрд╕реНрдХрд░рдгрд▓рд╛рдИ рдУрднрд░рд╣рд╛рд▓ рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛рдХреЛ рдиреЗрддреГрддреНрд╡ рдЧрд░реНрджреИрдиред
рдпреЛ рдЕрдм рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░рд┐рдПрдХреЛ рдЯреНрдпрд╛рдЧрд┐рдЩ рд░рдгрдиреАрддрд┐ рд╣реЛ рд░ рд╕рдмреИ CI рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ werf рдорд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛред
werf рдорд╛ рдХрд╕рд░реА рд╕рдХреНрд╖рдо рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ
рдЖрджреЗрд╢рд╕рдБрдЧ рдЕрдм рд╕рдореНрдмрдиреНрдзрд┐рдд рд╡рд┐рдХрд▓реНрдк рдЫ werf publish
: --tag-by-stages-signature=true|false
CI рдкреНрд░рдгрд╛рд▓реАрдорд╛, рдЯреНрдпрд╛рдЧрд┐рдЩ рд░рдгрдиреАрддрд┐ рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ 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
рд╣реЗрд▓реНрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВрдорд╛ рдХреЗрд╣рд┐ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрди: рдпреА рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрд▓реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╕рд╣реА рдЫрд╡рд┐ рдирд╛рдорд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗрдЫред
CI рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдЙрджрд╛рд╣рд░рдг рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди:
type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deploy
рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдердк рдЬрд╛рдирдХрд╛рд░реА рдХрд╛рдЧрдЬрд╛рддрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫ:
-
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ тЖТ рдкреНрд░рдХрд╛рд╢рди (рдкреНрд░рдХрд╛рд╢рди) ; -
CI/CD тЖТ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА тЖТ рдЪрд░рдг-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджреИ ; -
GitLab CI/CD тЖТ .gitlab-ci.yml рд╕рдБрдЧ рдПрдХреАрдХрд░рдг .
рдХреБрд▓
- рдирдпрд╛рдБ рд╡рд┐рдХрд▓реНрдк
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 рдХрдорд┐рдЯрд╣рд░реВрдорд╛ рдбрдХрд░ рдЯреНрдпрд╛рдЧ рдирд╛рдо рдкреНрд░рддрд┐рд░реЛрдзред
- Git рдорд╛ рдбрдХрд░ рдЯреНрдпрд╛рдЧ рдирд╛рдордХреЛ рд▓рдЪрд┐рд▓реЛрдкрдирд▓реЗ рдЫрд╡рд┐рдорд╛ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдлрд╛рдЗрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджрдЫред
- Git рд╢рд╛рдЦрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреБрд░рд╛рдиреЛ Git рдХрдорд┐рдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрдорд╛рдгрд╣рд░реВ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрджрд╛ рдЫрд╡рд┐рдХреЛ рд╣рд╛рд▓рдХреЛ рд╕рдВрд╕реНрдХрд░рдгрд▓рд╛рдИ рдУрднрд░рд╣рд╛рд▓ рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛рдХреЛ рдиреЗрддреГрддреНрд╡ рдЧрд░реНрджреИрдиред
рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░! рд░ рд╣рд╛рдореАрд▓рд╛рдИ рднреНрд░рдордг рдЧрд░реНрди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН
PS
рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:
- ┬л
werf 1.1 рд░рд┐рд▓реАрдЬ: рдЖрдЬ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдорд╛ рд╕реБрдзрд╛рд░рд╣рд░реВ рд░ рднрд╡рд┐рд╖реНрдпрдХрд╛ рд▓рд╛рдЧрд┐ рдпреЛрдЬрдирд╛рд╣рд░реВ ┬╗ - ┬л
рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрджреИ werf 1.0 рд╕реНрдерд┐рд░: GitOps рд▓реЗ рдпрд╕рдХреЛ рд╕рд╛рде рдХреЗ рдЧрд░реНрдиреБрдкрд░реНрджрдЫ, рд╕реНрдерд┐рддрд┐ рд░ рдпреЛрдЬрдирд╛рд╣рд░реВ ┬╗ - ┬л
werf - Kubernetes рдорд╛ CI / CD рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореНрд░реЛ рдЙрдкрдХрд░рдг (рдЕрд╡рд▓реЛрдХрди рд░ рднрд┐рдбрд┐рдпреЛ рд░рд┐рдкреЛрд░реНрдЯ) ┬╗; - werf рдорд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдмрд╛рд░реЗ рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛:
- ┬л
рд╡реЗрд░реНрдлрдорд╛ рей-рдорд╛рд░реНрдЧ рдорд░реНрдЬ: рд╣реЗрд▓реНрдордХреЛ рд╕рд╛рде рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдорд╛ рддреИрдирд╛рддреА "рд╕реНрдЯреЗрд░реЛрдЗрдбрд╣рд░реВрдорд╛" ┬╗; - ┬л
рдЬрдЯрд┐рд▓ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯрд╣рд░реВ рд░реЛрд▓ рдЖрдЙрдЯ рдЧрд░реНрди werf рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ ┬╗; - ┬л
werf рдорд╛ рдореЛрдиреЛрд░реЗрдкреЛ рд░ рдорд▓реНрдЯрд┐рд░реЗрдкреЛрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рд░ рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрд▓реЗ рдпрд╕рд╕рдБрдЧ рдХреЗ рдЧрд░реНрдиреБрдкрд░реНрджрдЫ ┬╗; - ┬л
рддрдкрд╛рдИрдВ рдЕрдм рдирд┐рдпрдорд┐рдд рдбрдХрд░рдлрд╛рдЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдбрдХрд░ рдЫрд╡рд┐рд╣рд░реВ werf рдорд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ "ред
- ┬л
рд╕реНрд░реЛрдд: www.habr.com