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 เชฎเชพเช‚ เช•เซ‹เชก เชธเชฎเซ€เช•เซเชทเชพ: เชœเซ‹ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชฎเช‚เชœเซ‚เชฐเซ€เช“ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ เชˆเชšเซเช›เซเช‚ เช›เซเช‚

เชŸเซ‹เช•เชจ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชเช•เชพเช‰เชจเซเชŸ
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/.*$/'

เชคเชชเชพเชธ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชงเซ เชœเชพเชฃเซ‹:

  • เชชเซเชฐเชคเชฟเชฌเช‚เชง เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡ เช•เซ‡ เชšเซ‡เช• เชฎเชพเชคเซเชฐ เชคเซเชฏเชพเชฐเซ‡ เชœ เชฅเชถเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชฎเชพเชธเซเชŸเชฐ เช…เชฅเชตเชพ เชฐเซ€เชฒเซ€เช /* เชถเชพเช–เชพเช“เชฎเชพเช‚ MR เชฌเชจเชพเชตเชถเซ‹
  • GitLab API เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, "เชชเชธเช‚เชฆ" เช…เชจเซ‡ "เชจเชพเชชเชธเช‚เชฆ" เชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฎเซ‡เชณเชตเซ‹
  • เชนเช•เชพเชฐเชพเชคเซเชฎเช• เช…เชจเซ‡ เชจเช•เชพเชฐเชพเชคเซเชฎเช• เชชเซเชฐเชคเชฟเชญเชพเชตเซ‹ เชตเชšเซเชšเซ‡เชจเชพ เชคเชซเชพเชตเชคเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‹
  • เชœเซ‹ เชคเชซเชพเชตเชค เช…เชฎเซ‡ NEED_VOTES เชฎเชพเช‚ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒ เชฎเซ‚เชฒเซเชฏ เช•เชฐเชคเชพ เช“เช›เซ‹ เชนเซ‹เชฏ, เชคเซ‹ เช…เชฎเซ‡ เชฎเชฐเซเชœ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพเชจเซ‡ เช…เชตเชฐเซ‹เชงเชฟเชค เช•เชฐเซ€เช เช›เซ€เช

5. เชธเช‚เชฐเช•เซเชทเชฟเชค เชถเชพเช–เชพเช“ เชฎเชพเชŸเซ‡ เช•เชฎเชฟเชŸเซเชธเชจเซ‡ เช…เช•เซเชทเชฎ เช•เชฐเซ‹

เช…เชฎเซ‡ เชคเซ‡ เชถเชพเช–เชพเช“ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เช•เชฐเซ€เช เช›เซ€เช เช•เซ‡ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเซ‡ เช•เซ‹เชก เชธเชฎเซ€เช•เซเชทเชพ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช เช…เชจเซ‡ เชธเซ‚เชšเชตเซ€เช เช›เซ€เช เช•เซ‡ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เชซเช•เซเชค MR เชฆเซเชตเชพเชฐเชพ เชœ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชธเซ‡เชŸเชฟเช‚เช—เซเชธ โ†’ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ โ†’ เชธเช‚เชฐเช•เซเชทเชฟเชค เชถเชพเช–เชพเช“ เชชเชฐ เชœเชพเช“:

Gitlab CE เชฎเชพเช‚ เช•เซ‹เชก เชธเชฎเซ€เช•เซเชทเชพ: เชœเซ‹ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชฎเช‚เชœเซ‚เชฐเซ€เช“ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ เชˆเชšเซเช›เซเช‚ เช›เซเช‚

6. เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

NEED_VOTES เชธเซ‡เชŸ เช•เชฐเซ‹: 0

เช…เชฎเซ‡ MR เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ "เชจเชพเชชเชธเช‚เชฆ" เชฎเซ‚เช•เซ€เช เช›เซ€เช.

Gitlab CE เชฎเชพเช‚ เช•เซ‹เชก เชธเชฎเซ€เช•เซเชทเชพ: เชœเซ‹ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชฎเช‚เชœเซ‚เชฐเซ€เช“ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ เชˆเชšเซเช›เซเช‚ เช›เซเช‚

เชฌเชฟเชฒเซเชก เชฒเซ‹เช—เชฎเชพเช‚:

Gitlab CE เชฎเชพเช‚ เช•เซ‹เชก เชธเชฎเซ€เช•เซเชทเชพ: เชœเซ‹ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชฎเช‚เชœเซ‚เชฐเซ€เช“ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ เชˆเชšเซเช›เซเช‚ เช›เซเช‚

เชนเชตเซ‡ "เชฒเชพเช‡เช•" เชฎเซ‚เช•เซ‹ เช…เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชคเชชเชพเชธ เชšเชฒเชพเชตเซ‹:

Gitlab CE เชฎเชพเช‚ เช•เซ‹เชก เชธเชฎเซ€เช•เซเชทเชพ: เชœเซ‹ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชฎเช‚เชœเซ‚เชฐเซ€เช“ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ เชˆเชšเซเช›เซเช‚ เช›เซเช‚

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹