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

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

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

рд╣рдо рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡рдпрдВ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рддрдм рддрдХ рдорд░реНрдЬ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдХрдИ рдбреЗрд╡рд▓рдкрд░ MR рдХреЛ "рдердореНрд╕ рдЕрдк" рди рджреЗрдВред

рдРрд╕рд╛ рдмрд┐рд▓реНрдХреБрд▓ рдХреНрдпреЛрдВ рд╣реИ?

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

рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

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

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

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдореЛрджрди рд╕реЗрдЯ рдЕрдк рдХрд░реЗрдВ MyApp:

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

1. рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЛрдХрди рдмрдирд╛рдПрдВ

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдПрдВ тЖТ рдЯреЛрдХрди рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВ рдФрд░ рдЯреЛрдХрди рд▓рд┐рдЦреЗрдВ:

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

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

2. Gitlab рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдореЗрдВ рдЯреЛрдХрди рдЬреЛрдбрд╝реЗрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдорд┐рд▓рд╛ рдерд╛ QmN2Y0NOUFlfeXhvd21ZS01aQzgK

рдУрдкрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ тЖТ рд╕реАрдЖрдИ / рд╕реАрдбреА тЖТ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ тЖТ рд╡реЗрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝реЗрдВ тЖТ GITLAB_TOKEN_FOR_CI

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

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:

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

рдпрд╣ рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рдореВрд╣ рджреЛрдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд░реНрдЬ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╡реЛрдЯ рди рд╣реЛрдиреЗ рдкрд░ рдЕрд╕реЗрдВрдмрд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧреАред

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

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

4. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ

рдпрджрд┐ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕реАрдЖрдИ/рд╕реАрдбреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдирд╣реАрдВ рдмрдирд╛рдИ рд╣реИ
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд░реВрдЯ рдореЗрдВ рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ .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"

рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА
рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП myapp.gitlab-ci.yml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рдЙрди рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдкрд╣реБрдВрдЪ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмрд┐рд▓реНрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдпреБрдХреНрддрд┐: GitLab CI рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЕрдХреЗрд▓реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдПрдордЖрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛, рдЖрдкрдХреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд┐рдВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЪрд▓рд╛рдирд╛ред рдпрджрд┐ рдЖрдк 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 рдореЗрдВ рдХрд┐рддрдиреЗ "рдердореНрд╕ рдЕрдк" рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдЕрдкрдиреЗ рдПрдордЖрд░ рдХреЛ "рдкрд╕рдВрдж" рдХрд░рдХреЗ рдЕрдиреБрдореЛрджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╢рд╛рдорд┐рд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ "рдкрд╕рдВрдж" рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ 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. рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ

рд╣рдо рдЙрди рд╢рд╛рдЦрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ рдПрдордЖрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реА рдЙрди рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реЗрдЯрд┐рдВрдЧ тЖТ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА тЖТ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢рд╛рдЦрд╛рдУрдВ рдкрд░ рдЬрд╛рдПрдБ:

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

6. рдЬрд╛рдБрдЪ рдХрд░рдирд╛

NEED_VOTES рд╕реЗрдЯ рдХрд░реЗрдВ: 0

рд╣рдо рдПрдордЖрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ "рдирд╛рдкрд╕рдВрдж" рдбрд╛рд▓рддреЗ рд╣реИрдВред

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

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

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

рдЕрдм "рд▓рд╛рдЗрдХ" рдбрд╛рд▓реЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЪреЗрдХ рдХрд░реЗрдВ:

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ