рд╢реБрдн рджрд┐рди, Habr!
рдЖрдЬ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдБрдЧрд╛ рдХрд╛рд░реНрдп рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░реЗрдВ рдЬреЗрдирдХреАрдВрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдПрдХреАрдХреГрдд рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдпред
рдкрд░рд┐рдЪрдп
DevOps рдЬреИрд╕рд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЖрдИрдЯреА рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВ рд░рд╣реА рд╣реИред рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдбреВ рджреЗрд╡рдСрдкреНрд╕" рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрд╛рджреБрдИ рдмрдЯрди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЬрдм рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рддреИрдирд╛рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдЕрдореВрд░реНрдд рд╣реИрдВ)ред
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдРрд╕рд╛ рдЬрд╛рджреБрдИ рдмрдЯрди рдмрдирд╛рдиреЗ рдХрд╛ рдСрд░реНрдбрд░ рдорд┐рд▓рд╛, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рд╢рд╛рд╕рдХ рдПрдХ рдХреНрд▓рд┐рдХ рд╕реЗ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░ рд╕рдХреЗрдВред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ рд╣реИрдВ: рдХрд┐рд╕реА рднреА рдореИрд╕реЗрдВрдЬрд░ рдХреЗ рд▓рд┐рдП рдмреЙрдЯ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд▓реЗрдХрд░ рдПрдХ рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рддрдХред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрди рд╕рдмрдХрд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рд╣реА рд╣реИ - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреА рд╢реБрд░реВрдЖрдд рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдирд╛ред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЗрдирдХреАрдВрд╕.

рдХрд╛рд░реНрдп
рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЬреЗрдирдХрд┐рдВрд╕ рдЬреЙрдм рдмрдирд╛рдПрдВ рдЬреЛ рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЪрдпрдирд┐рдд рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░/рдпрд╛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдЧрд╛ред

рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд╛рд▓реЗ рдХрдИ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИрдВред
рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
рд╣рдорд╛рд░реЗ рдЬреЙрдм рдХреЗ рдЗрдирдкреБрдЯ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП:
- рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛрдб рд╡рд╛рд▓реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ URL рдЬрд┐рд╕реЗ рд╣рдо рдЬреЙрдм рдЪрд▓рдиреЗ рдкрд░ рдмрдирд╛рдирд╛ рдФрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- рдЙрд╕ рдХрдорд┐рдЯ рдХреА рдЖрдИрдбреА рдЬрд┐рд╕рд╕реЗ рдирд┐рд░реНрдорд╛рдг рд╣реЛрдЧрд╛.
рдЬреИрд╕рд╛ рд╣реИ
рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдкрде рдФрд░ рдХрдорд┐рдЯ рдЖрдИрдбреА рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ, рдЖрдкрдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдЕрдм рдЖрдЗрдП рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЖрдЬрд╝рдорд╛рдХрд░ рдЗрд╕рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рджреЗрдЦреЗрдВред
рдЖрдЗрдП рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ Choice Parameter рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрдирд╛рдПрдВ, рддрдерд╛ рджреВрд╕рд░рд╛ - Active Choices Reactive Reference Parameter рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрдирд╛рдПрдВред рдЪреЙрдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ, рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдирд╛рдо рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХрд╛ рдХреЛрдб рдЪреЙрдЗрд╕ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред

рдпрджрд┐ рдпрд╣ рд▓реЗрдЦ рджрд░реНрд╢рдХреЛрдВ рдХреЛ рдкрд╕рдВрдж рдЖрддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЗрдирдХрд┐рдВрд╕ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдЬрд╝ рдХреЛрдб), рдпрд╛рдиреА рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдирд╛рдо рджрд░реНрдЬ рдХрд░рдиреЗ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдЧрд╛ (рд╣рдорд╛рд░рд╛ рдХреЛрдб SCM рд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдПрдЧрд╛)ред
рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рднрд░реЗ рдЬрд╛рдПрдВрдЧреЗ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрдпрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ (test1 рдпрд╛ test2), рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЕрдкрдиреА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред
рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╕рдВрджрд░реНрдн рдкреИрд░рд╛рдореАрдЯрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реАрд▓реНрдб рднрд░рдиреЗ рд╣реИрдВ:
- рдирд╛рдо - рдорд╛рдкрджрдгреНрдб рдирд╛рдоред
- рд▓рд┐рдкрд┐ - рдХреЛрдб рдЬреЛ рд╣рд░ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╕рдВрджрд░реНрднрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝реАрд▓реНрдб рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рд╣рдо test1 рдФрд░ test2 рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ)ред
- рд╡рд┐рд╡рд░рдг - рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг.
- рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо HTML рдХреЛрдб рд▓реМрдЯрд╛рдПрдВрдЧреЗ)ред
- рд╕рдВрджрд░реНрдн рдкреИрд░рд╛рдореАрдЯрд░ - рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рдЬрд┐рд╕рдХрд╛ рдорд╛рди рдмрджрд▓рдиреЗ рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ред

рдЖрдЗрдпреЗ рд╕реАрдзреЗ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝реАрд▓реНрдб рдХреЛ рднрд░рдиреЗ рдХреА рдУрд░ рдмрдврд╝реЗрдВред рд╣рдореЗрдВ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЬрд╛рддреА рд╣реИ: рдЙрдкрдпреЛрдЧ рдЧреНрд░реВрд╡реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ.
рд╣рдордиреЗ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓рд░ рдПрдХ рдкреНрд▓рдЧрдЗрди рдорд╛рддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рд╣реЗрдЬ рд▓реЗрддрд╛ рд╣реИ, рддрдерд╛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рджреЛрдмрд╛рд░рд╛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЪрдпрдирд┐рдд рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╕реЗ рд╕рднреА рдХрдорд┐рдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░реВрд╡реА рдХреЛрдб:
AUTH = "╨╗╨╛╨│╨╕╨╜ ╨╕ ╨┐╨░╤А╨╛╨╗╤М ╨▓ Base64"
GIT_URL = "url ╨┤╨╛ ╨▓╨░╤И╨╡╨╣ SCM (https://bitbucket.org/)"
PROJECT_NAME = "╨╕╨╝╤П ╨┐╤А╨╛╨╡╨║╤В╨╜╨╛╨╣ ╨╛╨▒╨╗╨░╤Б╤В╨╕, ╨│╨┤╨╡ ╨╜╨░╤Е╨╛╨┤╤П╤В╤Б╤П ╤А╨╡╨┐╨╛╨╖╨╕╤В╨╛╤А╨╕╨╕"
def htmlBuild() {
html = """
<html>
<head>
<meta charset="windows-1251">
<style type="text/css">
div.grayTable {
text-align: left;
border-collapse: collapse;
}
.divTable.grayTable .divTableCell, .divTable.grayTable .divTableHead {
padding: 0px 3px;
}
.divTable.grayTable .divTableBody .divTableCell {
font-size: 13px;
}
</style>
</head>
<body>
"""
def commitOptions = ""
getCommitsForMicroservice(MICROSERVICE_NAME).each {
commitOptions += "<option style='font-style: italic' value='COMMIT=${it.getKey()}'>${it}</option>"
}
html += """<p style="display: inline-block;">
<select id="commit_id" size="1" name="value">
${commitOptions}
</select></p></div>"""
html += """
</div>
</div>
</div>
</body>
</html>
"""
return html
}
def getCommitsForMicroservice(microserviceRepo) {
def commits = [:]
def endpoint = GIT_URL + "/rest/api/1.0/projects/${PROJECT_NAME}/repos/${microserviceRepo}/commits"
def conn = new URL(endpoint).openConnection()
conn.setRequestProperty("Authorization", "Basic ${AUTH}")
def response = new groovy.json.JsonSlurper().parseText(conn.content.text)
response.values.each {
commits.put(it.displayId, it.message)
}
return commits
}
return htmlBuild()рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рдП рдмрд┐рдирд╛, рдпрд╣ рдХреЛрдб рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ (MICROSERVICE_NAME) рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ рдмрд┐рдЯ рдмрдХреЗрдЯ (рддрд░реАрдХрд╛ getCommitsForMicroservice), рдЕрдкрдиреЗ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рджрд┐рдП рдЧрдП рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрдорд┐рдЯреНрд╕ рдХреА рдЖрдИрдбреА рдФрд░ рдХрдорд┐рдЯ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдХреЛрдб HTML рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдЬреЗрдирдХрд┐рдВрд╕ рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд┐рдЯрдмрдХреЗрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдорд╛рдиреЛрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЪрдпрди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕реБрдВрджрд░ рдкреЗрдЬ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ.
рдпрджрд┐ рдЖрдкрдиреЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдЯреЗрд╕реНрдЯ1 рдЪреБрдирд╛ рд╣реИ:

рдпрджрд┐ рдЖрдкрдиреЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдЯреЗрд╕реНрдЯ2 рдЪреБрдирд╛ рд╣реИ:

рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рдмрдЬрд╛рдп рд╣рд░ рдмрд╛рд░ рдпреВрдЖрд░рдПрд▓ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХрдорд┐рдЯ рдЖрдИрдбреА рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗред
рдкреБрдирд╢реНрдЪ рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЖрд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдерд╛ рдХрд┐ рдЙрдкрдХрд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред
рдкреАрдПрд╕рдПрд╕ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рдпрджрд┐ рдпрд╣ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЗрдирдХрд┐рдВрд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛.
рд╕реНрд░реЛрдд: www.habr.com
