рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

рд╢реБрдн рджрд┐рди, Habr!

рдЖрдЬ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд▓реНрдк рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдВ рдЬреЗрдирдХреАрдВрд╕ рд╕рдмрд╕реЗ рдПрдХреАрдХреГрдд рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ред

рдкрд░рд┐рдЪрдп

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

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

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЗрдирдХреАрдВрд╕.


рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

рдХрд╛рд░реНрдп

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

рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:

  1. рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдпреВрдЖрд░рдПрд▓ рдЬрд┐рд╕реЗ рд╣рдо рдХрд╛рд░реНрдп рдЪрд▓рд╛рддреЗ рд╕рдордп рдмрдирд╛рдирд╛ рдФрд░ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  2. рдЙрд╕ рдХрдорд┐рдЯ рдХреА рдЖрдИрдбреА рдЬрд┐рд╕рд╕реЗ рдирд┐рд░реНрдорд╛рдг рд╣реЛрдЧрд╛ред

рдЬреИрд╕рд╛ рд╣реИ

рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛ рд╣реИред

рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

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

рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

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

рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рднрд░реЗ рдЬрд╛рдПрдВрдЧреЗ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рддрдирд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ (рдЯреЗрд╕реНрдЯ1 рдпрд╛ рдЯреЗрд╕реНрдЯ2), рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдХрдорд┐рдЯ рдХреА рдЕрдкрдиреА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред

рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╕рдВрджрд░реНрдн рдкреИрд░рд╛рдореАрдЯрд░ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реАрд▓реНрдб рд╣реИрдВ:

  1. рдирд╛рдо - рдорд╛рдкрджрдгреНрдб рдирд╛рдоред
  2. рд▓рд┐рдкрд┐ - рдХреЛрдб рдЬреЛ рд╣рд░ рдмрд╛рд░ рд╕рдВрджрд░реНрднрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝реАрд▓реНрдб рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рдмрджрд▓рдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рд╣рдо рдЯреЗрд╕реНрдЯ 1 рдФрд░ рдЯреЗрд╕реНрдЯ 2 рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ)ред
  3. Description - рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг.
  4. рдкрд╕рдВрдж рдХрд╛ рдкреНрд░рдХрд╛рд░ - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо HTML рдХреЛрдб рд▓реМрдЯрд╛рдПрдВрдЧреЗ)ред
  5. рд╕рдВрджрд░реНрднрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ - рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо, рдЬрдм рдЗрд╕рдХрд╛ рдорд╛рди рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

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

рдЪрдпрдирд┐рдд рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕рднреА рдХрдорд┐рдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░реВрд╡реА рдХреЛрдб:

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) рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдФрд░ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрдорд┐рдЯ рдХреА рдЖрдИрдбреА рдФрд░ рдХрдорд┐рдЯ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдХреЛрдб рдХреЛ HTML рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдЬреЗрдирдХреАрдВрд╕ рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд┐рдЯрдмрдХреЗрдЯ рд╕реЗ рд╕рднреА рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪрдпрди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрддрдирд╛ рд╕реБрдВрджрд░ рдкреГрд╖реНрда рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ.

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

рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

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

рдЬреЗрдирдХреАрдВрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛, рдпрд╛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

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

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ