GitLab เชจเชพ เชซเซเชฐเซ เชตเชฐเซเชเชจเชฎเชพเช เชจ เชนเซเชฏ เชคเซเชตเซ เชธเซเชฅเซ เชเชฐเซเชฐเซ เชธเซเชตเชฟเชงเชพเชเชฎเชพเชเชจเซ เชเช เชซเชฐเชเชฟเชฏเชพเชค เชเซเชก เชธเชฎเซเชเซเชทเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฎเชฐเซเช เชตเชฟเชจเชเชคเซ (MR) เชจเซ เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชฐเชฟเชชเซเชเซเชเชฐเซเชจเซ เชถเซเชจเซเชฏ เชเชฐเชตเชพ เชธเชพเชฎเซ เชฎเชค เชเชชเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชเซ.
เช
เชฎเซ เชจเซเชฏเซเชจเชคเชฎ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชเชพเชคเซ เชเชฐเซเชถเซเช - เชเซเชฏเชพเช เชธเซเชงเซ เชเชฃเชพ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช MR เชจเซ "เชฅเชฎเซเชฌเซเชธ เช
เชช" เชจ เชเชชเซ เชคเซเชฏเชพเช เชธเซเชงเซ เช
เชฎเซ เชฎเชฐเซเชเชจเซ เช
เชเซเชทเชฎ เชเชฐเซเชถเซเช.
เช เชฌเชงเซเช เชเซเชฎ เชเซ?
เช เชฎเชพเชฐเซ เชธเชเชธเซเชฅเชพ GitLab เชฒเชพเชเชธเชจเซเชธ เชเชฐเซเชฆเชตเชพเชจเซเช เชชเชฐเชตเชกเซ เชถเชเซ เชเซ. เชชเชฐเชเชคเซ, เชเชพเชฐเชฃ เชเซ เชตเชฟเชเชพเชธ เชเชจเซเชเชฐเชจเซเชเชจเซ เชเชเซเชธเซเชธ เชตเชฟเชจเชพ เชฌเชเชง เชฒเซเชชเชฎเชพเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช เชจเซ เชเช เชเชกเช เชฌเชเซเช เชเชฏเซเชเชจ เชเซ, เชเชฐเซเชฐเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชธเชพเชฅเซ เชธเซเชต-เชธเชเชเชพเชฒเชฟเชค เชฒเชพเชเชธเชจเซเชธ เชเชฐเซเชฆเชตเชพเชฎเชพเช เชเชฃเชพ เชฎเชนเชฟเชจเชพเช เชฒเชพเชเซ เชถเชเซ เชเซ, เช เชจเซ เชคเชฎเชพเชฐเซ เชนเชตเซ เชเชพเชฎ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชชเชฐเชฟเชฃเชพเชฎเซ, เชคเชฎเชพเชฐเซ เช เชเชฐเชตเซเช เชชเชกเชถเซ:
- เช เชฅเชตเชพ เชเซเชเชฒเชพเช เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชฎเชพเชเซ เชธเชเชฐเชเซเชทเชฟเชค เชถเชพเชเชพเชเชฎเชพเช เชฎเชฐเซเช เชเชฐเชตเชพ เชชเชฐ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชชเซเชฐเชคเชฟเชฌเชเชง เชฎเซเชเซ เชเซ, เชชเชฐเชเชคเซ เชชเชเซ เชเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเซ เชฎเชฐเซเช เชเชฐเชตเชพเชจเซ เช เชงเชฟเชเชพเชฐ เชเซ เชคเซเช เช เชจเซเชฏ เชฒเซเชเซเชจเชพ เชเชฎเชเชฐเชจเซ เชฌเซเชจเชธ เชคเชฐเซเชเซ เชฎเชฐเซเช เชเชฐเชคเซ เชตเชเชคเซ เชคเชเชฐเชพเชฐ เชฎเซเชณเชตเซ เชเซ;
- เช เชฅเชตเชพ เชคเชฎเชจเซ เชเซเชก เชฐเชฟเชตเซเชฏเซ เชตเชฟเชจเชพ เชคเชฎเชพเชฐเซ เชฎเชพเชธเซเชเชฐ เชฌเซเชฐเชพเชจเซเช เชธเชพเชฅเซ เช เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชฎเชฐเซเช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ, เชชเชเซ เชญเชฒเซ เชคเซ เชเซเชจเชฟเชฏเชฐ เชนเซเชฏ เชเซ เชเชเชเชพเชฒเซ เช เชธเซเชฅเชพเชฏเซ เชฅเชฏเซ เชนเซเชฏ.
เชชเซเชฐเชฅเชฎ เชตเชธเซเชคเซ เชฎเซเช เชเซเชเชฒ เชชเชฐ เชเชเชจเซ เชเชฐเซเชฏเซเช, เชเชตเซเช เชฎเชพเชจเซเชจเซ เชเซ เชเซเชเช เชชเชนเซเชฒเซเชฅเซ เช เชเชเชเช เชเชตเซเช เช เชเชฐเซเชฏเซเช เชเซ (เชเซเชก เชฐเชฟเชซเชพเชเชจ เชเชฐเซเชฏเชพ เชตเชฟเชจเชพ), เชชเชฐเชเชคเซ เชคเซ เชฌเชนเชพเชฐ เชเชตเซเชฏเซเช เชเซ เชเซ เชธเชฎเซเชฆเชพเชฏ เชธเชเชธเซเชเชฐเชฃเชฎเชพเช เชนเชเซ เชธเซเชงเซ เชเชตเซเช เชเซเช เช เชฎเชฒเซเชเชฐเชฃ เชจเชฅเซ.
เชเชพเชฐเซเชฏเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชฏเซเชเชจเชพ
เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเชพเชฒเซ เชเซเชธเซเช เชฐเชฟเชชเซเชเซเชเชฐเซ เชชเชฐ เชฎเชฐเซเช เชตเชฟเชจเชเชคเซ เชฎเชเชเซเชฐเซเช เชธเซเช เชเชฐเซเช
- เชเชพเชฒเซ GitLab API เชจเซ เชเชเซเชธเซเชธ เชเชฐเชตเชพ เชฎเชพเชเซ เชเช เชเซเชเชจ เชฌเชจเชพเชตเซเช (เชคเซเชจเชพ เชฆเซเชตเชพเชฐเชพ เชเชชเชฃเซ เชคเชฐเชซเซเชฃ เช เชจเซ เชตเชฟเชฐเซเชฆเซเชง เชฎเชคเซเชจเซ เชธเชเชเซเชฏเชพ เชตเชฟเชถเซ เชฎเชพเชนเชฟเชคเซ เชชเซเชฐเชพเชชเซเชค เชเชฐเซเชถเซเช)
- GitLab เชเชฒเซเชฎเชพเช เชเซเชเชจ เชเชฎเซเชฐเซ
- เชเซ เชชเชพเชเชชเชฒเชพเชเชจเชฎเชพเช เชญเซเชฒเซ เชนเซเชฏ เชคเซ เชฎเชฐเซเชเชจเซ เช เชเซเชทเชฎ เชเชฐเซ (เชเซ "เชฎเชพเชเซ" เชฎเชค เชชเซเชฐเชคเชพ เชจ เชนเซเชฏ เชคเซ)
- CI/CD เชชเชพเชเชชเชฒเชพเชเชจเชจเชพ เชญเชพเช เชฐเซเชชเซ เชฎเชค เชฎเชพเชจเซเชฏเชคเชพ เชธเซเช เชเชฐเซ
- เช เชฎเซ เชธเชเชฐเชเซเชทเชฟเชค เชถเชพเชเชพเชเชจเซ เชเชฎเชฟเช เชเชฐเชตเชพ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเชเชง เชฎเซเชเซเชถเซเช, เช เชฎเซ เชฌเชงเชพ เชซเซเชฐเชซเชพเชฐเซ เชซเชเซเชค MR เชฆเซเชตเชพเชฐเชพ เช เชเชฐเซเช เชเซเช
- เชเชพเชฒเซ เชคเชชเชพเชธเซเช เชเซ เช เชเชคเซ เชถเซเช เชฅเชฏเซเช
1. API เชจเซ เชเชเซเชธเซเชธ เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชเชจ เชฌเชจเชพเชตเซ
เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชธเซเชเชฟเชเชเซเชธ โ เชเชเซเชธเซเชธ เชเซเชเชจเซเชธ เชชเชฐ เชเชพเช เช เชจเซ เชเซเชเชจ เชฒเชเซ:
เชเซเชเชจ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ เชเชเชพเชเชจเซเช
API เชเชเซเชธเซเชธ เชคเชฎเชจเซ เชคเชฎเชพเชฐเชพ เชฐเชฟเชชเซเชเซเชเชฐเซเช เชธเชพเชฅเซ เชฒเชเชญเช เชเชเชเชชเชฃ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ, เชคเซเชฅเซ เชนเซเช เชคเชฎเชจเซ เชเช เช
เชฒเช เชเชฟเชเชฒเซเชฌ เชเชเชพเชเชจเซเช เชฌเชจเชพเชตเชตเชพเชจเซเช เชธเซเชเชจ เชเชฐเซเช เชเซเช, เชคเซเชจเซ เชคเชฎเชพเชฐเชพ เชฐเชฟเชชเซเชเซเชเชฐเซเช (เชเซเชฎ เชเซ เชฐเชฟเชชเซเชฐเซเชเชฐ) เชฎเชพเชเซ เชจเซเชฏเซเชจเชคเชฎ เช
เชงเชฟเชเชพเชฐเซ เชเชชเซ เช
เชจเซ เชคเซ เชเชเชพเชเชจเซเช เชฎเชพเชเซ เชเซเชเชจ เชฎเซเชณเชตเซ.
2. Gitlab เชตเซเชฐเซเชเชฌเชฒเซเชธเชฎเชพเช เชเซเชเชจ เชเชฎเซเชฐเซ
เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช เชเชพเชเชจเชพ เชชเชเชฒเชพเชฎเชพเช, เช เชฎเชจเซ เชเช เชเซเชเชจ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเช QmN2Y0NOUFlfeXhvd21ZS01aQzgK
เชธเซเชเชฟเชเชเซเชธ เชเซเชฒเซ โ CI/CD โ เชตเซเชฐเซเชเชฌเชฒ โ เชตเซเชฐเซเชเชฌเชฒ เชเชฎเซเชฐเซ โ GITLAB_TOKEN_FOR_CI
เชชเชฐเชฟเชฃเชพเชฎเซ, เช
เชฎเชจเซ เชฎเชณเซ เชเซ:
เช เชเช เชฐเซเชชเซเชเซเชเชฐเซ เช
เชจเซ เชฐเซเชชเซเชเซเชเชฐเซเชเชจเชพ เชเซเชฅ เชชเชฐ เชฌเชเชจเซ เชเชฐเซ เชถเชเชพเชฏ เชเซ.
3. เชเซ เชเซเชก เชธเชฎเซเชเซเชทเชพ เชชเชเซ เชธเชนเชเชฐเซเชฎเซเชเชจเซ เชฎเชเชเซเชฐเซ เชชเซเชฐเชพเชชเซเชค เชจ เชฅเชพเชฏ เชคเซ เช เชฎเซ เชฎเชฐเซเช เชชเชฐ เชชเซเชฐเชคเชฟเชฌเชเชง เชฎเซเชเซเช เชเซเช
เช เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชฎเชฐเซเช เชชเชฐ เชชเซเชฐเชคเชฟเชฌเชเชง เช เชนเชถเซ เชเซ เชเซ เชชเซเชฐเชคเชพ เชฎเชคเซ เชจ เชนเซเชฏ เชคเซ เชเชธเซเชฎเซเชฌเชฒเซ เชชเชพเชเชชเชฒเชพเชเชจ เชญเซเชฒ เชเชชเชถเซ.
เชธเซเชเชฟเชเชเซเชธ โ เชธเชพเชฎเชพเชจเซเชฏ โ เชฎเชฐเซเช เชตเชฟเชจเชเชคเซเช โ เชฎเชฐเซเช เชเซเชเซเชธ เชชเชฐ เชเชพเช เช เชจเซ เชเชธเซเชฎเซเชฌเชฒเซ เชฒเชพเชเชจเซเชธ เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช เชเชพเชฒเชตเซ เชเซเชเช เชคเซ เชตเชฟเชเชฒเซเชชเชจเซ เชธเชเซเชทเชฎ เชเชฐเซ.
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 เชซเชพเชเชฒเชจเชพ เชธเชฟเชจเซเชเซเชเซเชธเชฎเชพเช เชญเซเชฒ เชเชฐเซ เชเซ, เชคเซ เช เชคเชฎเชจเซ เชเชพเชฐเซเชฏเชเชพเชฐเซ เชชเชพเชเชชเชฒเชพเชเชจเชจเซ เชคเซเชกเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชถเซ เชจเชนเซเช, เชชเชฐเชเชคเซ เชซเชเซเชค เชฎเชฐเซเชเชจเซ เช
เชตเชฐเซเชงเชฟเชค เชเชฐเชถเซ.
เชฒเชฟเชจเซเชเชฐเซเชธเชตเชพเชณเชพ เชเชจเซเชเซเชจเชฐเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซ เชเซเชจเซ เชคเชฎเซ เชคเชฎเชพเชฐเซ เชชเชพเชเชชเชฒเชพเชเชจเชฎเชพเช เชเชฎเซเชฌเซเชก เชเชฐเซ เชถเชเซ เชเซ:
เช เชจเซ เชฎเชพเชจเซเชฏเชคเชพ เชคเชฌเชเซเชเชพเชจเซเช เชเชฆเชพเชนเชฐเชฃ:
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 เชฆเซเชตเชพเชฐเชพ เช เชเชพเชฎ เชเชฐเซ เชถเชเชพเชฏ เชเซ.
เช เชเชฐเชตเชพ เชฎเชพเชเซ, เชธเซเชเชฟเชเชเซเชธ โ เชฐเชฟเชชเซเชเซเชเชฐเซ โ เชธเชเชฐเชเซเชทเชฟเชค เชถเชพเชเชพเช เชชเชฐ เชเชพเช:
6. เชคเชชเชพเชธเซ เชฐเชนเซเชฏเซเช เชเซ
NEED_VOTES เชธเซเช เชเชฐเซ: 0
เช เชฎเซ MR เชเชฐเซเช เชเซเช เช เชจเซ "เชจเชพเชชเชธเชเชฆ" เชฎเซเชเซเช เชเซเช.
เชฌเชฟเชฒเซเชก เชฒเซเชเชฎเชพเช:
เชนเชตเซ "เชฒเชพเชเช" เชฎเซเชเซ เช
เชจเซ เชซเชฐเซเชฅเซ เชคเชชเชพเชธ เชเชฒเชพเชตเซ:
เชธเซเชฐเซเชธ: www.habr.com