рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдЙрдкрдпреЛрдЬрди рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕

рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдЙрдкрдпреЛрдЬрди рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕

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

рддреБрдореНрд╣рд╛рд▓рд╛ рд▓реЗрдЦрд╛рддреАрд▓ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЗ рд╕рдордЬреВрди рдШреНрдпрд╛рдпрдЪреА рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рддреА рдпреЗрдереЗ рд╢реЛрдзреВ рд╢рдХрддрд╛ GitHub.

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

рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдЙрдкрдпреЛрдЬрди

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

рд╣реЗ рдХрд╕реЗ рд╕рд╛рдзреНрдп рдХрд░рд╛рдпрдЪреЗ? рдЕрдиреЗрдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд, рддреНрдпрд╛рдкреИрдХреА рдПрдХ рдпреЗрдереЗ рдЖрд╣реЗ:

  • рддреБрдордЪреНрдпрд╛ рд╕реЗрд╡реЗрдЪреА рдЖрд╡реГрддреНрддреА рдХреНрд░рдорд╛рдВрдХ 1 рддреИрдирд╛рдд рдХрд░рд╛
  • рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдерд▓рд╛рдВрддрд░ рдХрд░рд╛
  • рдЖрд╡реГрддреНрддреА #2 рдЪреНрдпрд╛ рд╕рдорд╛рдВрддрд░ рдЖрдкрд▓реНрдпрд╛ рд╕реЗрд╡реЗрдЪреА рдЖрд╡реГрддреНрддреА #1 рддреИрдирд╛рдд рдХрд░рд╛
  • рддреА рдЖрд╡реГрддреНрддреА рдХреНрд░рдорд╛рдВрдХ 2 рдЬрд╢реА рдкрд╛рд╣рд┐рдЬреЗ рддрд╢реА рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реЗ рдкрд╛рд╣рддрд╛рдЪ, рдЖрд╡реГрддреНрддреА рдХреНрд░рдорд╛рдВрдХ 1 рдХрд╛рдвреВрди рдЯрд╛рдХрд╛
  • рддрдпрд╛рд░ рдЖрд╣реЗ

рд╕реЛрдкреЗ, рдирд╛рд╣реА рдХрд╛? рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рд╣реЗ рдЗрддрдХреЗ рд╕реЛрдкреЗ рдирд╛рд╣реА рдЖрдгрд┐ рдЖрдореНрд╣реА рддреЗ рдирдВрддрд░ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд╛рд╣реВ. рдЖрддрд╛ рдЖрдгрдЦреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЬрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдкрд╛рд╕реВ - рдирд┐рд│рд╛ рд╣рд┐рд░рд╡рд╛ рдЙрдкрдпреЛрдЬрди.

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

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

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

рд╡рд░реАрд▓ рд╕рд░реНрд╡ рд╡рд╛рдЪрд▓реНрдпрд╛рдирдВрддрд░, рддреБрдореНрд╣реА рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░реВ рд╢рдХрддрд╛: рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдордЪрд╛ рдмреНрд▓реВ рдЧреНрд░реАрди рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯрд╢реА рдХрд╛рдп рд╕рдВрдмрдВрдз рдЖрд╣реЗ?

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

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

рдЖрдгрд┐ рдпреЗрдереЗ рдЖрдореНрд╣реА рдпрд╛ рд▓реЗрдЦрд╛рддреАрд▓ рдореБрдЦреНрдп рд╕рдорд╕реНрдпреЗрдХрдбреЗ рдЖрд▓реЛ рдЖрд╣реЛрдд. рдбреЗрдЯрд╛рдмреЗрд╕. рдпрд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢рд╛рдХрдбреЗ рдЖрдгрдЦреА рдПрдХ рдирдЬрд░ рдЯрд╛рдХреВрдпрд╛.

рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдерд▓рд╛рдВрддрд░ рдХрд░рд╛.

рдЖрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рддрдГрд▓рд╛ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓ - рдЬрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрджрд▓ рдмреЕрдХрд╡рд░реНрдб рд╕реБрд╕рдВрдЧрдд рдирд╕реЗрд▓ рддрд░? рдЕреЕрдкрдЪреА рдорд╛рдЭреА рдкрд╣рд┐рд▓реА рдЖрд╡реГрддреНрддреА рдЦрдВрдбрд┐рдд рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА? рдЦрд░реЗ рддрд░ рд╣реЗрдЪ рдШрдбрдгрд╛рд░ рдЖрд╣реЗ...

рддреНрдпрд╛рдореБрд│реЗ, рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо / рдмреНрд▓реВ рдЧреНрд░реАрди рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯрдЪреЗ рдкреНрд░рдЪрдВрдб рдлрд╛рдпрджреЗ рдЕрд╕реВрдирд╣реА, рдХрдВрдкрдиреНрдпрд╛ рддреНрдпрд╛рдВрдЪреЗ рдЕрд░реНрдЬ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рдкрд╛рд▓рди рдХрд░рддрд╛рдд:

  • рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреНрдпрд╛ рдирд╡реАрди рдЖрд╡реГрддреНрддреАрд╕рд╣ рдкреЕрдХреЗрдЬ рддрдпрд╛рд░ рдХрд░рд╛
  • рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдВрдж рдХрд░рд╛
  • рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдерд▓рд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рд╛
  • рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рд╛ рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдирд╡реАрди рдЖрд╡реГрддреНрддреА рд▓рд╛рдБрдЪ рдХрд░рд╛

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

рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдорд╕реНрдпрд╛

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

рдЖрд╡реГрддреНрддреА рдпреЛрдЬрдирд╛

рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдкрдг рд╡рд╛рдкрд░рдгрд╛рд░ рдЖрд╣реЛрдд рдлреНрд▓рд╛рдпрд╡реЗ рдЖрд╡реГрддреНрддреА рдирд┐рдпрдВрддреНрд░рдг рд╕рд╛рдзрди рдореНрд╣рдгреВрди (рдЕрдВрджрд╛рдЬреЗ рднрд╛рд╖рд╛рдВрддрд░: рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдерд▓рд╛рдВрддрд░рд╛рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд). рд╕рд╛рд╣рдЬрд┐рдХрдЪ, рдЖрдореНрд╣реА рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рджреЗрдЦреАрд▓ рд▓рд┐рд╣реВ рдЬреНрдпрд╛рдордзреНрдпреЗ рдлреНрд▓рд╛рдпрд╡реЗ рд╕рдкреЛрд░реНрдЯ рдЖрд╣реЗ рдЖрдгрд┐ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░рддрд╛рдирд╛ рд╕реНрдХреАрдорд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд░реЗрд▓. рдлреНрд▓рд╛рдпрд╡реЗ рд╡рд╛рдкрд░рддрд╛рдирд╛, рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рд╕реНрдерд▓рд╛рдВрддрд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдЪрдпрд┐рдд рдХрд░реВ рд╢рдХрддрд╛ (рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ classpath:db/migration). рдпреЗрдереЗ рддреБрдореНрд╣реА рдЕрд╢рд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ рд╢рдХрддрд╛

тФФтФАтФА db
 тФФтФАтФА migration
     тФЬтФАтФА V1__init.sql
     тФЬтФАтФА V2__Add_surname.sql
     тФЬтФАтФА V3__Final_migration.sql
     тФФтФАтФА V4__Remove_lastname.sql

рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд рдЖрдкрдг 4 рдорд╛рдпрдЧреНрд░реЗрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рд╣рддреЛ рдЬреНрдпрд╛, рдЬрд░ рдкреВрд░реНрд╡реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реНрдпрд╛ рдирд╕рддреАрд▓ рддрд░, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реВ рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдПрдХрд╛рдорд╛рдЧреВрди рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддреАрд▓. рдЪрд▓рд╛ рдлрд╛рдИрд▓реНрд╕рдкреИрдХреА рдПрдХ рдкрд╛рд╣реВрдпрд╛ (V1__init.sql) рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

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

рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯрд╕рд╣ рд╕реНрддреНрд░реЛрдд рдирд┐рдпрдВрддреНрд░рдг рд╕рд╛рдзрди рд╡рд╛рдкрд░реВрди, рддреБрдореНрд╣рд╛рд▓рд╛ 2 рдореЛрдареЗ рдлрд╛рдпрджреЗ рдорд┐рд│рддреАрд▓:

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

рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд╡рд╛рд░рдг

рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рдкреБрдвреАрд▓ рднрд╛рдЧрд╛рдд, рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдмрджрд▓рд╛рдВрдЪреНрдпрд╛ рджреЛрди рдкрджреНрдзрддреАрдВрд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВ.

  • рдорд╛рдЧрд╛рд╕рд▓реЗрд▓реА рд╡рд┐рд╕рдВрдЧрддрддрд╛
  • рдорд╛рдЧрд╛рд╕ рд╕рд╣рддреНрд╡рддрд╛

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

рдЖрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рдЬреНрдпрд╛рд╡рд░ рдЖрдореНрд╣реА рдХрд╛рдо рдХрд░рдгрд╛рд░ рдЖрд╣реЛрдд рддреЗ рдПрдХ рд╕рд╛рдзреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдлреНрд▓рд╛рдпрд╡реЗ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрд╕реЗрд▓ Person ╤Б first_name ╨╕ last_name рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ (рдЕрдВрджрд╛рдЬреЗ рдЕрдиреБрд╡рд╛рдж: Person рдПрдХ рдЯреЗрдмрд▓ рдЖрд╣реЗ рдЖрдгрд┐ first_name ╨╕ last_name - рд╣реА рддреНрдпрд╛рддреАрд▓ рдлреАрд▓реНрдб рдЖрд╣реЗрдд). рдЖрдореНрд╣рд╛рд▓рд╛ рдирд╛рд╡ рдмрджрд▓рд╛рдпрдЪреЗ рдЖрд╣реЗ last_name ╨▓ surname.

рдЧреГрд╣реАрддрдХреЗ

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

рдЪрд┐рдареНрдареА. рд╡реНрдпрд╡рд╕рд╛рдп рдкреНрд░реЛ-рдЯрд┐рдк. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд▓рдн рдХреЗрд▓реНрдпрд╛рдиреЗ рддреБрдордЪрд╛ рд╕рдкреЛрд░реНрдЯрд╡рд░ рдЦреВрдк рдкреИрд╕рд╛ рд╡рд╛рдЪреВ рд╢рдХрддреЛ (рддреБрдордЪреНрдпрд╛ рдХрдВрдкрдиреАрд╕рд╛рдареА рддреБрдореНрд╣реА рдЬрд┐рддрдХреЗ рдЬрд╛рд╕реНрдд рд▓реЛрдХ рдХрд╛рдо рдХрд░рддрд╛ рддрд┐рддрдХреЗ рдЬрд╛рд╕реНрдд рдкреИрд╕реЗ рддреБрдореНрд╣реА рд╡рд╛рдЪрд╡реВ рд╢рдХрддрд╛)!

рдбреЗрдЯрд╛рдмреЗрд╕ рд░реЛрд▓рдмреЕрдХ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА

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

рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреА рдПрдХ рдЖрд╡реГрддреНрддреА рдкрд░рдд рдЖрдгрдгреЗ рдиреЗрд╣рдореАрдЪ рд╢рдХреНрдп рдЕрд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ (рдЖрдгрдЦреА рдирд╛рд╣реА)

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

рдЪрд┐рдареНрдареА. рдЕрдзрд┐рдХ рд╡рд╛рдЪрдиреАрдпрддреЗрд╕рд╛рдареА, рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдореНрд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдореБрдЦреНрдп рдЖрд╡реГрддреНрддреА рдмрджрд▓реВ.

рдкрд╛рдпрд░реА 1: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддреА

рдЕтАНреЕрдк рдЖрд╡реГрддреНрддреА: 1.0.0
DB рдЖрд╡реГрддреНрддреА: v1

рдПрдХ рдЯрд┐рдкреНрдкрдгреА

рд╣реА рдЕрд░реНрдЬрд╛рдЪреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддреА рдЕрд╕реЗрд▓.

рдбреЗрдЯрд╛рдмреЗрд╕ рдмрджрд▓рддреЛ

DB рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

рдХреЛрдб рдмрджрд▓рддреЛ

рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рд╡реНрдпрдХреНрддреАрдЪрд╛ рдбреЗрдЯрд╛ рдпрд╛рдордзреНрдпреЗ рд╕рд╛рдард╡рддреЛ last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

рдорд╛рдЧреЗ рд╡рд┐рд╕рдВрдЧрдд рд╕реНрддрдВрдн рдкреБрдирд░реНрдирд╛рдорд┐рдд рдХрд░рдгреЗ

рд╕реНрддрдВрднрд╛рдЪреЗ рдирд╛рд╡ рдХрд╕реЗ рдмрджрд▓рд╛рдпрдЪреЗ рдпрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ:

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

рдЕтАНреЕрдк рдЖрд╡реГрддреНрддреА: 2.0.0.BAD

DB рдЖрд╡реГрддреНрддреА: v2bad

рдПрдХ рдЯрд┐рдкреНрдкрдгреА

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

A/B рдЪрд╛рдЪрдгреА

рд╕рдзреНрдпрд╛рдЪреА рдкрд░рд┐рд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рд╡реНрд╣рд░реНрдЬрди рдЖрд╣реЗ 1.0.0, рдЙрддреНрдкрд╛рджрди рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдордзреНрдпреЗ рддреИрдирд╛рдд v1. рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪрд╛ рджреБрд╕рд░рд╛ рдкреНрд░рд╕рдВрдЧ, рдЖрд╡реГрддреНрддреА рддреИрдирд╛рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ 2.0.0.BAD, рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рд╛ v2bad.

рдкрд╛рдпрд▒реНрдпрд╛:

  1. рдЖрд╡реГрддреНрддреА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪрд╛ рдПрдХ рдирд╡реАрди рдкреНрд░рд╕рдВрдЧ рддреИрдирд╛рдд рдХреЗрд▓рд╛ рдЖрд╣реЗ 2.0.0.BADрдЬреЗ рдбреЗрдЯрд╛рдмреЗрд╕рд▓рд╛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ v2bad
  2. рдбреЗрдЯрд╛рдмреЗрд╕ рдордзреНрдпреЗ v2bad рд╕реНрддрдВрдн last_name рдпрд╛рдкреБрдвреЗ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╛рд╣реА - рддреЗ рдордзреНрдпреЗ рдмрджрд▓рд▓реЗ рд╣реЛрддреЗ surname
  3. рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдгрд┐ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реЗ рдЖрдгрд┐ рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рдЪрд╛рд▓реВ рдЖрд╣реЗрдд 1.0.0, рдЗрддрд░ - рдордзреНрдпреЗ 2.0.0.BAD. рд╕рд░реНрд╡ рдХрд╛рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕рд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЖрд╣реЗ v2bad
  4. рдЖрд╡реГрддреНрддреАрдЪреА рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгреЗ 1.0.0 рдПрд░рд░ рдлреЗрдХрдгреЗ рд╕реБрд░реВ рдХрд░реЗрд▓ рдХрд╛рд░рдг рддреЗ рдХреЙрд▓рдордордзреНрдпреЗ рдбреЗрдЯрд╛ рдШрд╛рд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреАрд▓ last_nameрдЬреЛ рдпрд╛рдкреБрдвреЗ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╛рд╣реА
  5. рдЖрд╡реГрддреНрддреАрдЪреА рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгреЗ 2.0.0.BAD рд╕рдорд╕реНрдпрд╛рдВрд╢рд┐рд╡рд╛рдп рдХрд╛рд░реНрдп рдХрд░реЗрд▓

рддреБрдореНрд╣реА рдмрдШреВ рд╢рдХрддрд╛, рдЬрд░ рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдгрд┐ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рдорд╛рдЧреЗ рд╡рд┐рд╕рдВрдЧрдд рдмрджрд▓ рдХреЗрд▓реЗ, рддрд░ A/B рдЪрд╛рдЪрдгреА рдЕрд╢рдХреНрдп рдЖрд╣реЗ.

рдЕрд░реНрдЬ рд░реЛрд▓рдмреЕрдХ

рд╕рдордЬреВ рдХреА A/B рдЙрдкрдпреЛрдЬрди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ (рдЕрдВрджрд╛рдЬреЗ рдкреНрд░рддрд┐.: рд▓реЗрдЦрдХрд╛рдЪрд╛ рдЕрд░реНрде рдХрджрд╛рдЪрд┐рдд рдпреЗрдереЗ A/B рдЪрд╛рдЪрдгреА рдЕрд╕рд╛рд╡рд╛) рдЖрдореНтАНрд╣реА рдард░рд╡рд▓реЗ рдХреА рдЖрдореНтАНрд╣рд╛рд▓рд╛ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ рдЖрд╡реГрддреНрддреАрд╡рд░ рдкрд░рдд рдЖрдгрд╛рдпрдЪреЗ рдЖрд╣реЗ 1.0.0. рд╕рдордЬрд╛ рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рд░реЛрд▓рдмреЕрдХ рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реА.

рдкрд╛рдпрд▒реНрдпрд╛:

  1. рдЖрдореНрд╣реА рдЖрд╡реГрддреНрддреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рдерд╛рдВрдмрд╡рддреЛ 2.0.0.BAD
  2. рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрдЬреВрдирд╣реА рдЖрд╣реЗ v2bad
  3. рдЖрд╡реГрддреНрддреА рдкрд╛рд╕реВрди 1.0.0 рддреЗ рдХрд╛рдп рдЖрд╣реЗ рддреЗ рд╕рдордЬрдд рдирд╛рд╣реА surname, рдЖрдореНрд╣реА рддреНрд░реБрдЯреА рдкрд╛рд╣реВ
  4. рдирд░рдХ рддреБрдЯрд▓рд╛ рдЖрд╣реЗ, рдЖрдореНрд╣реА рдЖрддрд╛ рдкрд░рдд рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА

рддреБрдореНрд╣реА рдмрдШреВ рд╢рдХрддрд╛, рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдгрд┐ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рдорд╛рдЧреЗ рд╡рд┐рд╕рдВрдЧрдд рдмрджрд▓ рдХреЗрд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдорд╛рдЧреАрд▓ рдЖрд╡реГрддреНрддреАрд╡рд░ рдкрд░рдд рдпреЗрдК рд╢рдХрдд рдирд╛рд╣реА.

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд▓реЙрдЧ

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

рдбреЗрдЯрд╛рдмреЗрд╕ рдмрджрд▓рддреЛ

рдирд╛рд╡ рдмрджрд▓рдгрд╛рд░реА рд╕реНрдерд▓рд╛рдВрддрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ last_name ╨▓ surname

рд╕реНрд░реЛрдд рдлреНрд▓рд╛рдпрд╡реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

рдирд╛рд╡ рдмрджрд▓рдгрд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

рдХреЛрдб рдмрджрд▓рддреЛ

рдЖрдореНрд╣реА рдХреНрд╖реЗрддреНрд░рд╛рдЪреЗ рдирд╛рд╡ рдмрджрд▓рд▓реЗ рдЖрд╣реЗ lastName рд╡рд░ surname.

рдмреЕрдХрд╡рд░реНрдб-рд╕реБрд╕рдВрдЧрдд рдкрджреНрдзрддреАрдиреЗ рд╕реНрддрдВрднрд╛рдЪреЗ рдирд╛рд╡ рдмрджрд▓рдгреЗ

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

рдЪрд┐рдареНрдареА. рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╡реГрддреНрддреА рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрд╣реЗ рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ v1. рддреНрдпрд╛рдд рд╕реНрддрдВрдн рдЖрд╣реЗрдд first_name ╨╕ last_name. рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдмрджрд▓рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ last_name рд╡рд░ surname. рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЕреЕрдк рдЖрд╡реГрддреНрддреА рджреЗрдЦреАрд▓ рдЖрд╣реЗ 1.0.0, рдЬреЗ рдЕрджреНрдпрд╛рдк рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдирд╛рд╣реА surname.

рдкрд╛рдпрд░реА 2: рдЖрдбрдирд╛рд╡ рдЬреЛрдбрд╛

рдЕтАНреЕрдк рдЖрд╡реГрддреНрддреА: 2.0.0
DB рдЖрд╡реГрддреНрддреА: v2

рдПрдХ рдЯрд┐рдкреНрдкрдгреА

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

рдЖрдореНрд╣реА рдПрдХ рдирд╡реАрди рдЖрд╡реГрддреНрддреА рдЖрдгрдд рдЖрд╣реЛрдд

рдкрд╛рдпрд▒реНрдпрд╛:

  1. рдирд╡реАрди рд╕реНрддрдВрдн рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдерд▓рд╛рдВрддрд░ рдХрд░рд╛ surname. рдЖрддрд╛ рддреБрдордЪреА рдбреАрдмреА рдЖрд╡реГрддреНрддреА v2
  2. рдкрд╛рд╕реВрди рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рд╛ last_name ╨▓ surname. рд▓рдХреНрд╖ рджреНрдпрд╛рдХреА рддреБрдордЪреНрдпрд╛рдХрдбреЗ рднрд░рдкреВрд░ рдбреЗрдЯрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рдмреЕрдЪ рд╕реНрдерд▓рд╛рдВрддрд░рд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛рд╡рд╛!
  3. рддреЗ рдЬрд┐рдереЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддрд╛рдд рддреЗ рдХреЛрдб рд▓рд┐рд╣рд╛ рджреЛрдиреНрд╣реА ╨╕ рдирд╡реАрдирдЖрдгрд┐ рдЬреБрдиреНрдпрд╛ рд╕реНрддрдВрдн рдЖрддрд╛ рддреБрдордЪреА рдЕреЕрдк рдЖрд╡реГрддреНрддреА 2.0.0
  4. рд╕реНрддрдВрднрд╛рддреАрд▓ рдореВрд▓реНрдп рд╡рд╛рдЪрд╛ surname, рддреЗ рдирд╕рд▓реНрдпрд╛рд╕ null, рдХрд┐рдВрд╡рд╛ l рдкрд╛рд╕реВрдиast_name, рддрд░ рдП surname рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рд╣реА. рддреБрдореНрд╣реА рд╣рдЯрд╡реВ рд╢рдХрддрд╛ getLastName() рдХреЛрдбрдордзреВрди, рдХрд╛рд░рдг рддреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрд▓ null рдкрд╛рд╕реВрди рддреБрдордЪрд╛ рдЕрд░реНрдЬ рдкрд░рдд рдЖрдгрддрд╛рдирд╛ 3.0.0 рддреЗ 2.0.0.

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

рд╣реЗ рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ. рдирд╡реАрди рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ рд╕реНрддрдВрдн рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рдирдпреЗ ╨▒╤Л╤В╤М рдирд╛рд╣реА. рддреБрдореНрд╣реА рд░реЛрд▓рдмреЕрдХ рдХреЗрд▓реНрдпрд╛рд╕, рдЬреБрдиреНрдпрд╛ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ рдирд╡реАрди рдХреЙрд▓рдордмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдирд╕рддреЗ рдЖрдгрд┐ рддреЛ рдпрд╛рджрд░рдореНрдпрд╛рди рдЗрдиреНрд╕реНрдЯреЙрд▓ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА. Insert. рдкрдг рдЬрд░ рддреБрдореНрд╣реА рд╣реА рдорд░реНрдпрд╛рджрд╛ рдЬреЛрдбрд▓реА рдЖрдгрд┐ рддреБрдордЪрд╛ рдбреАрдмреА рд╣реЛрдИрд▓ v2, рдпрд╛рд╕рд╛рдареА рдирд╡реАрди рд╕реНрддрдВрднрд╛рдЪреЗ рдореВрд▓реНрдп рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЬреНрдпрд╛рдореБрд│реЗ рдирд┐рд░реНрдмрдВрдзрд╛рдВрдЪреЗ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдИрд▓.

рд╣реЗ рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ. рдЖрдкрдг рдкрджреНрдзрдд рдХрд╛рдврд▓реА рдкрд╛рд╣рд┐рдЬреЗ getLastName(), рдХрд╛рд░рдг рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ 3.0.0 рдХреЛрдбрдордзреНрдпреЗ рд╕реНрддрдВрднрд╛рдЪреА рд╕рдВрдХрд▓реНрдкрдирд╛ рдирд╛рд╣реА last_name. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рддреЗрдереЗ рдирд▓ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓. рддреБрдореНрд╣реА рдкрджреНрдзрдд рд╕реЛрдбреВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдЪреЗрдХ рдЬреЛрдбреВ рд╢рдХрддрд╛ null, рдкрд░рдВрддреБ рддрд░реНрдХрд╛рдордзреНрдпреЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреЗ рд╣рд╛ рдПрдХ рдЪрд╛рдВрдЧрд▓рд╛ рдЙрдкрд╛рдп рдЖрд╣реЗ getSurname() рддреБрдореНрд╣реА рдпреЛрдЧреНрдп рд╢реВрдиреНрдп рдирд╕рд▓реЗрд▓реЗ рдореВрд▓реНрдп рдирд┐рд╡рдбрд▓реЗ рдЖрд╣реЗ.

A/B рдЪрд╛рдЪрдгреА

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

рдкрд╛рдпрд▒реНрдпрд╛:

  1. рдЖрд╡реГрддреНрддреА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪрд╛ рдПрдХ рдирд╡реАрди рдкреНрд░рд╕рдВрдЧ рддреИрдирд╛рдд рдХреЗрд▓рд╛ рдЖрд╣реЗ 2.0.0рдЬреЗ рдбреЗрдЯрд╛рдмреЗрд╕рд▓рд╛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ v2
  2. рдпрд╛рджрд░рдореНрдпрд╛рди рдХрд╛рд╣реА рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рдЖрд╡реГрддреНрддреА рдЙрджрд╛рд╣рд░рдгрд╛рдВрджреНрд╡рд╛рд░реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЧреЗрд▓реА 1.0.0
  3. рдЕрджреНрдпрддрди рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реЗ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╡реГрддреНрддреА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЙрджрд╛рд╣рд░рдгреЗ рдЪрд╛рд▓реВ рдЖрд╣реЗрдд 1.0.0 рдЖрдгрд┐ рдЗрддрд░ рдЖрд╡реГрддреНрддреНрдпрд╛ 2.0.0. рдордзреНрдпреЗ рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдкреНрд░рддреНрдпреЗрдХрдЬрдг рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрддреЛ v2
  4. рдЖрд╡реГрддреНрддреА 1.0.0 рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдЖрдбрдирд╛рд╡ рд╕реНрддрдВрдн рд╡рд╛рдкрд░рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрд╡реГрддреНрддреА 2.0.0 рд╡рд╛рдкрд░рддреЗ. рддреЗ рдПрдХрдореЗрдХрд╛рдВрдордзреНрдпреЗ рд╡реНрдпрддреНрдпрдп рдЖрдгрдд рдирд╛рд╣реАрдд рдЖрдгрд┐ рдХреЛрдгрддреАрд╣реА рддреНрд░реБрдЯреА рдирд╕рд╛рд╡реА.
  5. рдЖрд╡реГрддреНрддреА 2.0.0 рдорд╛рдЧрд╛рд╕ рд╕реБрд╕рдВрдЧрддрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реВрди рдЬреБрдиреНрдпрд╛ рдЖрдгрд┐ рдирд╡реАрди рджреЛрдиреНрд╣реА рд╕реНрддрдВрднрд╛рдВрдордзреНрдпреЗ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ

рд╣реЗ рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ. рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЬреБрдиреНрдпрд╛/рдирд╡реАрди рд╕реНрддрдВрднрд╛рддреАрд▓ рдореВрд▓реНрдпрд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрдпрдЯрдордЪреА рдЧрдгрдирд╛ рдХрд░рдгрд╛рд▒реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХреНрд╡реЗрд░реА рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛рд╡реЗ рдХреА рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрддрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдореВрд▓реНрдпреЗ рдЖрд╣реЗрдд (рдмрд╣реБрдзрд╛ рддреА рдЕрдЬреВрдирд╣реА рд╕реНрдерд▓рд╛рдВрддрд░рд┐рдд рдЖрд╣реЗрдд). рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрд╢рд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдореЛрдЬрд╛рдпрдЪреА рдЕрд╕реЗрд▓ рдЬреНрдпрд╛рдВрдЪреЗ рдЖрдбрдирд╛рд╡ (рд╕реНрддрдВрдн рдХрд╛рд╣реАрд╣реА рдЕрд╕реЛ) рдЕрдХреНрд╖рд░рд╛рдиреЗ рд╕реБрд░реВ рдЭрд╛рд▓реЗ. A, рдирдВрддрд░ рдбреЗрдЯрд╛ рд╕реНрдерд▓рд╛рдВрддрд░ рдкреВрд░реНрдг рд╣реЛрдИрдкрд░реНрдпрдВрдд (old тЖТ new рдХреЙрд▓рдо) рддреБрдореНрд╣реА рдирд╡реАрди рдХреЙрд▓рдо рдХреНрд╡реЗрд░реА рдХреЗрд▓реНрдпрд╛рд╕ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рд╡рд┐рд╕рдВрдЧрдд рдбреЗрдЯрд╛ рдЕрд╕реВ рд╢рдХрддреЛ.

рдЕрд░реНрдЬ рд░реЛрд▓рдмреЕрдХ

рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЕреЕрдк рдЖрд╡реГрддреНрддреА рдЖрд╣реЗ 2.0.0 рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдордзреНрдпреЗ v2.

рдкрд╛рдпрд▒реНрдпрд╛:

  1. рддреБрдордЪрд╛ рдЕрд░реНрдЬ рдЖрд╡реГрддреНрддреАрд╡рд░ рдкрд░рдд рдЖрдгрд╛ 1.0.0.
  2. рдЖрд╡реГрддреНрддреА 1.0.0 рдбреЗрдЯрд╛рдмреЗрд╕рдордзреАрд▓ рд╕реНрддрдВрдн рд╡рд╛рдкрд░рдд рдирд╛рд╣реА surname, рддреНрдпрд╛рдореБрд│реЗ рд░реЛрд▓рдмреЕрдХ рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ

рдбреАрдмреА рдмрджрд▓рддреЛ

рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдирд╛рд╡рд╛рдЪрд╛ рдХреЙрд▓рдо рдЖрд╣реЗ last_name.

рдлреНрд▓рд╛рдпрд╡реЗ рд╕реНрд░реЛрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╛ surname.

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

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

рдХреЛрдб рдмрджрд▓рддреЛ

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

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

рдкрд╛рдпрд░реА 3: рдХреЛрдбрдордзреВрди рдЖрдбрдирд╛рд╡ рдХрд╛рдвреВрди рдЯрд╛рдХрдд рдЖрд╣реЗ

рдЕтАНреЕрдк рдЖрд╡реГрддреНрддреА: 3.0.0

DB рдЖрд╡реГрддреНрддреА:v3

рдПрдХ рдЯрд┐рдкреНрдкрдгреА

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

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

рдЕрд░реНрдЬ рд░реЛрд▓рдмреЕрдХ

рд╕рдзреНрдпрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЕреЕрдк рдЖрд╡реГрддреНрддреА рдЖрд╣реЗ 3.0.0 рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ v3. рдЖрд╡реГрддреНрддреА 3.0.0 рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдЬрддрди рдХрд░рдд рдирд╛рд╣реА last_name. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рдордзреНрдпреЗ surname рд╕рд░реНрд╡рд╛рдд рдЕрджреНрдпрдпрд╛рд╡рдд рдорд╛рд╣рд┐рддреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ.

рдкрд╛рдпрд▒реНрдпрд╛:

  1. рддреБрдордЪрд╛ рдЕрд░реНрдЬ рдЖрд╡реГрддреНрддреАрд╡рд░ рдкрд░рдд рдЖрдгрд╛ 2.0.0.
  2. рдЖрд╡реГрддреНрддреА 2.0.0 рд╡рд╛рдкрд░рддреЗ рдЖрдгрд┐ last_name ╨╕ surname.
  3. рдЖрд╡реГрддреНрддреА 2.0.0 рдШреЗрдИрд▓ surname, рддреЗ рд╢реВрдиреНрдп рдирд╕рд▓реНрдпрд╛рд╕, рдЕрдиреНрдпрдерд╛ -last_name

рдбреЗрдЯрд╛рдмреЗрд╕ рдмрджрд▓рддреЛ

рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдХреЛрдгрддреЗрд╣реА рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдмрджрд▓ рдирд╛рд╣реАрдд. рдЬреБрдиреНрдпрд╛ рдбреЗрдЯрд╛рдЪреЗ рдЕрдВрддрд┐рдо рд╕реНрдерд▓рд╛рдВрддрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ:

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;

-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;

рдХреЛрдб рдмрджрд▓рддреЛ

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

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

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String lastname) {
        this.surname = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", surname=" + this.surname
                + "]";
    }
}

рдкрд╛рдпрд░реА 4: рдбреЗрдЯрд╛рдмреЗрд╕рдордзреВрди рдЖрдбрдирд╛рд╡ рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ

рдЕтАНреЕрдк рдЖрд╡реГрддреНрддреА: 4.0.0

DB рдЖрд╡реГрддреНрддреА: v4

рдПрдХ рдЯрд┐рдкреНрдкрдгреА

рдЖрд╡реГрддреНрддреА рдХреЛрдб рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ 3.0.0 рд╕реНрддрдВрдн рд╡рд╛рдкрд░рд▓рд╛ рдирд╛рд╣реА last_name, рдЖрдореНрд╣реА рдкрд░рдд рд░реЛрд▓ рдХреЗрд▓реНрдпрд╛рд╕ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рджрд░рдореНрдпрд╛рди рдХрд╛рд╣реАрд╣реА рд╡рд╛рдИрдЯ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА 3.0.0 рдбреЗрдЯрд╛рдмреЗрд╕рдордзреВрди рдХреЙрд▓рдо рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реНрдпрд╛рдирдВрддрд░.

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд▓реЙрдЧ

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

рдбреАрдмреА рдмрджрд▓рддреЛ

рддреБрд▓рдиреЗрдиреЗ v3 рдЖрдореНрд╣реА рдлрдХреНрдд рд╕реНрддрдВрдн рдХрд╛рдврддреЛ last_name рдЖрдгрд┐ рдЧрд╣рд╛рд│ рдирд┐рд░реНрдмрдВрдз рдЬреЛрдбрд╛.

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

рдХреЛрдб рдмрджрд▓рддреЛ

рдХреЛрдбрдордзреНрдпреЗ рдХреЛрдгрддреЗрд╣реА рдмрджрд▓ рдирд╛рд╣реАрдд.

рдирд┐рд╖реНрдХрд░реНрд╖

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

  1. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрд╡реГрддреНрддреА рдЙрдкрдпреЛрдЬрди 1.0.0 ╤Б v1 рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ (рд╕реНрддрдВрдн рдирд╛рд╡ = last_name)
  2. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрд╡реГрддреНрддреА рдЙрдкрдпреЛрдЬрди 2.0.0, рдЬреНрдпрд╛рдордзреНрдпреЗ рдбреЗрдЯрд╛ рд╕рд╛рдард╡рд▓рд╛ рдЬрд╛рддреЛ last_name ╨╕ surname. рдкрд╛рд╕реВрди рдЕрд░реНрдЬ рд╡рд╛рдЪрддреЛ last_name. рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЖрд╣реЗ v2рд╕рд╛рд░рдЦреЗ рд╕реНрддрдВрдн рдЕрд╕рд▓реЗрд▓реЗ last_name, рдЖрдгрд┐ surname. surname l рдЪреА рдкреНрд░рдд рдЖрд╣реЗast_name. (рд╕реВрдЪрдирд╛: рдпрд╛ рд╕реНрддрдВрднрд╛рдд рд╢реВрдиреНрдп рдирд╕рд▓реЗрд▓реА рдорд░реНрдпрд╛рджрд╛ рдирд╕рд╛рд╡реА)
  3. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрд╡реГрддреНрддреА рдЙрдкрдпреЛрдЬрди 3.0.0, рдЬреЗ рдлрдХреНрдд рдбреЗрдЯрд╛ рд╕рдВрдЪрдпрд┐рдд рдХрд░рддреЗ surname рдЖрдгрд┐ рдЖрдбрдирд╛рд╡рд╛рд╡рд░реВрди рд╡рд╛рдЪрддреЛ. рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╛рдареА, рд╢реЗрд╡рдЯрдЪреЗ рд╕реНрдерд▓рд╛рдВрддрд░ рд╣реЛрдд рдЖрд╣реЗ last_name ╨▓ surname. рддрд╕реЗрдЪ рдПрдХ рдорд░реНрдпрд╛рджрд╛ рдирд╛рд╣реА рдкрд╛рд╕реВрди рдХрд╛рдврд▓реЗ last_name. рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрддрд╛ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЖрд╣реЗ v3
  4. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрд╡реГрддреНрддреА рдЙрдкрдпреЛрдЬрди 4.0.0 - рдХреЛрдбрдордзреНрдпреЗ рдХреЛрдгрддреЗрд╣реА рдмрджрд▓ рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реАрдд. рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрдпреЛрдЬрди v4, рдЬреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрддреЗ last_name. рдпреЗрдереЗ рддреБрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рдЧрд╣рд╛рд│ рдорд░реНрдпрд╛рджрд╛ рдЬреЛрдбреВ рд╢рдХрддрд╛.

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

рдХреЛрдб

рдпрд╛ рд▓реЗрдЦрд╛рдд рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рд╕рд░реНрд╡ рдХреЛрдб рдпреЗрдереЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд рдЬрд┐рдереВрдм. рдЦрд╛рд▓реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдгрди рдЖрд╣реЗ.

рдкреНрд░рдХрд▓реНрдк

рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдХреНрд▓реЛрди рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рдлреЛрд▓реНрдбрд░ рд░рдЪрдирд╛ рджрд┐рд╕реЗрд▓.

тФЬтФАтФА boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
тФЬтФАтФА boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
тФЬтФАтФА boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
тФЬтФАтФА boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
тФФтФАтФА boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

рд╕реНрдХреНрд░рд┐рдкреНрдЯ

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

рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдмреЕрдХрд╡рд░реНрдб рд╕реБрд╕рдВрдЧрдд рдмрджрд▓рд╛рдВрд╕рд╣ рдХреЗрд╕, рдЪрд╛рд▓рд╡рд╛:

./scripts/scenario_backward_compatible.sh

рдЖрдгрд┐ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдорд╛рдЧреЗ рд╡рд┐рд╕рдВрдЧрдд рдмрджрд▓рд╛рдВрд╕рд╣ рдХреЗрд╕, рдЪрд╛рд▓рд╡рд╛:

./scripts/scenario_backward_incompatible.sh

рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдирдореБрдирд╛ рдлреНрд▓рд╛рдпрд╡реЗ

рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд░реВрди рдШреЗрддрд▓реА рдЖрд╣реЗрдд Spring Boot Sample Flyway.

рдЖрдкрдг рдПрдХ рдХрдЯрд╛рдХреНрд╖ рдЯрд╛рдХреВ рд╢рдХрддрд╛ http://localhost:8080/flyway, рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪреА рдпрд╛рджреА рдЖрд╣реЗ.

рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ H2 рдХрдиреНрд╕реЛрд▓ рджреЗрдЦреАрд▓ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ (at http://localhost:8080/h2-console) рддреНрдпрд╛рдореБрд│реЗ рддреБрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдерд┐рддреА рдкрд╛рд╣реВ рд╢рдХрддрд╛ (рдбреАрдлреЙрд▓реНрдЯ jdbc URL рдЖрд╣реЗ jdbc:h2:mem:testdb).

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

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

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

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