Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

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

рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЖрдлреИрдВ рдЧрд░реМрдВ - рдзреЗрд░реИ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ MR рд▓рд╛рдИ рдердореНрдмреНрд╕ рдЕрдк рдирдЧрд░реЗрд╕рдореНрдо рд╣рд╛рдореА рдорд░реНрдЬрд▓рд╛рдИ рдирд┐рд╖реЗрдз рдЧрд░реНрдиреЗрдЫреМрдВред

рдпреЛ рдкрдирд┐ рдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ?

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

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛ рддрдкрд╛рдИрд▓реЗ рдЧрд░реНрдиреБ рдкрд░реНрдЫ:

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

рдореИрд▓реЗ рдЧрд░реЗрдХреЛ рдкрд╣рд┐рд▓реЛ рдХреБрд░рд╛ рдЧреБрдЧрд▓ рдерд┐рдпреЛ, рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЧрд░реНрджреИ рдХрд┐ рдХрд╕реИрд▓реЗ рдкрдХреНрдХреИ рдкрдирд┐ рдпрд╕реНрддреИ рдХреЗрд╣рд┐ рдЧрд░рд┐рд╕рдХреЗрдХреЛ рдЫ (рдХреЛрдб рдкрд░рд┐рдорд╛рд░реНрдЬрди рдирдЧрд░реАрдХрди), рддрд░ рдпреЛ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рддреНрдпрд╕реНрддреЛ рдХреБрдиреИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрдПрдХреЛ рдЫреИрдиред

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

рдЙрджрд╛рд╣рд░рдгрдХреЛ рд░реВрдкрдорд╛, рдкрд░реАрдХреНрд╖рдг рднрдгреНрдбрд╛рд░рдорд╛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрдирд╣рд░реВ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реМрдВ myapp:

  1. GitLab API рдорд╛ рдкрд╣реБрдБрдЪрдХреЛ рд▓рд╛рдЧрд┐ рдЯреЛрдХрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ (рдпрд╕рдХреЛ рдорд╛рдзреНрдпрдордмрд╛рдЯ рд╣рд╛рдореАрд▓реЗ "рдХрд╛ рд▓рд╛рдЧрд┐" рд░ "рд╡рд┐рдкрд░реАрдд" рднреЛрдЯрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫреМрдВ)
  2. GitLab рдЪрд░рд╣рд░реВрдорд╛ рдЯреЛрдХрди рдердкреМрдВ
  3. рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рднрдПрдорд╛ рдорд░реНрдЬрд▓рд╛рдИ рдЕрд╕рдХреНрд╖рдо рдЧрд░реМрдВ (рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЕрдкрднреЛрдЯрд╣рд░реВ рдЫреИрдирдиреН рднрдиреЗ)
  4. CI/CD рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛ рднреЛрдЯ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрдЯ рдЕрдк рдЧрд░реМрдВ
  5. рд╣рд╛рдореА рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢рд╛рдЦрд╛рд╣рд░реВрдорд╛ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рд╣рд░реВ рдЧрд░реНрди рдирд┐рд╖реЗрдз рдЧрд░реНрдЫреМрдВ; рд╕рдмреИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ MR рдорд╛рд░реНрдлрдд рдорд╛рддреНрд░ рдЧрд░рд┐рдиреНрдЫ
  6. рдЕрдиреНрддрдорд╛ рдХреЗ рднрдпреЛ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ

1. API рдкрд╣реБрдБрдЪ рдЧрд░реНрди рдЯреЛрдХрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН тЖТ рдЯреЛрдХрдирд╣рд░реВ рдкрд╣реБрдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдЯреЛрдХрди рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН:

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

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

2. Gitlab рдЪрд░рд╣рд░реВрдорд╛ рдЯреЛрдХрди рдердкреНрдиреБрд╣реЛрд╕реН

рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЕрдШрд┐рд▓реНрд▓реЛ рдЪрд░рдгрдорд╛ рд╣рд╛рдореАрд▓реЗ рдПрдЙрдЯрд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдпреМрдВ QmN2Y0NOUFlfeXhvd21ZS01aQzgK

рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВ рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН тЖТ CI/CD тЖТ рдЪрд░рд╣рд░реВ тЖТ рдЪрд░ рдердкреНрдиреБрд╣реЛрд╕реН тЖТ GITLAB_TOKEN_FOR_CI

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛ рд╣рд╛рдореА рдкрд╛рдЙрдБрдЫреМрдВ:

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

рдпреЛ рдпрд╛ рдд рдПрдЙрдЯрд╛ рднрдгреНрдбрд╛рд░рдорд╛ рд╡рд╛ рднрдгреНрдбрд╛рд░рд╣рд░реВрдХреЛ рд╕рдореВрд╣рдорд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

3. рдпрджрд┐ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдкрдЫрд┐ рд╕рд╣рдХрд░реНрдореАрд╣рд░реВрдХреЛ рд╕реНрд╡реАрдХреГрддрд┐ рдкреНрд░рд╛рдкреНрдд рднрдПрди рднрдиреЗ рд╣рд╛рдореА рдорд░реНрдЬрдорд╛ рдкреНрд░рддрд┐рдмрдиреНрдз рд▓рдЧрд╛рдЙрдБрдЫреМрдВред

рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛ рдорд╛, рдорд░реНрдЬ рдорд╛ рдирд┐рд╖реЗрдз рдпреЛ рд╣реБрдиреЗрдЫ рдХрд┐ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рддреНрд░реБрдЯрд┐ рдлрд┐рд░реНрддрд╛ рд╣реБрдиреЗрдЫ рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдордд рдЫреИрди рднрдиреЗред

рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН тЖТ рд╕рд╛рдорд╛рдиреНрдп тЖТ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдорд░реНрдЬ рдЧрд░реНрдиреБрд╣реЛрд╕реН тЖТ рдЬрд╛рдБрдЪрд╣рд░реВ рдорд░реНрдЬ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд▓рд╛рдЗрдирд╣рд░реВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫред

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

4. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдЖрд╡реЗрджрдирдХреЛ рд▓рд╛рдЧрд┐ CI/CD рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрднрдПрдХреЛ рдЫреИрди рднрдиреЗ
рднрдгреНрдбрд╛рд░рдХреЛ рдореВрд▓рдорд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН gitlab-ci.yml рд╕рд░рд▓ рд╕рд╛рдордЧреНрд░реА рд╕рдВрдЧ:

stages:
  - build
  - test

variables:
  NEED_VOTES: 1

include:
  - remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"

run-myapp:
  stage: build
  script: echo "Hello world"

CI/CD рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рднрдгреНрдбрд╛рд░
рдо рдПрдЙрдЯрд╛ рдЫреБрдЯреНрдЯреИ рднрдгреНрдбрд╛рд░ рдмрдирд╛рдЙрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрдЫреБ рдЬрд╕рдорд╛ рддрдкрд╛рдИрдВрд▓реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди myapp.gitlab-ci.yml рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕ рддрд░рд┐рдХрд╛рд▓реЗ рддрдкрд╛рдИрд▓реЗ рдмрд┐рд▓реНрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд░ рдкрд╣реБрдБрдЪ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреЗ рд╕рд╣рднрд╛рдЧреАрд╣рд░реВрдХреЛ рдкрд╣реБрдБрдЪрд▓рд╛рдИ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдирдпрд╛рдБ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдлрд╛рдЗрд▓рдХреЛ рд╕реНрдерд╛рди myapp рднрдгреНрдбрд╛рд░рдорд╛ рдЧрдПрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ - рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВ - CI/CD - рдЕрд╕реЗрдВрдмрд▓реА рд▓рд╛рдЗрдирд╣рд░реВ - рдЕрдиреБрдХреВрд▓рди CI рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдорд╛рд░реНрдЧ - рдирдпрд╛рдБ рдлрд╛рдЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ред myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

рд╕реБрдЭрд╛рд╡: GitLab CI рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЧрд░реНрди рдПрдХ linter рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН
рдпрджрд┐ рддрдкрд╛рдЗрдБ рдПрдХреНрд▓реИ рдХрд╛рдо рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, MR рдорд╛рд░реНрдлрдд рдХрд╛рдо рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рдорджреНрджрдд рд╣реБрдиреЗрдЫ, рддрдкрд╛рдЗрдБрдХрд╛ рд╕рдмреИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рд▓рд┐рдиреНрдЯрд░ рдорд╛рд░реНрдлрдд рдЪрд▓рд╛рдЙрдиреБ рд╣реЛред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ YAML рдлрд╛рдЗрд▓рдХреЛ рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕рдорд╛ рдЧрд▓реНрддреА рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рдЙрддреНрдкрд╛рджрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рддреЛрдбреНрдиреЗ рдЫреИрди, рддрд░ рдорд░реНрдЬрд▓рд╛рдИ рдорд╛рддреНрд░ рд░реЛрдХреНрдиреЗрдЫред

рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХреНрдиреЗ linters рднрдПрдХрд╛ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдХреЛ рдЙрджрд╛рд╣рд░рдг:

hub.docker.com/r/gableroux/gitlab-ci-lint
hub.docker.com/r/sebiwi/gitlab-ci-validate

рд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЪрд░рдг рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

stages:
  - lint

lint:
  stage: lint
  image: sebiwi/gitlab-ci-validate:1.3.0
  variables:
    GITLAB_HOST: https://gitlab.com
  script:
    - CI_FILES=(./*.yml)
    - for f in "${CI_FILES[@]}"; do
        gitlab-ci-validate $f;
      done;

рдпреЛ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдИрдВрдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рдХреЗрд╣реА рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдердкреНрди рдмрд╛рдБрдХреА рдЫ:

stages:
- test

variables:
NEED_VOTES: 1

include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"

NEED_VOTES рдЪрд░рд▓реЗ рдорд░реНрдЬ рдЙрдкрд▓рдмреНрдз рд╣реБрдирдХрд╛ рд▓рд╛рдЧрд┐ рдХрддрд┐рд╡рдЯрд╛ "рдердореНрдмреНрд╕ рдЕрдк" MR рд╣реБрдиреБ рдкрд░реНрдЫ рднрдиреЗрд░ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрдЫред рдПрдХ рдмрд░рд╛рдмрд░рдХреЛ рдорд╛рди рднрдиреЗрдХреЛ рддрдкрд╛рдИрд▓реЗ рдЖрдлреНрдиреЛ MR рд▓рд╛рдИ "рд▓рд╛рдЗрдХ" рдЧрд░реЗрд░ рд╕реНрд╡реАрдХреГрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдЬрд╕рд▓реЗ "рд▓рд╛рдЗрдХ" рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫред

myapp.gitlab-ci.yml рдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд░рд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди
stages:
- build
- test

variables:
NEED_VOTES: 0

include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"

run-myapp:
stage: build
image: openjdk
script:
- echo CI_MERGE_REQUEST_TARGET_BRANCH_NAME $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- java HelloWorld.java

рд╕рд╛рдордЧреНрд░реА check-approve.gitlab-ci.yml
ci-mr:
stage: test
script:
- echo ${CI_API_V4_URL}
- echo "CI_PROJECT_ID ${CI_PROJECT_ID}"
- echo "CI_COMMIT_SHA ${CI_COMMIT_SHA}"
- "export MR_ID=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .id else {} end" | grep --invert-match {})"
- "export MR_TITLE=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .title else {} end" | grep --invert-match {})"
- "export MR_WIP=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .work_in_progress else {} end" | grep --invert-match {})"
- "export MR_UPVOTES=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .upvotes else {} end" | grep --invert-match {})"
- "export MR_DOWNVOTES=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .downvotes else {} end" | grep --invert-match {})"
- MR_VOTES=$(expr ${MR_UPVOTES} - ${MR_DOWNVOTES})
- NEED_VOTES_REAL=${NEED_VOTES:-1}
- echo "MR_ID ${MR_ID} MR_TITLE ${MR_TITLE} MR_WIP ${MR_WIP} MR_UPVOTES ${MR_UPVOTES} MR_DOWNVOTES ${MR_DOWNVOTES}"
- echo "MR_VOTES ${MR_VOTES} Up vote = 1, down vote = -1, MR OK if votes >=${NEED_VOTES_REAL}"
- if [ "${MR_VOTES}" -ge "$(expr ${NEED_VOTES_REAL})" ];
then
echo "MR OK";
else
echo "MR ERROR Need more votes";
exit 1;
fi
image: laptevss/gitlab-api-util
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^release/.*$/'

рдкреНрд░рдорд╛рдгреАрдХрд░рдгрдХреЛ рдХреНрд░рдордорд╛ рдХреЗ рд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдердк рдЬрд╛рдирдХрд╛рд░реА:

  • рдорд╛рд╕реНрдЯрд░ рд╡рд╛ рд░рд┐рд▓рд┐рдЬ/* рд╢рд╛рдЦрд╛рд╣рд░реВрдорд╛ рдПрдордЖрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рдорд╛рддреНрд░ рдЬрд╛рдБрдЪ рдЧрд░рд┐рдиреЗрдЫ рднрдиреНрдиреЗ рдкреНрд░рддрд┐рдмрдиреНрдз рдЫ
  • GitLab API рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореАрд▓реЗ "рд▓рд╛рдЗрдХ" рд░ "рдбрд┐рд╕рд▓рд╛рдЗрдХ" рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкрд╛рдЙрдБрдЫреМрдВ
  • рд╕рдХрд╛рд░рд╛рддреНрдордХ рд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдмреАрдЪрдХреЛ рднрд┐рдиреНрдирддрд╛ рдЧрдгрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдпрджрд┐ рднрд┐рдиреНрдирддрд╛ рд╣рд╛рдореАрд▓реЗ NEED_VOTES рдорд╛ рд╕реЗрдЯ рдЧрд░реЗрдХреЛ рдорд╛рди рднрдиреНрджрд╛ рдХрдо рдЫ рднрдиреЗ, рд╣рд╛рдореА рдорд░реНрдЬ рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛рд▓рд╛рдИ рд░реЛрдХреНрдЫреМрдВред

5. рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢рд╛рдЦрд╛рд╣рд░реВрдорд╛ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдирд┐рд╖реЗрдз рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╣рд╛рдореА рд╢рд╛рдЦрд╛рд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдЫреМрдВ рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд▓реЗ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛рд╣рд░реВ рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрдиреБрдкрд░реНрдЫ рд░ рддрд┐рдиреАрд╣рд░реВ MR рдорд╛рд░реНрдлрдд рдорд╛рддреНрд░ рдХрд╛рдо рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреЗрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрдЫреМрдВред

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ тЖТ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА тЖТ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢рд╛рдЦрд╛рд╣рд░реВрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН:

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

6. рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН

NEED_VOTES: реж рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╣рд╛рдореА рдПрдордЖрд░ рдмрдирд╛рдЙрдБрдЫреМрдВ рд░ "рдбрд┐рд╕рд▓рд╛рдЗрдХ" рд░рд╛рдЦреНрдЫреМрдВред

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

рдирд┐рд░реНрдорд╛рдг рд▓рдЧрд╣рд░реВрдорд╛:

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

рдЕрдм "рд▓рд╛рдЗрдХ" рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реН рд░ рдлреЗрд░рд┐ рдЬрд╛рдБрдЪ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

Gitlab CE рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рдЫреИрди, рддрд░ рдо рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдиреНрдЫреБ

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

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