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

рдЖрдордЪреНрдпрд╛ рдПрдХрд╛ рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рдЯреАрдордЪреНрдпрд╛ рдЯреАрдо рд▓реАрдбрдиреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдирд╡реАрди рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рддреЗрд╡реНрд╣рд╛ рд╣реЗ рд╕рд░реНрд╡ рд╕реБрд░реВ рдЭрд╛рд▓реЗ, рдЬреЗ рдЖрджрд▓реНрдпрд╛ рджрд┐рд╡рд╢реА рдХрдВрдЯреЗрдирд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рд╣реЛрддреЗ. рдореА рддреЗ рдкреЛрд╕реНрдЯ рдХреЗрд▓реЗ. рд╕реБрдорд╛рд░реЗ 20 рдорд┐рдирд┐рдЯрд╛рдВрдирдВрддрд░, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реА, рдХрд╛рд░рдг рддреЗрдереЗ рдПрдХ рдЕрддрд┐рд╢рдп рдЖрд╡рд╢реНрдпрдХ рдЧреЛрд╖реНрдЯ рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рд╣реЛрддреА. рдореА рдиреВрддрдиреАрдХрд░рдг рдХреЗрд▓реЗ. рдЖрдгрдЦреА рдХрд╛рд╣реА рддрд╛рд╕рд╛рдВрдирдВрддрд░... рдмрд░рдВ, рдкреБрдвреЗ рдХрд╛рдп рдЭрд╛рд▓рдВ рдпрд╛рдЪрд╛ рдЕрдВрджрд╛рдЬ рддреБрдореНрд╣реА рд▓рд╛рд╡реВ рд╢рдХрддрд╛...

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

рддрд░, рдпрд╛ рдиреЛрдЯрдордзреНрдпреЗ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧреЗрди рдХреА рдореА рдХрд╕реЗ рд╢рд┐рдХрд▓реЛ:

  1. рдЬреЗрдирдХрд┐рдиреНрд╕рдордзреАрд▓ рдиреЛрдХрд░реНтАНрдпрд╛ рд╕реНрд╡рддрдГрдЪ рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдиреЛрдХрд▒реНрдпрд╛рдВрдордзреВрди рдбрд╛рдпрдиреЕрдорд┐рдХрд░рд┐рддреНрдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рд╛;
  2. рдЬреЗрдирдХрд┐рдиреНрд╕ рдПрдЬрдВрдЯ рд╕реНрдерд╛рдкрд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдиреЛрдбрд╡рд░реВрди рдХреНрд▓рд╛рдЙрдб рдХрдиреНрд╕реЛрд▓ (рдХреНрд▓рд╛рдЙрдб рд╢реЗрд▓) рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рд╛;
  3. Google Kubernetes Engine рд╡рд░ рд╡рд░реНрдХрд▓реЛрдб рддреИрдирд╛рдд рдХрд░рд╛.


рдХрд┐рдВрдмрд╣реБрдирд╛, рдореА рдЕрд░реНрдерд╛рддрдЪ рдХрд╛рд╣реАрд╕рд╛ рдХрдкрдЯреА рдЖрд╣реЗ. рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдЬрд╛рддреЗ рдХреА рддреБрдордЪреНрдпрд╛рдХрдбреЗ Google рдХреНрд▓рд╛рдЙрдбрдордзреАрд▓ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪрд╛ рдХрдореАрдд рдХрдореА рдХрд╛рд╣реА рднрд╛рдЧ рдЖрд╣реЗ рдЖрдгрд┐ рдореНрд╣рдгреВрдирдЪ рддреБрдореНрд╣реА рддреНрдпрд╛рдЪреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЖрд╣рд╛рдд рдЖрдгрд┐ рдЕрд░реНрдерд╛рддрдЪ рддреБрдордЪреНрдпрд╛рдХрдбреЗ GCP рдЦрд╛рддреЗ рдЖрд╣реЗ. рдкрдг рд╣реА рдиреЛрдЯ рддреНрдпрд╛рдмрджреНрджрд▓ рдирд╛рд╣реА.

рд╣реЗ рдорд╛рдЭреЗ рдкреБрдвреАрд▓ рдлрд╕рд╡рдгреВрдХ рдкрддреНрд░рдХ рдЖрд╣реЗ. рдорд▓рд╛ рдлрдХреНрдд рдПрдХрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЕрд╢рд╛ рдиреЛрдЯреНрд╕ рд▓рд┐рд╣рд╛рдпрдЪреНрдпрд╛ рдЖрд╣реЗрдд: рдорд▓рд╛ рдПрдХрд╛ рд╕рдорд╕реНрдпреЗрдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрд▓рд╛, рдорд▓рд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рддреЗ рдХрд╕реЗ рд╕реЛрдбрд╡рд╛рдпрдЪреЗ рд╣реЗ рдорд╛рд╣рд┐рдд рдирд╡реНрд╣рддреЗ, рд╕рдорд╛рдзрд╛рди рддрдпрд╛рд░-рддрдпрд╛рд░ Google рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдореА рддреЗ рдХрд╛рд╣реА рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ Google рдХреЗрд▓реЗ рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рд▓реА. рдЖрдгрд┐ рдореНрд╣рдгреВрди рднрд╡рд┐рд╖реНрдпрд╛рдд, рдЬреЗрд╡реНрд╣рд╛ рдореА рд╣реЗ рдХрд╕реЗ рдХреЗрд▓реЗ рд╣реЗ рдореА рд╡рд┐рд╕рд░рддреЛ, рддреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рдкреБрдиреНрд╣рд╛ рддреБрдХрдбреНрдпрд╛-рддреБрдХрдбреНрдпрд╛рдиреЗ рдЧреБрдЧрд▓ рдХрд░реВрди рдПрдХрддреНрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА, рдореА рд╕реНрд╡рдд: рд▓рд╛ рдЕрд╢реА рдлрд╕рд╡рдгреВрдХ рдкрддреНрд░рдХреЗ рд▓рд┐рд╣рд┐рддреЛ.

рдЕрд╕реНрд╡реАрдХрд░рдг: 1. рднреВрдорд┐рдХреЗрд╕рд╛рдареА рдиреЛрдЯ "рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА" рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рд╣реЛрддреА рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рд░рд╛рд╡ рд▓рд╛рдЧреВ рд╣реЛрдд рдирд╛рд╣реА. рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреАрд▓ "рд╣реЗ рдЕрд╕реЗ рдХрд░рдгреЗ рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдЭрд╛рд▓реЗ рдЕрд╕рддреЗ" рд╣реЗ рдкрд░реНрдпрд╛рдп рд╡рд╛рдЪреВрди рдорд▓рд╛ рдЖрдирдВрдж рдЭрд╛рд▓рд╛.
2. рдЬрд░ рдиреЛрдЯреЗрдЪрд╛ рд▓рд╛рдЧреВ рдХреЗрд▓реЗрд▓рд╛ рднрд╛рдЧ рдореАрда рдорд╛рдирд▓рд╛ рдЧреЗрд▓рд╛ рддрд░, рдорд╛рдЭреНрдпрд╛ рдорд╛рдЧреАрд▓ рд╕рд░реНрд╡ рдиреЛрдЯреНрд╕рдкреНрд░рдорд╛рдгреЗ, рд╣реЗ рдПрдХ рдХрдордХреБрд╡рдд рдореАрда рд╕рдорд╛рдзрд╛рди рдЖрд╣реЗ.

рдЬреЗрдирдХрд┐рдиреНрд╕ рдордзреАрд▓ рдЬреЙрдм рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдбрд╛рдпрдиреЕрдорд┐рдХрд▓реА рдЕрдкрдбреЗрдЯ рдХрд░рдд рдЖрд╣реЗ

рдорд▓рд╛ рддреБрдордЪреНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдЪрд╛ рдЕрдВрджрд╛рдЬ рдЖрд╣реЗ: рдбрд╛рдпрдиреЕрдорд┐рдХ рдЬреЙрдм рдЕрдкрдбреЗрдЯрдЪрд╛ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдХрд╛рдп рд╕рдВрдмрдВрдз рдЖрд╣реЗ? рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреЕрд░рд╛рдореАрдЯрд░рдЪреЗ рдореВрд▓реНрдп рдореЕрдиреНрдпреБрдЕрд▓реА рдПрдВрдЯрд░ рдХрд░рд╛ рдЖрдгрд┐ рддреБрдореНрд╣реА рдЬрд╛!

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

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

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

рдЗрддрдХреЗ рдкрд░реНрдпрд╛рдп рдирд╛рд╣реАрдд. рджреЛрди рдЧреЛрд╖реНрдЯреА рд▓рдЧреЗрдЪ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реНрдпрд╛:

  • рдЬреЗрдирдХрд┐рдиреНрд╕ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рдСрдлрд░ рдХрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд░рд┐рдореЛрдЯ рдНрдХреНрд╕реЗрд╕ API рд╡рд╛рдкрд░рд╛;
  • рд░рд┐рдореЛрдЯ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдлреЛрд▓реНрдбрд░рдЪреНрдпрд╛ рд╕рд╛рдордЧреНрд░реАрдЪреА рд╡рд┐рдирдВрддреА рдХрд░рд╛ (рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рд╣реЗ рдЬреЗрдлреНрд░реЙрдЧ рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрд░реА рдЖрд╣реЗ, рдЬреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдирд╛рд╣реА).

рдЬреЗрдирдХрд┐рдиреНрд╕ рд░рд┐рдореЛрдЯ рдНрдХреНрд╕реЗрд╕ API

рдкреНрд░рд╕реНрдерд╛рдкрд┐рдд рдЙрддреНрдХреГрд╖реНрдЯ рдкрд░рдВрдкрд░реЗрдиреБрд╕рд╛рд░, рдореА рд▓рд╛рдВрдм рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЯрд╛рд│рдгреНрдпрд╛рд╕ рдкреНрд░рд╛рдзрд╛рдиреНрдп рджреЗрдИрди.
рдореА рдлрдХреНрдд рдкрд╣рд┐рд▓реНрдпрд╛ рдкрд░рд┐рдЪреНрдЫреЗрджрд╛рдЪреНрдпрд╛ рдПрдХрд╛ рддреБрдХрдбреНрдпрд╛рдЪреНрдпрд╛ рд╡рд┐рдирд╛рдореВрд▓реНрдп рднрд╛рд╖рд╛рдВрддрд░рд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрди API рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдЪреЗ рдкрд╣рд┐рд▓реЗ рдкреГрд╖реНрда:

рдЬреЗрдирдХрд┐рдиреНрд╕ рддреНрдпрд╛рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд╕рд╛рдареА рджреВрд░рд╕реНрде рдорд╢реАрди-рд╡рд╛рдЪрдиреАрдп рдкреНрд░рд╡реЗрд╢рд╛рд╕рд╛рдареА API рдкреНрд░рджрд╛рди рдХрд░рддреЗ. <тАж> рд░рд┐рдореЛрдЯ рдНрдХреНрд╕реЗрд╕ REST рд╕рд╛рд░рдЦреНрдпрд╛ рд╢реИрд▓реАрдордзреНрдпреЗ рджрд┐рд▓рд╛ рдЬрд╛рддреЛ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рд╕рд░реНрд╡ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрд╕рд╛рдареА рдПрдХрдЪ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреВ рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреНрдпрд╛рдРрд╡рдЬреА ".../api/", рдХреБрдареЗ"..." рдореНрд╣рдгрдЬреЗ рдЬреНрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрд╡рд░ API рдХреНрд╖рдорддрд╛ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд.

рджреБрд╕рд▒реНрдпрд╛ рд╢рдмреНрджрд╛рдВрдд, рдЖрдореНрд╣реА рд╕рдзреНрдпрд╛ рдЬреНрдпрд╛ рдЙрдкрдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд рддреЗ рдпреЗрдереЗ рдЙрдкрд▓рдмреНрдз рдЕрд╕рд▓реНрдпрд╛рд╕ http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, рдирдВрддрд░ рдпрд╛ рдХрд╛рд░реНрдпрд╛рд╕рд╛рдареА API рд╢рд┐рдЯреНрдЯреНрдпрд╛ рдпреЗрдереЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

рдкреБрдвреЗ, рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдгрддреНрдпрд╛ рдлреЙрд░реНрдордордзреНрдпреЗ рдорд┐рд│рд╡рд╛рдпрдЪреЗ рд╣реЗ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдирд┐рд╡рдб рдЖрд╣реЗ. рдЪрд▓рд╛ XML рд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдпрд╛, рдХрд╛рд░рдг API рдлрдХреНрдд рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ.

рдЪрд▓рд╛ рдлрдХреНрдд рд╕рд░реНрд╡ рдиреЛрдХрд▒реНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдорд┐рд│рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛. рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдЕрд╕реЗрдВрдмреНрд▓реАрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдд рд░рд╕ рдЖрд╣реЗ (рдбрд┐рд╕реНрдкреНрд▓реЗ рдирд╛рд╡) рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдкрд░рд┐рдгрд╛рдо (рдкрд░рд┐рдгрд╛рдо):

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]

рдЭрд╛рд▓реЗ?

рдЖрддрд╛ рдлрдХреНрдд рддреНрдпрд╛ рдзрд╛рд╡рд╛ рдлрд┐рд▓реНрдЯрд░ рдХрд░реВрдпрд╛ рдЬреНрдпрд╛рдЪрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЛ рдпрд╢. рдЪрд▓рд╛ рдпреБрдХреНрддрд┐рд╡рд╛рдж рд╡рд╛рдкрд░реВрдпрд╛ &рд╡рдЧрд│рд╛ рдЖрдгрд┐ рдПрдХ рдкреЕрд░рд╛рдореАрдЯрд░ рдореНрд╣рдгреВрди рдЖрдкрдг рддреНрдпрд╛рд╕ рд╕рдорд╛рди рдирд╕рд▓реЗрд▓реНрдпрд╛ рдореВрд▓реНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рдкрд╛рд╕ рдХрд░реВ рдпрд╢. рд╣реЛрдп рд╣реЛрдп. рджреБрд╣реЗрд░реА рдирдХрд╛рд░рд╛рддреНрдордХ рдПрдХ рд╡рд┐рдзрд╛рди рдЖрд╣реЗ. рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдирд╕рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рдЖрдореНрд╣реА рд╡рдЧрд│рддреЛ:

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!='SUCCESS']

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

рдмрд░рдВ, рдлрдХреНрдд рдЧрдВрдордд рдореНрд╣рдгреВрди, рдлрд┐рд▓реНрдЯрд░рдиреЗ рдЖрдкрд▓реА рдлрд╕рд╡рдгреВрдХ рдХреЗрд▓реА рдирд╛рд╣реА рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░реВрдпрд╛ (рдлрд┐рд▓реНрдЯрд░ рдХрдзреАрд╣реА рдЦреЛрдЯреЗ рдмреЛрд▓рдд рдирд╛рд╣реАрдд!) рдЖрдгрд┐ "рдЕрдпрд╢рд╕реНрд╡реА" рдЪреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдпрд╛:

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']

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

рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рдлреЛрд▓реНрдбрд░рдордзреАрд▓ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреА рд╕реВрдЪреА

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

рдПрдХ рдУрд│ рдЖрдЬреНрдЮрд╛
рдХреГрдкрдпрд╛ рджреЛрди рдЧреЛрд╖реНрдЯреА рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛: рдореА рд╣реЗрдбрд░рдордзреНрдпреЗ рдХрдиреЗрдХреНрд╢рди рддрдкрд╢реАрд▓ рдкрд╛рд╕ рдХрд░рддреЛ рдЖрдгрд┐ рдорд▓рд╛ рдлреЛрд▓реНрдбрд░рдордзреАрд▓ рд╕рд░реНрд╡ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА рдЖрдгрд┐ рдореА рдлрдХреНрдд рдПрдХрд╛ рдорд╣рд┐рдиреНрдпрд╛рдд рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛ рдирд┐рд╡рдбрддреЛ. рддреБрдордЪреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЖрдгрд┐ рдЧрд░рдЬрд╛ рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдорд╛рдВрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рд╛:

curl -H "X-JFrog-Art-Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

рдЬреЗрдирдХрд┐рдиреНрд╕рдордзреНрдпреЗ рдЬреЙрдм рдЖрдгрд┐ рдЬреЙрдм рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░рдгреЗ

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

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

рдЖрдгрд┐ рдЖрддрд╛ рдордЬреЗрджрд╛рд░ рднрд╛рдЧ. рдЬреЗрдирдХрд┐рдиреНрд╕ рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рдЬреЙрдм рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ. XML рд╕реНрд╡рд░реВрдкрд╛рдд. рд╡рд╛рдЯреЗрдд http://╨┐╤Г╤В╤М-╨┤╨╛-╨╖╨░╨┤╨░╨╜╨╕╤П/config.xml рддреНрдпрд╛рдиреБрд╕рд╛рд░, рддреБрдореНрд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рд╢рдХрддрд╛, рддреА рдЖрд╡рд╢реНрдпрдХрддреЗрдиреБрд╕рд╛рд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рддреА рдЬрд┐рдереЗ рдорд┐рд│рд╛рд▓реА рдЖрд╣реЗ рддрд┐рдереЗ рдкрд░рдд рдареЗрд╡реВ рд╢рдХрддрд╛.

рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛, рдЖрдореНрд╣реА рд╡рд░ рд╕рд╣рдордд рдЭрд╛рд▓реЛ рдЖрд╣реЛрдд рдХреА рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реВрдЪреАрд╕рд╛рдареА рдЖрдореНрд╣реА рдПрдХ рдкреЕрд░рд╛рдореАрдЯрд░ рддрдпрд╛рд░ рдХрд░реВ BUILD_VERSION?

рдЪрд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдИрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рдЖрдгрд┐ рддреНрдпрд╛рдордзреНрдпреЗ рдПрдХ рдирдЬрд░ рдЯрд╛рдХреВ. рдлрдХреНрдд рдкреЕрд░рд╛рдореАрдЯрд░ рдЬрд╛рдЧреЗрд╡рд░ рдЖрд╣реЗ рдЖрдгрд┐ рдЗрдЪреНрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

рд╕реНрдкреЙрдпрд▓рд░ рдЕрдВрддрд░реНрдЧрдд рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ.

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

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

рд╕реНрдкреЙрдпрд▓рд░ рдЕрдВрддрд░реНрдЧрдд, рдореА рдХреЛрдб рд╕рд╛рджрд░ рдХрд░рддреЛ рдЬреЛ рд╡рд░реАрд▓ рдХреНрд░рдо рд╕рдВрдкреВрд░реНрдгрдкрдгреЗ рдкреВрд░реНрдг рдХрд░рддреЛ.

рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рдлреЛрд▓реНрдбрд░рд╡рд░реВрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╡рд░ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рд▓рд┐рд╣рд╛

#!/bin/bash
############## ╨б╨║╨░╤З╨╕╨▓╨░╨╡╨╝ ╨║╨╛╨╜╤Д╨╕╨│
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## ╨г╨┤╨░╨╗╤П╨╡╨╝ ╨╕ ╨╖╨░╨╜╨╛╨▓╨╛ ╤Б╨╛╨╖╨┤╨░╨╡╨╝ xml-╤Н╨╗╨╡╨╝╨╡╨╜╤В ╨┤╨╗╤П ╤Б╨┐╨╕╤Б╨║╨░ ╨▓╨╡╤А╤Б╨╕╨╣
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## ╨з╨╕╤В╨░╨╡╨╝ ╨▓ ╨╝╨░╤Б╤Б╨╕╨▓ ╤Б╨┐╨╕╤Б╨╛╨║ ╨▓╨╡╤А╤Б╨╕╨╣ ╨╕╨╖ ╤А╨╡╨┐╨╛╨╖╨╕╤В╨╛╤А╨╕╤П
readarray -t vers < <( curl -H "X-JFrog-Art-Api:Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

############## ╨Я╨╕╤И╨╡╨╝ ╨╝╨░╤Б╤Б╨╕╨▓ ╤Н╨╗╨╡╨╝╨╡╨╜╤В ╨╖╨░ ╤Н╨╗╨╡╨╝╨╡╨╜╤В╨╛╨╝ ╨▓ ╨║╨╛╨╜╤Д╨╕╨│
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## ╨Ъ╨╗╨░╨┤╨╡╨╝ ╨║╨╛╨╜╤Д╨╕╨│ ╨▓╨╖╨░╨┤
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## ╨Я╤А╨╕╨▓╨╛╨┤╨╕╨╝ ╤А╨░╨▒╨╛╤З╨╡╨╡ ╨╝╨╡╤Б╤В╨╛ ╨▓ ╨┐╨╛╤А╤П╨┤╨╛╨║
rm -f appConfig.xml

рдЬрд░ рддреБрдореНрд╣реА рдЬреЗрдирдХрд┐рдиреНрд╕рдХрдбреВрди рдЖрд╡реГрддреНрддреНрдпрд╛ рдорд┐рд│рд╡рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рд▓рд╛ рдкреНрд░рд╛рдзрд╛рдиреНрдп рджреЗрдд рдЕрд╕рд╛рд▓ рдЖрдгрд┐ рддреБрдореНрд╣реА рдорд╛рдЭреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд│рд╢реА рдЕрд╕рд╛рд▓, рддрд░ рд╕реНрдкреЙрдпрд▓рд░рдЪреНрдпрд╛ рдЦрд╛рд▓реА рд╕рдорд╛рди рдХреЛрдб рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЬреЗрдирдХрд┐рдиреНрд╕рдЪреА рдпрд╛рджреА:

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

#!/bin/bash
############## ╨б╨║╨░╤З╨╕╨▓╨░╨╡╨╝ ╨║╨╛╨╜╤Д╨╕╨│
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## ╨г╨┤╨░╨╗╤П╨╡╨╝ ╨╕ ╨╖╨░╨╜╨╛╨▓╨╛ ╤Б╨╛╨╖╨┤╨░╨╡╨╝ xml-╤Н╨╗╨╡╨╝╨╡╨╜╤В ╨┤╨╗╤П ╤Б╨┐╨╕╤Б╨║╨░ ╨▓╨╡╤А╤Б╨╕╨╣
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## ╨Я╨╕╤И╨╡╨╝ ╨▓ ╤Д╨░╨╣╨╗ ╤Б╨┐╨╕╤Б╨╛╨║ ╨▓╨╡╤А╤Б╨╕╨╣ ╨╕╨╖ Jenkins
curl -g -X GET -u username:apiKey 'http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!=%22SUCCESS%22]&pretty=true' -o builds.xml

############## ╨з╨╕╤В╨░╨╡╨╝ ╨▓ ╨╝╨░╤Б╤Б╨╕╨▓ ╤Б╨┐╨╕╤Б╨╛╨║ ╨▓╨╡╤А╤Б╨╕╨╣ ╨╕╨╖ XML
readarray vers < <(xmlstarlet sel -t -v "freeStyleProject/allBuild/displayName" builds.xml | awk -F":" '{print $2}')

############## ╨Я╨╕╤И╨╡╨╝ ╨╝╨░╤Б╤Б╨╕╨▓ ╤Н╨╗╨╡╨╝╨╡╨╜╤В ╨╖╨░ ╤Н╨╗╨╡╨╝╨╡╨╜╤В╨╛╨╝ ╨▓ ╨║╨╛╨╜╤Д╨╕╨│
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## ╨Ъ╨╗╨░╨┤╨╡╨╝ ╨║╨╛╨╜╤Д╨╕╨│ ╨▓╨╖╨░╨┤
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## ╨Я╤А╨╕╨▓╨╛╨┤╨╕╨╝ ╤А╨░╨▒╨╛╤З╨╡╨╡ ╨╝╨╡╤Б╤В╨╛ ╨▓ ╨┐╨╛╤А╤П╨┤╨╛╨║
rm -f appConfig.xml

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

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

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

рдХреНрд▓рд╛рдЙрдб рд╢реЗрд▓рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рдд рдЖрд╣реЗ

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

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

рдХреНрд▓рд╛рдЙрдб рдХрдиреНрд╕реЛрд▓рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рджреЛрди рдЧреЛрд╖реНрдЯреАрдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ: gCloud рдЖрдгрд┐ рдкреНрд░рд╡реЗрд╢ рдЕрдзрд┐рдХрд╛рд░ Google Cloud API VM рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА рдЬреНрдпрд╛рд╕рд╣ рд╣реЗ рд╕рдорд╛рди рдХрдиреЗрдХреНрд╢рди рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.

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

рдпрд╛ рдиреЛрдЯрдЪреНрдпрд╛ рдЪреМрдХрдЯреАрдд рдорд▓рд╛ рд╣рд╛ рдореБрджреНрджрд╛ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдХрд╡реНрд╣рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рд▓рд┐рд╣рд╛. рдЖрдореНрд╣рд╛рд▓рд╛ рдкреБрд░реЗрд╢реА рдорддреЗ рдорд┐рд│рд╛рд▓реНрдпрд╛рд╕, рдореА рдпрд╛ рд╡рд┐рд╖рдпрд╛рд╡рд░ рдЕрдкрдбреЗрдЯ рд▓рд┐рд╣реАрди.

рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕.

  1. VM рдЙрджрд╛рд╣рд░рдг рдерд╛рдВрдмрд╡рд╛ рдЬреНрдпрд╛рдордзреВрди рддреБрдореНрд╣реА рдирдВрддрд░ рдХреНрд▓рд╛рдЙрдб рдХрдиреНрд╕реЛрд▓рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рд╛рд▓.
  2. рдЙрджрд╛рд╣рд░рдг рддрдкрд╢реАрд▓ рдЙрдШрдбрд╛ рдЖрдгрд┐ рдХреНрд▓рд┐рдХ рдХрд░рд╛ рдмрджрд▓рдгреЗ.
  3. рдкреГрд╖реНрдард╛рдЪреНрдпрд╛ рдЕрдЧрджреА рддрд│рд╛рд╢реА, рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╡реЗрд╢ рд╕реНрдХреЛрдк рдирд┐рд╡рдбрд╛ рд╕рд░реНрд╡ рдХреНрд▓рд╛рдЙрдб API рдордзреНрдпреЗ рдкреВрд░реНрдг рдкреНрд░рд╡реЗрд╢.

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

  4. рддреБрдордЪреЗ рдмрджрд▓ рдЬрддрди рдХрд░рд╛ рдЖрдгрд┐ рдЙрджрд╛рд╣рд░рдг рд▓рд╛рдБрдЪ рдХрд░рд╛.

VM рдиреЗ рд▓реЛрдбрд┐рдВрдЧ рдкреВрд░реНрдг рдХреЗрд▓реНрдпрд╛рд╡рд░, SSH рджреНрд╡рд╛рд░реЗ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рд╛ рдЖрдгрд┐ рдХрдиреЗрдХреНрд╢рди рддреНрд░реБрдЯреАрд╢рд┐рд╡рд╛рдп рд╣реЛрддреЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛. рдХрдорд╛рдВрдб рд╡рд╛рдкрд░рд╛:

gcloud alpha cloud-shell ssh

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

GKE рд╡рд░ рддреИрдирд╛рдд рдХрд░рд╛

рдЖрдореНрд╣реА IaC (рдХреЛрдб рдореНрд╣рдгреВрди рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛) рдордзреНрдпреЗ рдкреВрд░реНрдгрдкрдгреЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡реНрдп рдорд╛рд░реНрдЧрд╛рдиреЗ рдкреНрд░рдпрддреНрди рдХрд░рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЖрдордЪреНрдпрд╛ рдбреЙрдХрд░ рдлрд╛рдЗрд▓реНрд╕ Git рдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рд╣реЗ рдПрдХреАрдХрдбреЗ рдЖрд╣реЗ. рдЖрдгрд┐ kubernetes рдордзреНрдпреЗ рддреИрдирд╛рддреА yaml рдлрд╛рдИрд▓рджреНрд╡рд╛рд░реЗ рд╡рд░реНрдгрди рдХреЗрд▓реА рдЬрд╛рддреЗ, рдЬреА рдХреЗрд╡рд│ рдпрд╛ рдХрд╛рд░реНрдпрд╛рджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ, рдЬреА рд╕реНрд╡рддрдГ рджреЗрдЦреАрд▓ рдХреЛрдб рд╕рд╛рд░рдЦреА рдЖрд╣реЗ. рд╣реЗ рджреБрд╕рд▒реНрдпрд╛ рдмрд╛рдЬреВрдиреЗ рдЖрд╣реЗ. рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдорд▓рд╛ рдЕрд╕реЗ рдореНрд╣рдгрд╛рдпрдЪреЗ рдЖрд╣реЗ рдХреА рдпреЛрдЬрдирд╛ рдЕрд╢реА рдЖрд╣реЗ:

  1. рдЖрдкрдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреА рдореВрд▓реНрдпреЗ рдШреЗрддреЛ BUILD_VERSION рдЖрдгрд┐, рд╡реИрдХрд▓реНрдкрд┐рдХрд░рд┐рддреНрдпрд╛, рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреА рдореВрд▓реНрдпреЗ рдЬреА рдкрд╛рд░ рдХреЗрд▓реА рдЬрд╛рддреАрд▓ рдПрдирд╡реНрд╣реАрд╡реНрд╣реА.
  2. Git рд╡рд░реВрди рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛.
  3. рдЙрдкрдпреЛрдЬрдирд╛рд╕рд╛рдареА yaml рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рд╛.
  4. рдЖрдореНрд╣реА рдпрд╛ рджреЛрдиреНрд╣реА рдлрд╛рдЗрд▓реНрд╕ scp рджреНрд╡рд╛рд░реЗ рдХреНрд▓рд╛рдЙрдб рдХрдиреНрд╕реЛрд▓рд╡рд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЛ.
  5. рдЖрдореНрд╣реА рддреЗрдереЗ рдПрдХ рдХрдВрдЯреЗрдирд░ рддрдпрд╛рд░ рдХрд░рддреЛ рдЖрдгрд┐ рдХрдВрдЯреЗрдирд░ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рдврдХрд▓рддреЛ
  6. рдЖрдореНрд╣реА рдХреНрдпреВрдмрд░рд╡рд░ рд▓реЛрдб рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдлрд╛рдЗрд▓ рд▓рд╛рдЧреВ рдХрд░рддреЛ.

рдЪрд▓рд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдКрдпрд╛. рдПрдХрджрд╛ рдЖрдореНрд╣реА рдмреЛрд▓реВ рд▓рд╛рдЧрд▓реЛ рдПрдирд╡реНрд╣реАрд╡реНрд╣реА, рддрд░ рд╕рдордЬрд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рджреЛрди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреА рдореВрд▓реНрдпреЗ рдкрд╛рд╕ рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗрдд: PARAM1 ╨╕ PARAM2. рдЖрдореНрд╣реА рддреИрдирд╛рддреАрд╕рд╛рдареА рддреНрдпрд╛рдВрдЪреЗ рдХрд╛рд░реНрдп рдЬреЛрдбрддреЛ, рдЯрд╛рдЗрдк рдХрд░рд╛ - рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреЕрд░рд╛рдореАрдЯрд░.

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

рдЖрдкрдг рд╕рд╛рдзреНрдпрд╛ рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рдирд╕рд╣ yaml рддрдпрд╛рд░ рдХрд░реВ рдкреНрд░рддрд┐рдзреНрд╡рдиреА рджрд╛рдЦрд▓ рдХрд░рдгреНрдпрд╛рдЪрд╛. рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдЬрд╛рддреЗ рдХреА, рдЕрд░реНрдерд╛рддрдЪ, рддреБрдордЪреНрдпрд╛ рдбреЙрдХрд░рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдЖрд╣реЗ PARAM1 ╨╕ PARAM2рд▓реЛрдб рдирд╛рд╡ рдЕрд╕реЗрд▓ awesomeapp, рдЖрдгрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрд╡реГрддреНрддреАрдЪреНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд╕рд╣ рдПрдХрддреНрд░рд┐рдд рдХреЗрд▓реЗрд▓рд╛ рдХрдВрдЯреЗрдирд░ рдЖрд╣реЗ рдХрдВрдЯреЗрдирд░ рдиреЛрдВрджрдгреА рд╡рд╛рдЯреЗрдд gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONрдХреБрдареЗ $BUILD_VERSION рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреАрдордзреВрди рдиреБрдХрддреЗрдЪ рдирд┐рд╡рдбрд▓реЗ рд╣реЛрддреЗ.

рд╕рдВрдШ рд╕реВрдЪреА

touch deploy.yaml
echo "apiVersion: apps/v1" >> deploy.yaml
echo "kind: Deployment" >> deploy.yaml
echo "metadata:" >> deploy.yaml
echo "  name: awesomeapp" >> deploy.yaml
echo "spec:" >> deploy.yaml
echo "  replicas: 1" >> deploy.yaml
echo "  selector:" >> deploy.yaml
echo "    matchLabels:" >> deploy.yaml
echo "      run: awesomeapp" >> deploy.yaml
echo "  template:" >> deploy.yaml
echo "    metadata:" >> deploy.yaml
echo "      labels:" >> deploy.yaml
echo "        run: awesomeapp" >> deploy.yaml
echo "    spec:" >> deploy.yaml
echo "      containers:" >> deploy.yaml
echo "      - name: awesomeapp" >> deploy.yaml
echo "        image: gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION:latest" >> deploy.yaml
echo "        env:" >> deploy.yaml
echo "        - name: PARAM1" >> deploy.yaml
echo "          value: $PARAM1" >> deploy.yaml
echo "        - name: PARAM2" >> deploy.yaml
echo "          value: $PARAM2" >> deploy.yaml

рд╡рд╛рдкрд░реВрди рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдЬреЗрдирдХрд┐рдиреНрд╕ рдПрдЬрдВрдЯ gcloud рдЕрд▓реНрдлрд╛ рдХреНрд▓рд╛рдЙрдб-рд╢реЗрд▓ ssh рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджреА рдореЛрдб рдЙрдкрд▓рдмреНрдз рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдкреЕрд░рд╛рдореАрдЯрд░ рд╡рд╛рдкрд░реВрди рдХреНрд▓рд╛рдЙрдб рдХрдиреНрд╕реЛрд▓рд▓рд╛ рдХрдорд╛рдВрдб рдкрд╛рдард╡рддреЛ --рдЖрджреЗрд╢.

рдЖрдореНрд╣реА рдЬреБрдиреНрдпрд╛ рдбреЙрдХрд░рдлрд╛рдЗрд▓рдордзреВрди рдХреНрд▓рд╛рдЙрдб рдХрдиреНрд╕реЛрд▓рдордзреАрд▓ рд╣реЛрдо рдлреЛрд▓реНрдбрд░ рд╕рд╛рдл рдХрд░рддреЛ:

gcloud alpha cloud-shell ssh --command="rm -f Dockerfile"

scp рд╡рд╛рдкрд░реВрди рдХреНрд▓рд╛рдЙрдб рдХрдиреНрд╕реЛрд▓рдЪреНрдпрд╛ рд╣реЛрдо рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рдирд╡реАрди рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗрд▓реА рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдареЗрд╡рд╛:

gcloud alpha cloud-shell scp localhost:./Dockerfile cloudshell:~

рдЖрдореНрд╣реА рдХрдВрдЯреЗрдирд░ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рдХрдВрдЯреЗрдирд░ рдЧреЛрд│рд╛ рдХрд░рддреЛ, рдЯреЕрдЧ рдХрд░рддреЛ рдЖрдгрд┐ рдкреБрд╢ рдХрд░рддреЛ:

gcloud alpha cloud-shell ssh --command="docker build -t awesomeapp-$BUILD_VERSION ./ --build-arg BUILD_VERSION=$BUILD_VERSION --no-cache"
gcloud alpha cloud-shell ssh --command="docker tag awesomeapp-$BUILD_VERSION gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"
gcloud alpha cloud-shell ssh --command="docker push gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"

рдЖрдореНрд╣реА рдЙрдкрдпреЛрдЬрди рдлрд╛рдЗрд▓рд╕рд╣ рдЕрд╕реЗрдЪ рдХрд░рддреЛ. рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдЦрд╛рд▓реА рджрд┐рд▓реЗрд▓реНрдпрд╛ рдХрдорд╛рдВрдб рдХреНрд▓рд╕реНрдЯрд░рдЪреА рдХрд╛рд▓реНрдкрдирд┐рдХ рдирд╛рд╡реЗ рд╡рд╛рдкрд░рддрд╛рдд рдЬрд┐рдереЗ рддреИрдирд╛рддреА рдпреЗрддреЗ (awsm-рдХреНрд▓рд╕реНрдЯрд░) рдЖрдгрд┐ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рдирд╛рд╡ (рдЫрд╛рди рдкреНрд░рдХрд▓реНрдк), рдЬреЗрдереЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд┐рдд рдЖрд╣реЗ.

gcloud alpha cloud-shell ssh --command="rm -f deploy.yaml"
gcloud alpha cloud-shell scp localhost:./deploy.yaml cloudshell:~
gcloud alpha cloud-shell ssh --command="gcloud container clusters get-credentials awsm-cluster --zone us-central1-c --project awesome-project && 
kubectl apply -f deploy.yaml"

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

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

рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░ рдЬрдорд▓реЗрд▓реНрдпрд╛ рдХрдВрдЯреЗрдирд░рдЪреА рдпрд╢рд╕реНрд╡реА рддреИрдирд╛рддреА

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

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

рддреНрдпрд╛рдРрд╡рдЬреА рдирд┐рд╖реНрдХрд░реНрд╖

рд╡рд░реАрд▓ рд╕рд░реНрд╡ рдкрд╛рдпрд▒реНрдпрд╛ рдХрджрд╛рдЪрд┐рдд рдкреВрд░реНрдг рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрд▓реНрдпрд╛ рдирд╕рддреНрдпрд╛, рдкрд░рдВрддреБ рдЬреЗрдирдХрд┐рдиреНрд╕рд╕рд╛рдареА рдХрд╛рд╣реА рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗрдд, рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдореНрдпреБрд▓рд┐рдУрди. рдкрдг рдХрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕реНрддрд╡ рдорд▓рд╛ рдкреНрд▓рдЧрдЗрди рдЖрд╡рдбрдд рдирд╛рд╣реАрдд. рдмрд░рдВ, рдЕрдзрд┐рдХ рддрдВрддреЛрддрдВрдд, рдореА рдХреЗрд╡рд│ рд╣рддрд╛рд╢рддреЗрдиреЗ рддреНрдпрд╛рдВрдЪрд╛ рд╕рд╣рд╛рд░рд╛ рдШреЗрддреЛ.

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

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

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