Gitlab CE рдордзреНрдпреЗ рдХреЛрдб рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди: рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рдордВрдЬреВрд░ рдирд╕рд▓реНрдпрд╛рд╕, рдкрд░рдВрддреБ рдорд▓рд╛ рдЦрд░реЛрдЦрд░ рд╣рд╡реЗ рдЖрд╣реЗ

Gitlab CE рдордзреНрдпреЗ рдХреЛрдб рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди: рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рдордВрдЬреВрд░ рдирд╕рд▓реНрдпрд╛рд╕, рдкрд░рдВрддреБ рдорд▓рд╛ рдЦрд░реЛрдЦрд░ рд╣рд╡реЗ рдЖрд╣реЗ

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

рдЪрд▓рд╛ рдХрд┐рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡рддрдГ рдХрд░реВрдпрд╛ - рдЬреЛрдкрд░реНрдпрдВрдд рдЕрдиреЗрдХ рд╡рд┐рдХрд╛рд╕рдХ MR рд▓рд╛ рдердореНрд╕ рдЕрдк рджреЗрдд рдирд╛рд╣реАрдд рддреЛрдкрд░реНрдпрдВрдд рдЖрдореНрд╣реА рд╡рд┐рд▓реАрди рдХрд░рдгреНрдпрд╛рд╕ рдордирд╛рдИ рдХрд░реВ.

рд╣реЗ рдЕрдЧрджреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛ рдЖрд╣реЗ?

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

рдкрд░рд┐рдгрд╛рдореА, рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓:

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

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

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

рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди, рдЪрд╛рдЪрдгреА рднрд╛рдВрдбрд╛рд░рд╛рд╡рд░ рдорд░реНрдЬ рд╡рд┐рдирдВрддреА рдордВрдЬреВрд░реА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВрдпрд╛ myapp:

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

1. API рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЯреЛрдХрди рддрдпрд╛рд░ рдХрд░рд╛

рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ тЖТ рдкреНрд░рд╡реЗрд╢ рдЯреЛрдХрди рд╡рд░ рдЬрд╛ рдЖрдгрд┐ рдЯреЛрдХрди рд▓рд┐рд╣рд╛:

Gitlab CE рдордзреНрдпреЗ рдХреЛрдб рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди: рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рдордВрдЬреВрд░ рдирд╕рд▓реНрдпрд╛рд╕, рдкрд░рдВрддреБ рдорд▓рд╛ рдЦрд░реЛрдЦрд░ рд╣рд╡реЗ рдЖрд╣реЗ

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

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 рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд┐рдВрдЯрд░ рд╡рд╛рдкрд░рд╛
рддреБрдореНрд╣реА рдПрдХрдЯреЗ рдХрд╛рдо рдХрд░рдд рдЕрд╕рд▓реЛ рддрд░реАрд╣реА, MR рджреНрд╡рд╛рд░реЗ рдХрд╛рдо рдХрд░рдгреЗ рд╣реА рдПрдХ рдЪрд╛рдВрдЧрд▓реА рдорджрдд рд╣реЛрдИрд▓, рддреБрдордЪреЗ рд╕рд░реНрд╡ рдмрджрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдлрд╛рдЗрд▓реНрд╕рдордзреНрдпреЗ рдПрдХрд╛ рд▓рд┐рдВрдЯрд░рджреНрд╡рд╛рд░реЗ рдЪрд╛рд▓рд╡рдгреЗ. рддреБрдореНрд╣реА YAML рдлрд╛рдЗрд▓рдЪреНрдпрд╛ рд╕рд┐рдВрдЯреЕрдХреНрд╕рдордзреНрдпреЗ рдЪреВрдХ рдХреЗрд▓реНрдпрд╛рд╕, рддреЗ рддреБрдордЪреА рдЙрддреНрдкрд╛рджрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЦрдВрдбрд┐рдд рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдлрдХреНрдд рдорд░реНрдЬрд▓рд╛ рдмреНрд▓реЙрдХ рдХрд░реЗрд▓.

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

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 рд╕реЗрдЯ рдХрд░рд╛: 0

рдЖрдореНрд╣реА MR рдмрдирд╡рддреЛ рдЖрдгрд┐ "рдирд╛рдкрд╕рдВрддреА" рдЯрд╛рдХрддреЛ.

Gitlab CE рдордзреНрдпреЗ рдХреЛрдб рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди: рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рдордВрдЬреВрд░ рдирд╕рд▓реНрдпрд╛рд╕, рдкрд░рдВрддреБ рдорд▓рд╛ рдЦрд░реЛрдЦрд░ рд╣рд╡реЗ рдЖрд╣реЗ

рдмрд┐рд▓реНрдб рд▓реЙрдЧрдордзреНрдпреЗ:

Gitlab CE рдордзреНрдпреЗ рдХреЛрдб рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди: рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рдордВрдЬреВрд░ рдирд╕рд▓реНрдпрд╛рд╕, рдкрд░рдВрддреБ рдорд▓рд╛ рдЦрд░реЛрдЦрд░ рд╣рд╡реЗ рдЖрд╣реЗ

рдЖрддрд╛ "рд▓рд╛рдЗрдХ" рдареЗрд╡рд╛ рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рддрдкрд╛рд╕рдгреЗ рд╕реБрд░реВ рдХрд░рд╛:

Gitlab CE рдордзреНрдпреЗ рдХреЛрдб рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди: рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рдордВрдЬреВрд░ рдирд╕рд▓реНрдпрд╛рд╕, рдкрд░рдВрддреБ рдорд▓рд╛ рдЦрд░реЛрдЦрд░ рд╣рд╡реЗ рдЖрд╣реЗ

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

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