Gitlab CE เจตเจฟเฉฑเจš เจ•เฉ‹เจก เจธเจฎเฉ€เจ–เจฟเจ†: เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจฎเจฐเจœ เจฌเฉ‡เจจเจคเฉ€ เจฎเจจเจœเจผเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจฎเฉˆเจ‚ เจธเฉฑเจšเจฎเฉเฉฑเจš เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚

Gitlab CE เจตเจฟเฉฑเจš เจ•เฉ‹เจก เจธเจฎเฉ€เจ–เจฟเจ†: เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจฎเจฐเจœ เจฌเฉ‡เจจเจคเฉ€ เจฎเจจเจœเจผเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจฎเฉˆเจ‚ เจธเฉฑเจšเจฎเฉเฉฑเจš เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚

เจธเจญ เจคเฉ‹เจ‚ เจœเจผเจฐเฉ‚เจฐเฉ€ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจœเฉ‹ GitLab เจฆเฉ‡ เจฎเฉเจซเจค เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจนเฉˆ, เจฒเจพเจœเจผเจฎเฉ€ เจ•เฉ‹เจก เจธเจฎเฉ€เจ–เจฟเจ† เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฎเจฐเจœ เจฌเฉ‡เจจเจคเฉ€ (MR) เจจเฉ‚เฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจœเจผเฉ€เจฐเฉ‹ เจ•เจฐเจจ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจตเฉ‹เจŸ เจชเจพเจ‰เจฃ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจนเฉˆเฅค

เจ…เจธเฉ€เจ‚ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจ–เฉเจฆ เจ•เจฐเจพเจ‚เจ—เฉ‡ - เจ…เจธเฉ€เจ‚ เจฎเจฐเจœ เจจเฉ‚เฉฐ เจ…เจธเจฎเจฐเฉฑเจฅ เจฌเจฃเจพ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจˆ เจกเจฟเจตเฉˆเจฒเจชเจฐ MR เจจเฉ‚เฉฐ "เจฅเฉฐเจฌเจธ เจ…เฉฑเจช" เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเฉ‡เฅค

เจ‡เจน เจธเจญ เจ•เจฟเจ‰เจ‚ เจนเฉˆ?

เจธเจพเจกเฉ€ เจธเฉฐเจธเจฅเจพ GitLab เจฒเจพเจ‡เจธเฉˆเจ‚เจธ เจ–เจฐเฉ€เจฆเจฃ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจฐเฉฑเจ– เจธเจ•เจฆเฉ€ เจนเฉˆเฅค เจชเจฐ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจตเจฟเจ•เจพเจธ เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจฆเฉ€ เจชเจนเฉเฉฐเจš เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ‡เฉฑเจ• เจฌเฉฐเจฆ เจฒเฉ‚เจช เจตเจฟเฉฑเจš เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจธเจ–เจค เจฌเจœเจŸ เจฏเฉ‹เจœเจจเจพ เจนเฉˆ, เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจฆเฉ‡ เจจเจพเจฒ เจธเจตเฉˆ-เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจฒเจพเจ‡เจธเฉˆเจ‚เจธเจพเจ‚ เจฆเฉ€ เจ–เจฐเฉ€เจฆ เจตเจฟเฉฑเจš เจ•เจˆ เจฎเจนเฉ€เจจเฉ‡ เจฒเฉฑเจ— เจธเจ•เจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเฉเจฃ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ.

เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจน เจ•เจฐเจจเจพ เจชเจตเฉ‡เจ—เจพ:

  • เจœเจพเจ‚ เจ•เฉเจ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจฒเจˆ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจฌเฉเจฐเจพเจ‚เจšเจพเจ‚ เจตเจฟเฉฑเจš เจฎเจฟเจฒเจพเจ‰เจฃ 'เจคเฉ‡ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจชเจพเจฌเฉฐเจฆเฉ€ เจฒเจ—เจพเจ“, เจชเจฐ เจซเจฟเจฐ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจฒเจพเจ‰เจฃ เจฆเจพ เจ…เจงเจฟเจ•เจพเจฐ เจนเฉˆ, เจฌเฉ‹เจจเจธ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฆเฉ‚เจœเฉ‡ เจฒเฉ‹เจ•เจพเจ‚ เจฆเฉ‡ MRs เจจเฉ‚เฉฐ เจฎเจฟเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจตเจฟเจตเจพเจฆ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเจจ;
  • เจœเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเจฟเจจเจพเจ‚ เจ•เฉ‹เจก เจธเจฎเฉ€เจ–เจฟเจ† เจฆเฉ‡ เจ†เจชเจฃเฉ€ เจฎเจพเจธเจŸเจฐ เจฌเฉเจฐเจพเจ‚เจš เจจเจพเจฒ เจฌเฉ‡เจ•เจพเจฌเฉ‚ เจ…เจญเฉ‡เจฆ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจญเจพเจตเฉ‡เจ‚ เจ‡เจน เจ‡เฉฑเจ• เจœเฉ‚เจจเฉ€เจ…เจฐ เจนเฉˆ เจœเฉ‹ เจ•เฉฑเจฒเฉเจน เจนเฉ€ เจธเฉˆเจŸเจฒ เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค

เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจœเฉ‹ เจฎเฉˆเจ‚ เจ•เฉ€เจคเจพ เจ‰เจน เจ—เฉ‚เจ—เจฒ 'เจคเฉ‡ เจœเจพ เจฐเจฟเจนเจพ เจธเฉ€, เจ‡เจน เจตเจฟเจธเจผเจตเจพเจธ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เจฟ เจ•เจฟเจธเฉ‡ เจจเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ•เฉเจ เจ…เจœเจฟเจนเจพ เจ•เฉ€เจคเจพ เจนเฉˆ (เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเฉ‹เจงเฉ‡ เจฌเจฟเจจเจพเจ‚), เจชเจฐ เจ‡เจน เจชเจคเจพ เจšเจฒเจฟเจ† เจ•เจฟ เจ…เจœเฉ‡ เจคเฉฑเจ• เจ•เจฎเจฟเจŠเจจเจฟเจŸเฉ€ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจ…เจœเจฟเจนเจพ เจ•เฉ‹เจˆ เจฒเจพเจ—เฉ‚ เจจเจนเฉ€เจ‚ เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค

เจ•เฉฐเจฎ เจฆเฉ€ เจ†เจฎ เจธเจ•เฉ€เจฎ

เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡, เจ†เจ“ เจ‡เฉฑเจ• เจŸเฉˆเจธเจŸ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ 'เจคเฉ‡ เจฎเจฐเจœ เจฌเฉ‡เจจเจคเฉ€ เจฎเจจเจœเจผเฉ‚เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเฉˆเจŸ เจ…เจช เจ•เจฐเฉ€เจ 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 เจตเจฟเฉฑเจš เจ•เฉ‹เจก เจธเจฎเฉ€เจ–เจฟเจ†: เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจฎเจฐเจœ เจฌเฉ‡เจจเจคเฉ€ เจฎเจจเจœเจผเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจฎเฉˆเจ‚ เจธเฉฑเจšเจฎเฉเฉฑเจš เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚

เจนเฉเจฃ "like" เจชเจพเจ“ เจ…เจคเฉ‡ เจฆเฉเจฌเจพเจฐเจพ เจœเจพเจ‚เจš เจšเจฒเจพเจ“:

Gitlab CE เจตเจฟเฉฑเจš เจ•เฉ‹เจก เจธเจฎเฉ€เจ–เจฟเจ†: เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจฎเจฐเจœ เจฌเฉ‡เจจเจคเฉ€ เจฎเจจเจœเจผเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจฎเฉˆเจ‚ เจธเฉฑเจšเจฎเฉเฉฑเจš เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹