Gitlab CE-เดฏเดฟเดฒเต† เด•เต‹เดกเต เด…เดตเดฒเต‹เด•เดจเด‚: เดฒเดฏเดจ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เด‚เด—เต€เด•เดพเดฐเด™เตเด™เตพ เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดชเด•เตเดทเต‡ เดŽเดจเดฟเด•เตเด•เต เดถเดฐเดฟเด•เตเด•เตเด‚ เดตเต‡เดฃเด‚

Gitlab CE-เดฏเดฟเดฒเต† เด•เต‹เดกเต เด…เดตเดฒเต‹เด•เดจเด‚: เดฒเดฏเดจ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เด‚เด—เต€เด•เดพเดฐเด™เตเด™เตพ เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดชเด•เตเดทเต‡ เดŽเดจเดฟเด•เตเด•เต เดถเดฐเดฟเด•เตเด•เตเด‚ เดตเต‡เดฃเด‚

GitLab-เดจเตเดฑเต† เดธเต—เดœเดจเตเดฏ เดชเดคเดฟเดชเตเดชเดฟเตฝ เด‡เดฒเตเดฒเดพเดคเตเดค เดเดฑเตเดฑเดตเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฏ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเดฟเตฝ เด’เดจเตเดจเต, เดจเดฟเตผเดฌเดจเตเดงเดฟเดค เด•เต‹เดกเต เด…เดตเดฒเต‹เด•เดจเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เด…เดธเดพเดงเตเดตเดพเด•เตเด•เดฒเดฟเดจเต†เดคเดฟเดฐเต† เดตเต‹เดŸเตเดŸเตเดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดฒเดฏเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจ (MR) เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเดจเตเดฎเตเดณเตเดณ เด•เดดเดฟเดตเดพเดฃเต.

เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดค เดจเดฎเตเด•เตเด•เต เดธเตเดตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเด‚ - เดจเดฟเดฐเดตเดงเดฟ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผ MR-เดจเต เดคเด‚เดฌเตเดธเต เด…เดชเตเดชเต เดจเตฝเด•เตเดจเตเดจเดคเต เดตเดฐเต† เดžเด™เตเด™เตพ เดฒเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเต เดจเดฟเดฐเต‹เดงเดฟเด•เตเด•เตเด‚.

เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด‡เดคเต เดชเต‹เดฒเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดฐเตเดจเตเดจเดคเต?

เด’เดฐเต GitLab เดฒเตˆเดธเตปเดธเต เดตเดพเด™เตเด™เดพเตป เดžเด™เตเด™เดณเตเดŸเต† เดธเตเดฅเดพเดชเดจเดคเตเดคเดฟเดจเต เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เด•เดดเดฟเดฏเตเด‚. เดชเด•เตเดทเต‡, เด‡เตปเดฑเตผเดจเต†เดฑเตเดฑเต เด†เด•เตโ€Œเดธเดธเต เด‡เดฒเตเดฒเดพเดคเต† เด’เดฐเต เด…เดŸเดšเตเดš เดฒเต‚เดชเตเดชเดฟเดฒเดพเดฃเต เดตเดฟเด•เดธเดจเด‚ เดจเดŸเด•เตเด•เตเดจเตเดจเดคเต, เด•เต‚เดŸเดพเดคเต† เด•เตผเดถเดจเดฎเดพเดฏ เดฌเดœเดฑเตเดฑเต เด†เดธเต‚เดคเตเดฐเดฃเด‚ เด‰เดณเตเดณเดคเดฟเดจเดพเตฝ, เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดคเดฏเตเดณเตเดณ เดธเตเดตเดฏเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดค เดฒเตˆเดธเตปเดธเตเด•เตพ เดตเดพเด™เตเด™เตเดจเตเดจเดคเต เดฎเดพเดธเด™เตเด™เดณเต‹เดณเด‚ เดตเดฒเดฟเดšเตเดšเดฟเดŸเดพเด‚, เดชเด•เตเดทเต‡ เด‡เดชเตเดชเต‹เตพ เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เดซเดฒเดฎเดพเดฏเดฟ เดจเดฟเด™เตเด™เตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต:

  • เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดšเดฟเดฒ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เดพเดฏเดฟ เดธเด‚เดฐเด•เตเดทเดฟเดค เดถเดพเด–เด•เดณเดฟเตฝ เดฒเดฏเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดจเดฟเดฐเต‹เดงเดฟเด•เตเด•เตเด•, เดŽเดจเตเดจเดพเตฝ เดชเดฟเดจเตเดจเต€เดŸเต เดฒเดฏเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด…เดตเด•เดพเดถเดฎเตเดณเตเดณ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เต เดฎเดฑเตเดฑเต เด†เดณเตเด•เดณเตเดŸเต† MR-เด•เตพ เดฌเต‹เดฃเดธเดพเดฏเดฟ เดฒเดฏเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดตเตˆเดฐเตเดฆเตเดงเตเดฏเด™เตเด™เตพ เดฒเดญเดฟเด•เตเด•เตเด‚;
  • เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด•เต‹เดกเต เด…เดตเดฒเต‹เด•เดจเด‚ เด•เต‚เดŸเดพเดคเต† เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฎเดพเดธเตเดฑเตเดฑเตผ เดฌเตเดฐเดพเดžเตเดšเตเดฎเดพเดฏเดฟ เด…เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เดฒเดฏเดจเด™เตเด™เตพ เดจเดŸเดคเตเดคเดพเดจเตเดณเตเดณ เด…เดตเดธเดฐเด‚ เดจเตฝเด•เตเด•, เด…เดคเต เด‡เดจเตเดจเดฒเต† เดœเต‹เดฒเดฟเด•เตเด•เต†เดŸเตเดคเตเดค เดœเต‚เดจเดฟเดฏเตผ เด†เดฃเต†เด™เตเด•เดฟเดฒเตเด‚.

เดžเดพเตป เด†เดฆเตเดฏเด‚ เดšเต†เดฏเตเดคเดคเต Google เด†เดฃเต, เด†เดฐเต†เด™เตเด•เดฟเดฒเตเด‚ เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เดธเดฎเดพเดจเดฎเดพเดฏ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ (เด•เต‹เดกเต เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เดพเดคเต†) เด‡เดคเดฟเดจเด•เด‚ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเต เดตเดฟเดถเตเดตเดธเดฟเดšเตเดšเต, เดŽเดจเตเดจเดพเตฝ เด•เดฎเตเดฎเตเดฏเต‚เดฃเดฟเดฑเตเดฑเดฟ เดชเดคเดฟเดชเตเดชเดฟเตฝ เด‡เดคเตเดตเดฐเต† เด…เดคเตเดคเดฐเด‚ เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ เด‡เดฒเตเดฒเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเดฏเดฟ.

เดœเต‹เดฒเดฟเดฏเตเดŸเต† เดชเตŠเดคเต เดชเดฆเตเดงเดคเดฟ

เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ, เด’เดฐเต เดŸเต†เดธเตเดฑเตเดฑเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดฒเดฏเดจ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เด‚เด—เต€เด•เดพเดฐเด™เตเด™เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเดพเด‚ myapp:

  1. GitLab API-เดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตโ€Œเดธเดธเดฟเดจเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดŸเต‹เด•เตเด•เตบ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเด‚ (เด…เดคเดฟเดฒเต‚เดŸเต† "เดจเต‹เดŸเตเดŸเต", "เดŽเดคเดฟเดฐเดพเดฏ" เดตเต‹เดŸเตเดŸเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดตเดฟเดตเดฐเด™เตเด™เตพ เดจเดฎเตเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเด‚)
  2. เดจเดฎเตเด•เตเด•เต GitLab เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดŸเต‹เด•เตเด•เตบ เดšเต‡เตผเด•เตเด•เดพเด‚
  3. เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดพเตฝ เดฒเดฏเดจเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดพเด‚ (เดฎเดคเดฟเดฏเดพเดฏ เด…เดจเตเด•เต‚เดฒ เดตเต‹เดŸเตเดŸเตเด•เตพ เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ)
  4. CI/CD เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดฟ เดตเต‹เดŸเตเดŸเต เดชเดฐเดฟเดถเต‹เดงเดจ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเด‚
  5. เดธเด‚เดฐเด•เตเดทเดฟเดค เดถเดพเด–เด•เดณเดฟเตฝ เด•เดฎเตเดฎเดฟเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดžเด™เตเด™เตพ เดจเดฟเดฐเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต; เดŽเดฒเตเดฒเดพ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตเด‚ MR เดฎเตเด–เต‡เดจ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดตเดฐเตเดคเตเดคเตเดจเตเดจเดคเต
  6. เด…เดตเดธเดพเดจเด‚ เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเดšเตเดšเดคเต†เดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚

1. API เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด’เดฐเต เดŸเต‹เด•เตเด•เตบ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•

เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ โ†’ เด†เด•เตเดธเดธเต เดŸเต‹เด•เตเด•เดฃเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เดŸเต‹เด•เตเด•เตบ เดŽเดดเตเดคเตเด•:

Gitlab CE-เดฏเดฟเดฒเต† เด•เต‹เดกเต เด…เดตเดฒเต‹เด•เดจเด‚: เดฒเดฏเดจ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เด‚เด—เต€เด•เดพเดฐเด™เตเด™เตพ เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดชเด•เตเดทเต‡ เดŽเดจเดฟเด•เตเด•เต เดถเดฐเดฟเด•เตเด•เตเด‚ เดตเต‡เดฃเด‚

เด’เดฐเต เดŸเต‹เด•เตเด•เตบ เดฒเดญเดฟเด•เตเด•เดพเตป เด…เด•เตเด•เต—เดฃเตเดŸเต
เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดจเตเดคเตเด‚ เดšเต†เดฏเตเดฏเดพเตป API เด†เด•เตโ€Œเดธเดธเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเดพเตฝ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• 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 repository - เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ - 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 เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดจเตเดจเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏ เดฎเต‚เดฒเตเดฏเด‚ เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเดคเต "เด‡เดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเตเด•" เดตเดดเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดคเดจเตเดจเต† เดจเดฟเด™เตเด™เดณเตเดŸเต† เดŽเด‚เด†เตผ เด…เด‚เด—เต€เด•เดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ เดŽเดจเตเดจเดพเดฃเต.

เดŸเต†เดธเตเดฑเตเดฑเต เด˜เดŸเตเดŸเด‚ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต, เด…เดคเต "เดฒเตˆเด•เตเด•เตเด•เดณเตเดŸเต†" เดŽเดฃเตเดฃเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต.

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

เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดšเต†เด•เตเด•เต-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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•