рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рд░ рдбрд╛рдЯрд╛рдмреЗрд╕рд╣рд░реВ

рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рд░ рдбрд╛рдЯрд╛рдмреЗрд╕рд╣рд░реВ

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

рдпрджрд┐ рддрдкрд╛рдЗрдБ рд▓реЗрдЦрдмрд╛рдЯ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдмреБрдЭреНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ GitHub.

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

рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рддреИрдирд╛рддреА

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

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

  • рддрдкрд╛рдЗрдБрдХреЛ рд╕реЗрд╡рд╛рдХреЛ рд╕рдВрд╕реНрдХрд░рдг рдирдореНрдмрд░ 1 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдбрд╛рдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╕рди рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рд╕рдВрд╕реНрдХрд░рдг # 2 рд╕рдБрдЧ рд╕рдорд╛рдирд╛рдиреНрддрд░ рд░реВрдкрдорд╛ рддрдкрд╛рдИрдВрдХреЛ рд╕реЗрд╡рд╛рдХреЛ рд╕рдВрд╕реНрдХрд░рдг # 1 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдЬрд╕рд░реА рддрдкрд╛рдИрдВрд▓реЗ рддреНрдпреЛ рд╕рдВрд╕реНрдХрд░рдг рдирдореНрдмрд░ 2 рд▓реЗ рдЬрд╕реНрддреИ рдХрд╛рдо рдЧрд░реЗрдХреЛ рджреЗрдЦреНрдиреБрд╣реБрдиреНрдЫ, рд╕рдВрд╕реНрдХрд░рдг рдирдореНрдмрд░ 1 рд╣рдЯрд╛рдЙрдиреБрд╣реЛрд╕реН
  • рддрдпрд╛рд░ рдЫ!

рд╕рдЬрд┐рд▓реЛ, рд╣реИрди? рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдпреЛ рддреНрдпрддрд┐ рд╕рд░рд▓ рдЫреИрди, рд░ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдкрдЫрд┐ рд╡рд┐рд╕реНрддрд╛рд░рдорд╛ рд╣реЗрд░реНрдиреЗрдЫреМрдВред рдЕрдм рд╣рд╛рдореА рдЕрд░реНрдХреЛ рдПрдХрджрдо рд╕рд╛рдорд╛рдиреНрдп рддреИрдирд╛рддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ - рдиреАрд▓реЛ рд╣рд░рд┐рдпреЛ рддреИрдирд╛рддреАред

рдХреЗ рддрдкрд╛рдЗрдБ рдХрд╣рд┐рд▓реНрдпреИ рд╕реБрдиреНрдиреБрднрдПрдХреЛ рдЫ рдиреАрд▓реЛ рд╣рд░рд┐рдпреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди? рдХреНрд▓рд╛рдЙрдб рдлрд╛рдЙрдиреНрдбреНрд░реАрд▓реЗ рдпреЛ рдЕрддреНрдпрдиреНрддреИ рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрдБрдЫред рд╣реЗрд░реЗ рдорд╛рддреНрд░реИ рдпреЛ рд▓реЗрдЦ, рдЬрд╣рд╛рдБ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рд╡рд░реНрдгрди рдЧрд░реНрдЫреМрдВред рдЫреЛрдЯрдХрд░реАрдорд╛ рд╕рдВрдХреНрд╖реЗрдк рдЧрд░реНрди, рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рдирд┐рд▓реЛ рд╣рд░рд┐рдпреЛ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рдХрд╕рд░реА рдЧрд░реНрдиреЗ рднрдиреЗрд░ рд╕рдореНрдЭрд╛рдЙрдиреЗ рдЧрд░реМрдВ:

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

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

рдорд╛рдерд┐рдХрд╛ рд╕рдмреИ рдкрдврд┐рд╕рдХреЗрдкрдЫрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рд╢реНрди рд╕реЛрдзреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдорд▓реЗ рдиреАрд▓реЛ рд╣рд░рд┐рдпреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрдирд╕рдБрдЧ рдХреЗ рдЧрд░реНрдЫ?

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

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

рд░ рдпрд╣рд╛рдБ рд╣рд╛рдореА рдпрд╕ рд▓реЗрдЦрдорд╛ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдЖрдЙрдЫреМрдВред рдбрд╛рдЯрд╛рдмреЗрд╕ред рдпрд╕ рд╡рд╛рдХреНрдпрд╛рдВрд╢рд▓рд╛рдИ рдЕрд░реНрдХреЛ рд╣реЗрд░реМрдВред

рдбрд╛рдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╕рди рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдЕрдм рддрдкрд╛рдИрд▓реЗ рдЖрдлреИрд▓рд╛рдИ рдкреНрд░рд╢реНрди рд╕реЛрдзреНрдиреБ рдкрд░реНрдЫ - рдпрджрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдкрдЫрд╛рдбрд┐ рдЕрдиреБрдХреВрд▓ рдЫреИрди рднрдиреЗ рдХреЗ рд╣реБрдиреНрдЫ? рдореЗрд░реЛ рдПрдкрдХреЛ рдкрд╣рд┐рд▓реЛ рд╕рдВрд╕реНрдХрд░рдг рдЯреБрдЯреНрдиреЗ рдЫреИрди? рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпреЛ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХреЗ рд╣реБрдиреЗрдЫ ...

рддреНрдпрд╕реЛрднрдП, рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо / рдиреАрд▓реЛ рд╣рд░рд┐рдпреЛ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрдХреЛ рдареВрд▓рд╛ рдлрд╛рдЗрджрд╛рд╣рд░реВрдХреЛ рд╕рд╛рде рдкрдирд┐, рдХрдореНрдкрдиреАрд╣рд░реВрд▓реЗ рдЙрдиреАрд╣рд░реВрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рдореНрди рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдкрдЫреНрдпрд╛рдЙрдБрдЫрдиреН:

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

рдпрд╕ рд▓реЗрдЦрдорд╛, рд╣рд╛рдореА рддрдкрд╛рдЗрдБ рдХрд╕рд░реА рддрдкрд╛рдЗрдБрдХреЛ рдбрд╛рдЯрд╛рдмреЗрд╕ рд░ рдХреЛрдбрд╕рдБрдЧ рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрдХреЛ рдлрд╛рдЗрджрд╛ рд▓рд┐рдирдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рд╡рд┐рд╡рд░рдг рджрд┐рдиреЗрдЫреМрдВред

рдбрд╛рдЯрд╛рдмреЗрд╕ рдореБрджреНрджрд╛рд╣рд░реВ

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

рд╕рдВрд╕реНрдХрд░рдг рдпреЛрдЬрдирд╛

рдпрд╕ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ рдлреНрд▓рд╛рдИрд╡реЗ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдиреНрддреНрд░рдг рдЙрдкрдХрд░рдгрдХреЛ рд░реВрдкрдорд╛ (рд▓рдЧрднрдЧред рдкреНрд░рддрд┐ред: рд╣рд╛рдореА рдбрд╛рдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╕рдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрджреИрдЫреМрдВ)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдкрдорд╛, рд╣рд╛рдореАрд▓реЗ рд╕реНрдкреНрд░рд┐рдЩ рдмреБрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдкрдирд┐ рд▓реЗрдЦреНрдиреЗ рдЫреМрдБ рдЬрд╕рдорд╛ рдлреНрд▓рд╛рдИрд╡реЗ рд╕рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдЯ-рдЗрди рдЫ рд░ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдХрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджрд╛ рд╕реНрдХрд┐рдорд╛ рдорд╛рдЗрдЧреНрд░реЗрд╕рди рдЧрд░реНрдиреЗрдЫред Flyway рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлреЛрд▓реНрдбрд░рдорд╛ рдорд╛рдЗрдЧреНрд░реЗрд╕рди рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ 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ред рдЕрдм рддрдкрд╛рдЗрдБрдХреЛ DB рд╕рдВрд╕реНрдХрд░рдг v2
  2. рдмрд╛рдЯ рдбрд╛рдЯрд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН last_name ╨▓ surname. рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реНрдпрджрд┐ рддрдкрд╛рдИрдВрд╕рдБрдЧ рдпреЛ рдзреЗрд░реИ рдбрд╛рдЯрд╛ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдмреНрдпрд╛рдЪ рдорд╛рдЗрдЧреНрд░реЗрд╕рдирд▓рд╛рдИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреБрдкрд░реНрдЫ!
  3. рдХреЛрдб рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рдЬрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рджреБрдмреИ ╨╕ ╨╜╨╛╨▓╤Л╨╣рд░ рдкреБрд░рд╛рдиреЛ рд╕реНрддрдореНрднред рдЕрдм рддрдкрд╛рдЗрдБрдХреЛ рдПрдк рд╕рдВрд╕реНрдХрд░рдг 2.0.0
  4. рд╕реНрддрдореНрднрдмрд╛рдЯ рдорд╛рди рдкрдвреНрдиреБрд╣реЛрд╕реН surname, рдпрджрд┐ рдпреЛ рдЫреИрди null, рд╡рд╛ l рдмрд╛рдЯast_nameрдпрджрд┐ surname рддреЛрдХрд┐рдПрдХреЛ рдЫреИрдиред рдореЗрдЯрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ getLastName() рдХреЛрдбрдмрд╛рдЯ, рдХрд┐рдирдХрд┐ рдпрд╕рд▓реЗ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрдиреЗрдЫ null рдмрд╛рдЯ рдЖрдлреНрдиреЛ рдЖрд╡реЗрджрди рдлрд┐рд░реНрддрд╛ рдЧрд░реНрджрд╛ 3.0.0 рдЧрд░реНрди 2.0.0.

рдпрджрд┐ рддрдкрд╛рдЗрдБ Spring Boot Flyway рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдпреА рджреБрдИ рдЪрд░рдгрд╣рд░реВ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрдХреЛ рд╕рдордпрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░рд┐рдиреЗрдЫ 2.0.0 рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдХрд░рдг рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБрд▓реЗ рдпреЛ рдЧрд░реНрди рджреБрдИ рдлрд░рдХ рдЪреАрдЬрд╣рд░реВ рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫ (рдкрд╣рд┐рд▓реЗ db рд╕рдВрд╕реНрдХрд░рдг рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдЕрдкрдбреЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рддреНрдпрд╕рдкрдЫрд┐ рдирдпрд╛рдБ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН)ред

рдпреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЫред рдпрд╛рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рд╕реНрддрдореНрдн рдЧрд░реНрдиреБ рд╣реБрдБрджреИрди рд╣реБрдиреБ рд╣реЛрдЗрдиред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдПрдХ рд░реЛрд▓рдмреНрдпрд╛рдХ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдкреБрд░рд╛рдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рдирдпрд╛рдБ рд╕реНрддрдореНрднрдХреЛ рдмрд╛рд░реЗрдорд╛ рдерд╛рд╣рд╛ рдЫреИрди рд░ рдпреЛ рд╕рдордпрдорд╛ рд╕реНрдерд╛рдкрдирд╛ рд╣реБрдиреЗрдЫреИрдиред Insert. рддрд░ рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпреЛ рдмрд╛рдзрд╛ рдердкреНрдиреБрд╣реБрдиреНрдЫ рд░ рддрдкрд╛рдЗрдБрдХреЛ db рд╣реБрдиреЗрдЫ 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, рддреНрдпрд╕реИрд▓реЗ рд░реЛрд▓рдмреНрдпрд╛рдХ рд╕рдлрд▓ рд╣реБрдиреБрдкрд░реНрдЫ

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');

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдердкреНрдиреБрд╣реЛрд╕реН surname.

рдзреНрдпрд╛рдиред рдпрд╛рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдИрд▓реЗ рдердкреНрдиреБ рднрдПрдХреЛ рд╕реНрддрдореНрднрдорд╛ рдХреБрдиреИ рдкрдирд┐ рд╢реВрдиреНрдп рдмрд╛рдзрд╛рд╣рд░реВ рдердкреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдиред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ 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"}

DB рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ

рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдкрдорд╛ 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ред рдпрд╣рд╛рдБ рддрдкрд╛рдИрдБрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдХреБрдиреИ рдкрдирд┐ рдЫреБрдЯреЗрдХрд╛ рдмрд╛рдзрд╛рд╣рд░реВ рдердкреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдпреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрдЫреНрдпрд╛рдПрд░ рддрдкрд╛рдИрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕/рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдиреБрдХреВрд▓рддрд╛ рддреЛрдбреНрди рдмрд┐рдирд╛ рд╕рдзреИрдВ рдПрдЙрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдлрд┐рд░реНрддрд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдХреЛрдб

рдпрд╕ рд▓реЗрдЦрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рд╕рдмреИ рдХреЛрдбрд╣рд░реВ рдЙрдкрд▓рдмреНрдз рдЫрдиреН Githubред рддрд▓ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╡рд░рдг рдЫред

рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ

рднрдгреНрдбрд╛рд░ рдХреНрд▓реЛрди рдЧрд░реЗрдкрдЫрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдирд┐рдореНрди рдлреЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫред

тФЬтФАтФА 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 рдХрдиреНрд╕реЛрд▓ рдкрдирд┐ рд╕рдорд╛рд╡реЗрд╢ рдЫ http://localhost:8080/h2-console) рддрд╛рдХрд┐ рддрдкрд╛рдИрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕реНрдерд┐рддрд┐ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд jdbc URL рд╣реЛ jdbc:h2:mem:testdb).

рдпрд╕рдмрд╛рд╣реЗрдХ

рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдЕрдиреНрдп рд▓реЗрдЦрд╣рд░реВ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:

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

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