เช เชฒเซเช เชเชพเชตเชพ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชฎเชพเชเซ เชฌเชจเชพเชตเชพเชฏเซเชฒ เชเซ เชเซเชฎเชฃเซ เชเชฟเชเชฒเซเชฌเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชฎเชจเชพ เชเชคเซเชชเชพเชฆเชจเซเชจเซ เชธเซเชจเชพเชเชพเชเชช เช เชจเซ/เช เชฅเชตเชพ เชฎเซเชตเซเชจ เชธเซเชจเซเชเซเชฐเชฒ เชฐเชฟเชชเซเชเซเชเชฐเซเชเชฎเชพเช เชเชกเชชเชฅเซ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เช เชฒเซเชเชฎเชพเช, เชนเซเช เช เชธเชฎเชธเซเชฏเชพเชจเซ เชเชเซเชฒเชตเชพ เชฎเชพเชเซ gitlab-runner, gitlab-ci เช เชจเซ maven-plugin เชธเซเช เชเชฐเชตเชพ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซเชถ.
เชชเซเชฐเซเชตเชเชฐเซเชฐเซเชฏเชพเชคเซ:
- mvn เช เชจเซ GPG เชเซเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชธเชเชเซเชฐเชน.
- เชเชพเชนเซเชฐ CI เชเชพเชฐเซเชฏเซเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เช เชฎเชฒ.
- เชธเชพเชฐเซเชตเชเชจเชฟเช เชญเชเชกเชพเชฐเซเชฎเชพเช เชเชฒเชพเชเซเชคเชฟเช (เชชเซเชฐเชเชพเชถเชจ/เชธเซเชจเซเชชเชถเซเช) เช เชชเชฒเซเชก เชเชฐเชตเซ.
- เชฎเซเชตเซเชจ เชธเซเชจเซเชเซเชฐเชฒเชฎเชพเช เชชเซเชฐเชเชพเชถเชจ เชฎเชพเชเซ เชชเซเชฐเชเชพเชถเชจ เชธเชเชธเซเชเชฐเชฃเซเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชคเชชเชพเชธ.
- เชฌเชนเซเชตเชฟเชง เชชเซเชฐเซเชเซเชเซเชเซเชธ เชฎเชพเชเซ เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชเชฐเซเชเชฟเชซเซเชเซเชเซเชธ เช เชชเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชเชเซเชฒ.
- เชธเชฐเชณเชคเชพ เช เชจเซ เชเชชเชฏเซเชเชฎเชพเช เชธเชฐเชณเชคเชพ.
เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ
เชธเชพเชฎเชพเชจเซเชฏ เชเชพเชฃเชเชพเชฐเซ GitLab เชฎเชพเช เชกเชฟเชชเซเชฒเซเชฏ เชชเซเชฐเซเชเซเชเซเช เชธเซเช เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช GitLab เชฐเชจเชฐ เชเชฟเชเชฒเซเชฌ เชธเซ.เชเช. pom.xml เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชชเชฐเชฟเชฃเชพเชฎ เชจเชฟเชทเซเชเชฐเซเชท
เชธเชพเชฎเชพเชจเซเชฏ เชเชพเชฃเชเชพเชฐเซ
- เชธเซเชจเชพเชเชพเชเชช เชเชเชธเชเชธ เชฐเชฟเชชเซเชเซเชเชฐเซ เชนเซเชธเซเชเชฟเชเช เชธเซเชตเชพ เชฆเซเชตเชพเชฐเชพ เชฎเซเชตเซเชจ เชธเซเชจเซเชเซเชฐเชฒ เชชเชฐ เชเชฒเชพเชเซเชคเชฟเช เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเชพเชจเซ เชชเชฆเซเชงเชคเชฟเชจเซเช เชตเชฟเชเชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เชชเชนเซเชฒเซเชฅเซ เช เชตเชฐเซเชฃเชตเซเชฒ เชเซ.
เช เชฒเซเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชเซเชเซเชฒเชชเซเชฒเซเชเซเชธ , เชคเซเชฅเซ เชนเซเช เชฏเซเชเซเชฏ เชธเซเชฅเชณเซเช เช เชฒเซเชเชจเซ เชธเชเชฆเชฐเซเชญ เชฒเชเชถ. - เชชเชฐ เชชเซเชฐเซเชต-เชจเซเชเชงเชฃเซ เชเชฐเซ
เชธเซเชจเชพเชเชพเชเชช เชเซเชฐเชพ เช เชจเซ เชฐเชฟเชชเซเชเซเชเชฐเซ เชเซเชฒเชตเชพ เชฎเชพเชเซ เชเชฟเชเชฟเช เชถเชฐเซ เชเชฐเซ (เชตเชงเซ เชตเชฟเชเชคเซ เชฎเชพเชเซ, เชตเชฟเชญเชพเช เชตเชพเชเชเซSonatype JIRA เชเชฟเชเชฟเช เชฌเชจเชพเชตเซ ). เชฐเชฟเชชเซเชเซเชเชฐเซ เชเซเชฒเซเชฏเชพ เชชเชเซ, JIRA เชฒเซเชเชฟเชจ/เชชเชพเชธเชตเชฐเซเชก เชเซเชกเซ (เชคเซเชฏเชพเชฐเชฌเชพเชฆ Sonatype เชเชเชพเชเชจเซเช เชคเชฐเซเชเซ เชเชณเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ) เชจเซ เชเชชเชฏเซเช Sonatype เชจเซเชเซเชธเชธ เชชเชฐ เชเชฐเซเชเชฟเชซเซเชเซเช เช เชชเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. - เชเชเชณ, GPG เชเซ เชเชจเชฐเซเช เชเชฐเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเซเชฌ เช เชถเซเชทเซเช เชฐเซเชคเซ เชตเชฐเซเชฃเชตเซเชฒ เชเซ. เชตเชงเซ เชตเชฟเชเชคเซ เชฎเชพเชเซ เชตเชฟเชญเชพเช เชเซเช.
เชเชฐเซเชเชฟเชซเซเชเซเช เชชเชฐ เชธเชนเซ เชเชฐเชตเชพ เชฎเชพเชเซ GnuPG เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช - เชเซ เชคเชฎเซ GPG เชเซ (gnupg/gnupg2) เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ Linux เชเชจเซเชธเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซ, เชคเซ เชคเชฎเชพเชฐเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชเชฐเชเชจเชเซ-เชธเชพเชงเชจเซ เชเชจเซเชเซเชฐเซเชชเซ เชเชจเชฐเซเช เชเชฐเชตเชพ เชฎเชพเชเซ. เชจเชนเชฟเชเชคเชฐ, เชเซ เชเชจเชฐเซเชถเชจเชฎเชพเช เชเชฃเซ เชธเชฎเชฏ เชฒเชพเชเซ เชถเชเซ เชเซ. - เชธเชเชเซเชฐเชน เชธเซเชตเชพเช เชเชพเชนเซเชฐ GPG เชเซเช
http://keys.gnupg.net http://pool.sks-keyservers.net http://keyserver.ubuntu.com
GitLab เชฎเชพเช เชกเชฟเชชเซเชฒเซเชฏ เชชเซเชฐเซเชเซเชเซเช เชธเซเช เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
- เชธเซ เชชเซเชฐเชฅเชฎ, เชคเชฎเชพเชฐเซ เชเช เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชตเชพเชจเซ เช
เชจเซ เชเซเช เชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซเชฎเชพเช เชเชฒเชพเชเซเชคเชฟเชเชจเซ เชเชฎเชพเชตเช เชฎเชพเชเซ เชชเชพเชเชชเชฒเชพเชเชจ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชฎเซเช เชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชเซเชเชจเซ เชธเชฐเชณ เช
เชจเซ เชเชเชฟเชฒ เชเชนเซเชฏเซ -
เชเชฎเชพเชตเชตเซเช - เชฐเซเชชเซเชเซเชเชฐเซ เชฌเชจเชพเชตเซเชฏเชพ เชชเชเซ, เชคเชฎเชพเชฐเซ เชฐเซเชชเซเชเซเชเชฐเซเชจเซ เชธเชเชถเซเชงเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชเชเซเชธเซเชธเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชชเซเชฐเซเชเซเชเซเช -> เชธเซเชเชฟเชเชเซเชธ -> เชฐเซเชชเซเชเซเชเชฐเซ -> เชธเซเชฐเชเซเชทเชฟเชค เชถเชพเชเชพเช เชชเชฐ เชเชพเช. เช เชฎเซ เชฌเชงเชพ เชจเชฟเชฏเชฎเซ เชเชพเชขเซ เชจเชพเชเซเช เชเซเช เช เชจเซ เชตเชพเชเชฒเซเชกเชเชพเชฐเซเชก เชธเชพเชฅเซ เชเช เชจเชฟเชฏเชฎ เชเชฎเซเชฐเซเช เชเซเช * เชฆเชฌเชพเชฃ เช เชจเซ เชฎเชฐเซเช เชเชฐเชตเชพเชจเชพ เช เชงเชฟเชเชพเชฐ เชธเชพเชฅเซ เชฎเชพเชคเซเชฐ เชเชพเชณเชตเชฃเซเชจเซ เชญเซเชฎเชฟเชเชพ เชงเชฐเชพเชตเชคเชพ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชฎเชพเชเซ. เช เชจเชฟเชฏเชฎ เช เชชเซเชฐเซเชเซเชเซเช เช เชจเซ เชเซ เชเซเชฅเชจเซ เช เชชเซเชฐเซเชเซเชเซเช เชเซ เชคเซเชจเชพ เชคเชฎเชพเชฎ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชฎเชพเชเซ เชเชพเชฎ เชเชฐเชถเซ.
- เชเซ เชคเซเชฏเชพเช เชเชฃเชพ เชเชพเชณเชตเชฃเซเชเชพเชฐเซ เชเซ, เชคเซ เชถเซเชฐเซเชทเซเช เชเชเซเชฒ เช เชเซ เชเซ เชธเซเชฆเซเชงเชพเชเชคเชฟเช เชฐเซเชคเซ เชชเซเชฐเซเชเซเชเซเชเชจเซ เชเชเซเชธเซเชธเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเชตเซ.
เชชเซเชฐเซเชเซเชเซเช เชชเชฐ เชเชพเช -> เชธเซเชเชฟเชเชเซเชธ -> เชธเชพเชฎเชพเชจเซเชฏ -> เชฆเซเชถเซเชฏเชคเชพ, เชชเซเชฐเซเชเซเชเซเช เชธเซเชตเชฟเชงเชพเช, เชชเชฐเชตเชพเชจเชเซเช เช เชจเซ เชชเซเชฐเซเชเซเชเซเช เชฆเซเชถเซเชฏเชคเชพ เชธเซเช เชเชฐเซ เชเชพเชจเชเซ.
เชฎเชพเชฐเซ เชชเชพเชธเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเชเซเชธเซเชธเชฎเชพเช เชเช เชชเซเชฐเซเชเซเชเซเช เชเซ, เชเชพเชฐเชฃ เชเซ เชนเซเช เชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชเชฟเชเชฒเซเชฌ เชฐเชจเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช เช เชจเซ เชฎเชพเชคเซเชฐ เชฎเชพเชฐเซ เชชเชพเชธเซ เชฐเซเชชเซเชเซเชเชฐเซเชจเซ เชธเชเชถเซเชงเชฟเชค เชเชฐเชตเชพเชจเซ เชเชเซเชธเซเชธ เชเซ. เชธเชพเชฐเซเชตเชเชจเชฟเช เชชเชพเชเชชเชฒเชพเชเชจ เชฒเซเชเชฎเชพเช เชเชพเชจเชเซ เชฎเชพเชนเชฟเชคเซ เชฆเชฐเซเชถเชพเชตเชตเซ เชเชฐเซเชเชฐ เชฎเชพเชฐเชพ เชนเชฟเชคเชฎเชพเช เชจเชฅเซ. - เชฐเชฟเชชเซเชเซเชเชฐเซ เชฌเชฆเชฒเชตเชพ เชฎเชพเชเซเชจเชพ เชจเชฟเชฏเชฎเซเชจเซ เชเชกเช เชฌเชจเชพเชตเชตเซเช
เชชเซเชฐเซเชเซเชเซเช เชชเชฐ เชเชพเช -> เชธเซเชเชฟเชเชเซเชธ -> เชฐเซเชชเซเชเซเชเชฐเซ -> เชชเซเชถ เชจเชฟเชฏเชฎเซ เช เชจเซ เชซเซเชฒเซเชเซเชธ เชเชฎเชฟเชเชฐ เชชเซเชฐเชคเชฟเชฌเชเชง เชธเซเช เชเชฐเซ, เชคเชชเชพเชธเซ เชเซ เชฒเซเชเช เชเชฟเชเชฒเซเชฌ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเซ เชเซ เชเซเชฎ. เชนเซเช เชธเซเชเชฟเชเชเชจเซ เชชเชฃ เชญเชฒเชพเชฎเชฃ เชเชฐเซเช เชเซเชเชธเชนเซ เชเชฐเชตเชพเชจเซเช เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เชเชฐเซ , เช เชจเซ เช เชธเซเชตเซเชเชพเชฐเชฟเชค เชเชฎเชฟเช เชงเซเชตเช เชธเซเช เชเชฐเซ. - เชเชเชณ, เชคเชฎเชพเชฐเซ เชเชพเชฐเซเชฏเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชเซเชฐเชฟเชเชฐเชจเซ เชเซเช เชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ
เชชเซเชฐเซเชเซเชเซเช -> เชธเซเชเชฟเชเชเซเชธ -> CI / CD -> เชชเชพเชเชชเชฒเชพเชเชจ เชเซเชฐเชฟเชเชฐเซเชธ เชชเชฐ เชเชพเช เช เชจเซ เชจเชตเซเช เชเซเชฐเชฟเชเชฐ-เชเซเชเชจ เชฌเชจเชพเชตเซ
เช เชเซเชเชจ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชเซเชฅ เชฎเชพเชเซ เชเชฒเซเชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชชเชฐเซเชเชพเชเชเชจเชฎเชพเช เชคเชฐเชค เช เชเชฎเซเชฐเซ เชถเชเชพเชฏ เชเซ.
เชเซเชฅ -> เชธเซเชเชฟเชเชเซเชธ -> CI / CD -> เชตเซเชฐเซเชเชฌเชฒ เชชเชฐ เชเชพเช เช เชจเซ เชเชฒ เชเชฎเซเชฐเซDEPLOY_TOKEN
เชฎเซเชฒเซเชฏเชฎเชพเช เชเซเชฐเชฟเชเชฐ-เชเซเชเชจ เชธเชพเชฅเซ.
GitLab เชฐเชจเชฐ
เช เชตเชฟเชญเชพเช เชฎเซเชณ (เชตเชฟเชถเชฟเชทเซเช) เช เชจเซ เชธเชพเชฐเซเชตเชเชจเชฟเช (เชถเซเชฐเซเชก) เชฐเชจเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฎเชพเชตเช เชชเชฐ เชเชพเชฐเซเชฏเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซเชจเชพ เชฐเซเชชเชฐเซเชเชพเชเชเชจเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ.
เชเซเชเซเชเชธ เชฐเชจเชฐ
เชนเซเช เชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชฆเซเชกเชตเซเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช, เชเชพเชฐเชฃ เชเซ เชธเซ เชชเซเชฐเชฅเชฎ เชคเซ เช
เชจเซเชเซเชณ, เชเชกเชชเซ, เชธเชธเซเชคเซเช เชเซ.
เชฐเชจเชฐ เชฎเชพเชเซ เชนเซเช 1 CPU, 2 GB RAM, 20 GB HDD เชธเชพเชฅเซ Linux VDS เชจเซ เชญเชฒเชพเชฎเชฃ เชเชฐเซเช เชเซเช. เชเชถเซเชฏเซ เชเชฟเชเชฎเชค ~ 3000โฝ เชชเซเชฐเชคเชฟ เชตเชฐเซเชท.
เชฎเชพเชฐเชพ เชฆเซเชกเชตเซเชฐ
เชฆเซเชกเชตเซเชฐ เชฎเชพเชเซ เชฎเซเช VDS 4 CPU, 4 GB RAM, 50 GB SSD เชฒเซเชงเซเช. เชคเซเชจเซ เชเชฟเชเชฎเชค ~11000โฝ เชเซ เช
เชจเซ เชคเซเชจเซ เชเซเชฏเชพเชฐเซเชฏ เช
เชซเชธเซเชธ เชฅเชฏเซ เชจเชฅเซ.
เชฎเชพเชฐเซ เชชเชพเชธเซ เชเซเชฒ 7 เชฎเชถเซเชจเซ เชเซ. เช
เชฐเซเชฌเชพ เชชเชฐ 5 เช
เชจเซ ihor เชชเชฐ 2.
เชคเซเชฅเซ, เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชฆเซเชกเชตเซเชฐ เชเซ. เชนเชตเซ เช
เชฎเซ เชคเซเชจเซ เชธเซเช เชเชฐเซเชถเซเช.
เช
เชฎเซ SSH เชฆเซเชตเชพเชฐเชพ เชฎเชถเซเชจ เชชเชฐ เชเชเช เชเซเช เช
เชจเซ java, git, maven, gnupg2 เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเช เชเซเช.
เชเชฟเชเชฒเซเชฌ เชฐเชจเชฐ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
- เชจเชตเซเช เชเซเชฅ เชฌเชจเชพเชตเซ
runner
sudo groupadd runner
- เชฎเซเชตเซเชจ เชเซเชถ เชฎเชพเชเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเชพเชตเซ เช
เชจเซ เชเซเชฅ เช
เชงเชฟเชเชพเชฐเซ เชธเซเชเชชเซ
runner
เชเซ เชคเชฎเซ เชเช เช เชฎเชถเซเชจ เชชเชฐ เชฌเชนเซเชตเชฟเชง เชฆเซเชกเชตเซเชฐเซเชจเซ เชเชฒเชพเชตเชตเชพเชจเซเช เชเชฏเซเชเชจ เชจ เชเชฐเชคเชพ เชนเซเชต เชคเซ เชคเชฎเซ เช เชชเชเชฒเซเช เชเซเชกเซ เชถเชเซ เชเซ.mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache
- เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฌเชจเชพเชตเซ
gitlab-deployer
เช เชจเซ เชเซเชฅเชฎเชพเช เชเชฎเซเชฐเซrunner
useradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer
- เชซเชพเชเชฒเชฎเชพเช เชเชฎเซเชฐเซ
/etc/ssh/sshd_config
เชเชเชฒเซ เชชเชเชเซเชคเชฟAllowUsers root@* [email protected]
- เชฐเซเชฌเซเช เชเชฐเซ
sshd
systemctl restart sshd
- เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฎเชพเชเซ เชชเชพเชธเชตเชฐเซเชก เชธเซเช เชเชฐเซ
gitlab-deployer
(เชคเซ เชธเชฐเชณ เชนเซเช เชถเชเซ เชเซ, เชเชพเชฐเชฃ เชเซ เชฒเซเชเชฒเชนเซเชธเซเช เชฎเชพเชเซ เชชเซเชฐเชคเชฟเชฌเชเชง เชเซ)passwd gitlab-deployer
- GitLab เชฐเชจเชฐ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ (Linux x86-64)
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 sudo chmod +x /usr/local/bin/gitlab-runner ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner
- gitlab.com เชชเชฐ เชเชพเช -> deploy-project -> Settings -> CI/CD -> เชฐเชจเชฐเซเชธ -> เชเซเชเซเชเชธ เชฐเชจเชฐเซเชธ เช เชจเซ เชฐเชเซเชธเซเชเซเชฐเซเชถเชจ เชเซเชเชจ เชเซเชชเซ เชเชฐเซ
เชธเซเชเซเชฐเซเชจ
- เชฆเซเชกเชตเซเชฐเชจเซ เชจเซเชเชงเชฃเซ
gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml
ะัะพัะตัั
Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
REGISTRATION_TOKEN
Please enter the gitlab-ci description for this runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
Registering runner... succeeded runner=ZvKdjJhx
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
- เชคเชชเชพเชธเซ เชเซ เชฆเซเชกเชตเซเชฐ เชจเซเชเชงเชพเชฏเซเชฒ เชเซ. gitlab.com เชชเชฐ เชเชพเช -> deploy-project -> Settings -> CI/CD -> เชฐเชจเชฐเซเชธ -> เชเซเชเซเชเชธ เชฆเซเชกเชตเซเชฐเซ -> เช เชชเซเชฐเซเชเซเชเซเช เชฎเชพเชเซ เชธเชเซเชฐเชฟเชฏ เชเชฐเชพเชฏเซเชฒเชพ เชฆเซเชกเชตเซเชฐเซ
เชธเซเชเซเชฐเซเชจ
- เชเชฎเซเชฐเซ เช
เชฒเช เชธเซเชตเชพ
/etc/systemd/system/gitlab-deployer.service
[Unit] Description=GitLab Deploy Runner After=syslog.target network.target ConditionFileIsExecutable=/usr/local/bin/gitlab-runner [Service] StartLimitInterval=5 StartLimitBurst=10 ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer" Restart=always RestartSec=120 [Install] WantedBy=multi-user.target
- เช
เชฎเซ เชธเซเชตเชพ เชถเชฐเซ เชเชฐเซเช เชเซเช.
systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service
- เชคเชชเชพเชธเซ เชเซ เชฆเซเชกเชตเซเชฐ เชเชพเชฒเซ เชฐเชนเซเชฏเซ เชเซ.
เชเชฆเชพเชนเชฐเชฃ:
GPG เชเซ เชเชจเชฐเซเชถเชจ
-
เช เช เชฎเชถเซเชจเชฎเชพเชเชฅเซ เชเชชเชฃเซ เชฏเซเชเชฐ เชนเซเช เชณ ssh เชฎเชพเชฐเชซเชคเซ เชเชเช เชเซเช
gitlab-deployer
(เช GPG เชเซ เชเชจเชฐเซเชถเชจ เชฎเชพเชเซ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ)ssh [email protected]
-
เช เชฎเซ เชชเซเชฐเชถเซเชจเซเชจเชพ เชเชตเชพเชฌ เชเชชเซเชจเซ เชเซ เชเชจเชฐเซเช เชเชฐเซเช เชเซเช. เชฎเซเช เชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชจเชพเชฎ เช เชจเซ เชเชฎเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ.
เชเซ เชฎเชพเชเซ เชชเชพเชธเชตเชฐเซเชก เชธเซเชชเชทเซเช เชเชฐเชตเชพเชจเซ เชเชพเชคเชฐเซ เชเชฐเซ. เช เชเซ เชตเชกเซ เชเชฒเชพเชเซเชคเชฟเช เชชเชฐ เชนเชธเซเชคเชพเชเซเชทเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ.gpg --gen-key
-
เชคเชชเชพเชธเชตเซเช
gpg --list-keys -a /home/gitlab-deployer/.gnupg/pubring.gpg ---------------------------------------- pub 4096R/00000000 2019-04-19 uid Petruha Petrov <[email protected]> sub 4096R/11111111 2019-04-19
-
เชเซเชธเชฐเซเชตเชฐ เชชเชฐ เช เชฎเชพเชฐเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซ เช เชชเชฒเซเชก เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซเช
gpg --keyserver keys.gnupg.net --send-key 00000000 gpg: sending key 00000000 to hkp server keys.gnupg.net
เชฎเซเชตเชจ เชธเซเชเช เชช
- เช
เชฎเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชนเซเช เชณ เชเชพเช
gitlab-deployer
su gitlab-deployer
- เชฎเซเชตเชจ เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเชพเชตเซ เชฐเซเชชเซเชเซเชเชฐเซ เช
เชจเซ เชเซเชถ เชธเชพเชฅเซ เชฒเชฟเชเช เชเชฐเซ (เชเซเช เชญเซเชฒ เชเชฐเชถเซ เชจเชนเซเช)
เชเซ เชคเชฎเซ เชเช เช เชฎเชถเซเชจ เชชเชฐ เชเชฃเชพ เชฆเซเชกเชตเซเชฐเซเชจเซ เชเชฒเชพเชตเชตเชพเชจเซ เชฏเซเชเชจเชพ เชจ เชเชฐเซ เชคเซ เช เชชเชเชฒเซเช เชเซเชกเซ เชถเชเชพเชฏ เชเซ.mkdir -p ~/.m2/repository ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
- เชเช เชฎเชพเชธเซเชเชฐ เชเซ เชฌเชจเชพเชตเซ
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
- ~/.m2/settings-security.xml เชซเชพเชเชฒ เชฌเชจเชพเชตเซ
<settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity>
- Sonatype เชเชเชพเชเชจเซเชเชฎเชพเชเชฅเซ เชชเชพเชธเชตเชฐเซเชก เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
- ~/.m2/settings.xml เชซเชพเชเชฒ เชฌเชจเชพเชตเซ
<settings> <profiles> <profile> <id>env</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase> </properties> </profile> </profiles> <servers> <server> <id>sonatype</id> <username>SONATYPE_USERNAME</username> <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password> </server> </servers> </settings>
เชเซเชฏเชพเช,
GPG_SECRET_KEY_PASSPHRASE - GPG เชเซ เชชเชพเชธเชตเชฐเซเชก
SONATYPE_USERNAME - sonatype เชเชเชพเชเชจเซเช เชฒเซเชเชฟเชจ
เช เชฐเชจเชฐ เชธเซเชเช
เชช เชชเซเชฐเซเชฃ เชเชฐเซ เชเซ, เชคเชฎเซ เชตเชฟเชญเชพเชเชฎเชพเช เชเชเชณ เชตเชงเซ เชถเชเซ เชเซ
เชตเชนเซเชเชเชพเชฏเซเชฒ เชฐเชจเชฐ
GPG เชเซ เชเชจเชฐเซเชถเชจ
-
เชธเซ เชชเซเชฐเชฅเชฎ, เชคเชฎเชพเชฐเซ GPG เชเซ เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เช เชเชฐเชตเชพ เชฎเชพเชเซ, gnupg เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ.
yum install -y gnupg
-
เช เชฎเซ เชชเซเชฐเชถเซเชจเซเชจเชพ เชเชตเชพเชฌ เชเชชเซเชจเซ เชเซ เชเชจเชฐเซเช เชเชฐเซเช เชเซเช. เชฎเซเช เชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชจเชพเชฎ เช เชจเซ เชเชฎเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ. เชเซ เชฎเชพเชเซ เชชเชพเชธเชตเชฐเซเชก เชธเซเชชเชทเซเช เชเชฐเชตเชพเชจเซ เชเชพเชคเชฐเซ เชเชฐเซ.
gpg --gen-key
-
เชฎเซเชเซเชฏ เชฎเชพเชนเชฟเชคเซ เชชเซเชจเชเชชเซเชฐเชพเชชเซเชค เชเชฐเซ
gpg --list-keys -a pub rsa3072 2019-04-24 [SC] [expires: 2021-04-23] 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 uid [ultimate] tttemp <[email protected]> sub rsa3072 2019-04-24 [E] [expires: none]
-
เชเซเชธเชฐเซเชตเชฐ เชชเชฐ เช เชฎเชพเชฐเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซ เช เชชเชฒเซเชก เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซเช
gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net
-
เชเชพเชจเชเซ เชเซ เชฎเซเชณเชตเซ เชฐเชนเซเชฏเชพเช เชเซเช
gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 -----BEGIN PGP PRIVATE KEY BLOCK----- lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5 ... =2Wd2 -----END PGP PRIVATE KEY BLOCK-----
-
เชชเซเชฐเซเชเซเชเซเช เชธเซเชเชฟเชเชเซเชธ -> เชธเซเชเชฟเชเชเซเชธ -> CI / CD -> เชตเซเชฐเซเชเชฌเชฒ เชชเชฐ เชเชพเช เช เชจเซ เชเชพเชจเชเซ เชเซเชจเซ เชตเซเชฐเซเชเชฌเชฒเชฎเชพเช เชธเชพเชเชตเซ
GPG_SECRET_KEY
เชฎเซเชตเชจ เชธเซเชเช เชช
- เชเช เชฎเชพเชธเซเชเชฐ เชเซ เชฌเชจเชพเชตเซ
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
- เชชเซเชฐเซเชเซเชเซเช เชธเซเชเชฟเชเชเซเชธ -> เชธเซเชเชฟเชเชเซเชธ -> CI / CD -> เชตเซเชฐเซเชเชฌเชฒ เชชเชฐ เชเชพเช เช
เชจเซ เชตเซเชฐเซเชเชฌเชฒเชฎเชพเช เชธเชพเชเชตเซ
SETTINGS_SECURITY_XML
เชจเซเชเซเชจเซ เชฒเซเชเซเช:<settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity>
- Sonatype เชเชเชพเชเชจเซเชเชฎเชพเชเชฅเซ เชชเชพเชธเชตเชฐเซเชก เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
- เชชเซเชฐเซเชเซเชเซเช เชธเซเชเชฟเชเชเซเชธ -> เชธเซเชเชฟเชเชเซเชธ -> CI / CD -> เชตเซเชฐเซเชเชฌเชฒ เชชเชฐ เชเชพเช เช
เชจเซ เชตเซเชฐเซเชเชฌเชฒเชฎเชพเช เชธเชพเชเชตเซ
SETTINGS_XML
เชจเซเชเซเชจเซ เชฒเซเชเซเช:<settings> <profiles> <profile> <id>env</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase> </properties> </profile> </profiles> <servers> <server> <id>sonatype</id> <username>sonatype_username</username> <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password> </server> </servers> </settings>
เชเซเชฏเชพเช,
GPG_SECRET_KEY_PASSPHRASE - GPG เชเซ เชชเชพเชธเชตเชฐเซเชก
SONATYPE_USERNAME - sonatype เชเชเชพเชเชจเซเช เชฒเซเชเชฟเชจ
เชกเซเชเชฐ เชเชฎเซเช เชเชฎเชพเชตเซ
-
เช เชฎเซ Java เชจเชพ เชเชเซเชเชฟเชค เชธเชเชธเซเชเชฐเชฃ เชธเชพเชฅเซ เชเชฎเชพเชตเช เชชเชฐ เชเชพเชฐเซเชฏเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชเชเชฆเชฎ เชธเชฐเชณ เชกเซเชเชฐเชซเชพเชเชฒ เชฌเชจเชพเชตเซเช เชเซเช. เชจเซเชเซ เชเชฒเซเชชเชพเชเชจ เชฎเชพเชเซเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซ.
FROM java:8u111-jdk-alpine RUN apk add gnupg maven git --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && mkdir ~/.m2/
-
เชคเชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชเซเช เชฎเชพเชเซ เชเชจเซเชเซเชจเชฐ เชฌเชจเชพเชตเชตเซเช
docker build -t registry.gitlab.com/group/deploy .
-
เช เชฎเซ เชฐเชเชฟเชธเซเชเซเชฐเซเชฎเชพเช เชเชจเซเชเซเชจเชฐเชจเซ เชชเซเชฐเชฎเชพเชฃเชฟเชค เชเชฐเซเช เชเซเช เช เชจเซ เชฒเซเชก เชเชฐเซเช เชเซเช.
docker login -u USER -p PASSWORD registry.gitlab.com docker push registry.gitlab.com/group/deploy
เชเชฟเชเชฒเซเชฌ เชธเซ.เชเช.
เชชเซเชฐเซเชเซเชเซเช เชเชฎเชพเชตเซ
เชกเชฟเชชเซเชฒเซเชฏ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชฐเซเชเชฎเชพเช เชซเชพเชเชฒ .gitlab-ci.yml เชเชฎเซเชฐเซ
เชธเซเชเซเชฐเชฟเชชเซเช เชฌเซ เชชเชฐเชธเซเชชเชฐ เชตเชฟเชถเชฟเชทเซเช เชเชฎเชพเชตเช เชเชพเชฐเซเชฏเซ เชฐเชเซ เชเชฐเซ เชเซ. เช
เชจเซเชเซเชฐเชฎเซ เชเซเชเซเชเชธ เชฐเชจเชฐ เช
เชฅเชตเชพ เชตเชนเซเชเชเชพเชฏเซเชฒ เชฐเชจเชฐ.
.gitlab-ci.yml
stages:
- deploy
Specific Runner:
extends: .java_deploy_template
# ะะฐะดะฐัะฐ ะฑัะดะตั ะฒัะฟะพะปะฝััััั ะฝะฐ ะฒะฐัะตะผ shell-ัะฐะฝะฝะตัะต
tags:
- deploy
Shared Runner:
extends: .java_deploy_template
# ะะฐะดะฐัะฐ ะฑัะดะตั ะฒัะฟะพะปะฝััััั ะฝะฐ ะฟัะฑะปะธัะฝะพะผ docker-ัะฐะฝะฝะตัะต
tags:
- docker
# ะะฑัะฐะท ะธะท ัะฐะทะดะตะปะฐ GitLab Runner -> Shared Runner -> Docker
image: registry.gitlab.com/group/deploy-project:latest
before_script:
# ะะผะฟะพััะธััะตะผ GPG ะบะปัั
- printf "${GPG_SECRET_KEY}" | gpg --batch --import
# ะกะพั
ัะฐะฝัะตะผ maven ะบะพะฝัะธะณััะฐัะธั
- printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
- printf "${SETTINGS_XML}" > ~/.m2/settings.xml
.java_deploy_template:
stage: deploy
# ะะฐะดะฐัะฐ ััะฐะฑะพัะฐะตั ะฟะพ ััะธะณะณะตัั, ะตัะปะธ ะฟะตัะตะดะฐะฝะฐ ะฟะตัะตะผะตะฝะฝะฐั DEPLOY ัะพ ะทะฝะฐัะตะฝะธะตะผ java
only:
variables:
- $DEPLOY == "java"
variables:
# ะพัะบะปััะฐะตะผ ะบะปะพะฝะธัะพะฒะฐะฝะธะต ัะตะบััะตะณะพ ะฟัะพะตะบัะฐ
GIT_STRATEGY: none
script:
# ะัะตะดะพััะฐะฒะปัะตะผ ะฒะพะทะผะพะถะฝะพััั ั
ัะฐะฝะตะฝะธั ะฟะฐัะพะปั ะฒ ะฝะตะทะฐัะธััะพะฒะฐะฝะฝะพะผ ะฒะธะดะต
- git config --global credential.helper store
# ะกะพั
ัะฐะฝัะตะผ ะฒัะตะผะตะฝะฝัะต ะบัะตะดั ะฟะพะปัะทะพะฒะฐัะตะปั gitlab-ci-token
# ะขะพะบะตะฝ ัะฐะฑะพัะฐะตั ะดะปั ะฒัะตั
ะฟัะฑะปะธัะฝัั
ะฟัะพะตะบัะพะฒ gitlab.com ะธ ะดะปั ะฟัะพะตะบัะพะฒ ะณััะฟะฟั
- echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
# ะะพะปะฝะพัััั ัะธััะธะผ ัะตะบัััั ะดะธัะตะบัะพัะธั
- rm -rf .* *
# ะะปะพะฝะธััะตะผ ะฟัะพะตะบั ะบะพัะพััะน, ะฑัะดะตะผ ะดะตะฟะปะพะธัั ะฒ Sonatype Nexus
- git clone ${DEPLOY_CI_REPOSITORY_URL} .
# ะะตัะตะบะปััะฐะตะผัั ะฝะฐ ะฝัะถะฝัะน ะบะพะผะผะธั
- git checkout ${DEPLOY_CI_COMMIT_SHA} -f
# ะัะปะธ ั
ะพัั ะพะดะธะฝ pom.xml ัะพะดะตัะถะธั ะฟะฐัะฐะผะตัั autoReleaseAfterClose ะฒะฐะปะธะผ ัะฑะพัะบั.
# ะ ะฟัะพัะธะฒะฝะพะผ ัะปััะฐะต ะตััั ัะธัะบ ะทะฐะปะธัั ััััะต ะฐััะตัะฐะบัั ะฒ maven central
- >
for pom in $(find . -name pom.xml); do
if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
exit 1;
fi;
done
# ะัะปะธ ะฟะฐัะฐะผะตัั DEPLOY_CI_COMMIT_TAG ะฟัััะพะน, ัะพ ะฟัะธะฝัะดะธัะตะปัะฝะพ ััะฐะฒะธะผ SNAPSHOT-ะฒะตััะธั
- >
if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
else
VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
if [[ "${VERSION}" == *-SNAPSHOT ]]; then
mvn versions:set -DnewVersion=${VERSION}
else
mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
fi
fi
# ะะฐะฟััะบะฐะตะผ ะทะฐะดะฐัั ะฝะฐ ัะฑะพัะบั ะธ ะดะตะฟะปะพะน ะฐััะตัะฐะบัะพะฒ
- mvn clean deploy -DskipTests=true
เชเชพเชตเชพ เชชเซเชฐเซเชเซเชเซเช
เชเชพเชตเชพ เชชเซเชฐเซเชเซเชเซเชเซเชธเชฎเชพเช เชเซ เชเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชฐเชฟเชชเซเชเซเชเชฐเซเชเชฎเชพเช เช เชชเชฒเซเชก เชฅเชตเชพเชจเชพ เชเซ, เชคเชฎเชพเชฐเซ เชฐเชฟเชฒเซเช เช เชจเซ เชธเซเชจเซเชชเชถเซเช เชตเชฐเซเชเชจ เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซ 2 เชชเชเชฒเชพเช เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
.gitlab-ci.yml
stages:
- build
- test
- verify
- deploy
<...>
Release:
extends: .trigger_deploy
# ะะฐะฟััะบะฐัั ะทะฐะดะฐัั ัะพะปัะบะพ ะฟo ัะตะณั.
only:
- tags
Snapshot:
extends: .trigger_deploy
# ะะฐะฟััะบะฐะตะผ ะทะฐะดะฐัั ะฝะฐ ะฟัะฑะปะธะบะฐัะธั SNAPSHOT ะฒะตััะธะธ ะฒัััะฝัั
when: manual
# ะะต ะทะฐะฟััะบะฐัั ะทะฐะดะฐัั, ะตัะปะธ ะฟัะพััะฐะฒะปะตะฝ ัะตะณ.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# ะัะบะปััะฐะตะผ ะบะปะพะฝะธัะพะฒะฐะฝะธะต ัะตะบััะตะณะพ ะฟัะพะตะบัะฐ
GIT_STRATEGY: none
# ะกััะปะบะฐ ะฝะฐ ััะธะณะณะตั deploy-ะทะฐะดะฐัะธ
URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
# ะะตัะตะผะตะฝะฝัะต deploy-ะทะฐะดะฐัะธ
POST_DATA: "
token=${DEPLOY_TOKEN}&
ref=master&
variables[DEPLOY]=${DEPLOY}&
variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
"
script:
# ะะต ะธัะฟะพะปัะทัั cURL, ัะฐะบ ะบะฐะบ ั ัะปะฐะณะฐะผะธ --fail --show-error
# ะพะฝ ะฝะต ะฒัะฒะพะดะธั ัะตะปะพ ะพัะฒะตัะฐ, ะตัะปะธ HTTP ะบะพะด 400 ะธ ะฑะพะปะตะต
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}
เช เชเชเซเชฒเชฎเชพเช, เชนเซเช เชฅเซเชกเซ เชเชเชณ เชเชฏเซ เช เชจเซ เชเชพเชตเชพ เชชเซเชฐเซเชเซเชเซเชเซเชธ เชฎเชพเชเซ เชเช CI เชเซเชฎเซเชชเชฒเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช.
เชตเชฟเชเชคเซเชฎเชพเช
เชฎเซเช เชเช เช
เชฒเช เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเซเชฏเซ
เชธเชพเชฎเชพเชจเซเชฏ.yml
stages:
- build
- test
- verify
- deploy
variables:
SONAR_ARGS: "
-Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA}
-Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME}
"
.build_java_project:
stage: build
tags:
- touchbit-shell
variables:
SKIP_TEST: "false"
script:
- mvn clean
- mvn package -DskipTests=${SKIP_TEST}
artifacts:
when: always
expire_in: 30 day
paths:
- "*/target/reports"
.build_sphinx_doc:
stage: build
tags:
- touchbit-shell
variables:
DOCKERFILE: .indirect/docs/Dockerfile
script:
- docker build --no-cache -t ${CI_PROJECT_NAME}/doc -f ${DOCKERFILE} .
.junit_module_test_run:
stage: test
tags:
- touchbit-shell
variables:
MODULE: ""
script:
- cd ${MODULE}
- mvn test
artifacts:
when: always
expire_in: 30 day
paths:
- "*/target/reports"
.junit_test_run:
stage: test
tags:
- touchbit-shell
script:
- mvn test
artifacts:
when: always
expire_in: 30 day
paths:
- "*/target/reports"
.sonar_review:
stage: verify
tags:
- touchbit-shell
dependencies: []
script:
- >
if [ "$CI_BUILD_REF_NAME" == "master" ]; then
mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
else
mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
fi
.trigger_deploy:
stage: deploy
tags:
- touchbit-shell
variables:
URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
POST_DATA: "
token=${DEPLOY_TOKEN}&
ref=master&
variables[DEPLOY]=${DEPLOY}&
variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
"
script:
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}
.trigger_release_deploy:
extends: .trigger_deploy
only:
- tags
.trigger_snapshot_deploy:
extends: .trigger_deploy
when: manual
except:
- tags
เชชเชฐเชฟเชฃเชพเชฎเซ, เชเชพเชตเชพ เชชเซเชฐเซเชเซเชเซเชเซเชธเชฎเชพเช, .gitlab-ci.yml เชเซเชฌ เชเซเชฎเซเชชเซเชเซเช เชฆเซเชเชพเชฏ เชเซ เช เชจเซ เชตเชฐเซเชฌเซเช เชจเชฅเซ
.gitlab-ci.yml
include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml
Shields4J:
extends: .build_java_project
Sphinx doc:
extends: .build_sphinx_doc
variables:
DOCKERFILE: .docs/Dockerfile
Sonar review:
extends: .sonar_review
dependencies:
- Shields4J
Release:
extends: .trigger_release_deploy
Snapshot:
extends: .trigger_snapshot_deploy
pom.xml เชฐเซเชชเชฐเซเชเชพเชเชเชจ
เช เชตเชฟเชทเชฏเชจเซเช เชตเชฟเชเชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ. nexus-staging-maven-plugin
เชเซ เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชเซเช เชฎเชพเชเซ เชชเซเชฐเซเชจเซเช เชคเชฐเซเชเซ org.sonatype.oss:oss-parent เชเชเซเชเชคเชพ เชจเชฅเซ เช
เชฅเชตเชพ เชเชชเชฏเซเช เชเชฐเซ เชถเชเชคเชพ เชจเชฅเซ.
maven-install-plugin
เชธเซเชฅเชพเชจเชฟเช เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชฎเซเชกเซเชฏเซเชฒเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชเซ.
เช
เชจเซเชฏ เชชเซเชฐเซเชเซเชเซเชเซเชธเชฎเชพเช เชเชเซเชฒเซเชจเซ เชธเซเชฅเชพเชจเชฟเช เชเชเชพเชธเชฃเซ เชคเซเชฎเช เชเซเชเชธเชฎ เชฎเชพเชเซ เชเซเชฌ เช เชเชชเชฏเซเชเซ.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-project</id>
<!-- ะัะปะธ ั ะฒะฐั ะผะฝะพะณะพะผะพะดัะปัะฝัะน ะฟัะพะตะบั ั ะดะตะฟะปะพะตะผ ัะพะดะธัะตะปััะบะพะณะพ ะฟะพะผะธะบะฐ -->
<phase>install</phase>
<!-- ะฏะฒะฝะพ ัะบะฐะทัะฒะฐะตะผ ัะฐะนะปั ะดะปั ะปะพะบะฐะปัะฝะพะน ัััะฐะฝะพะฒะบะธ -->
<configuration>
<file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
<pomFile>dependency-reduced-pom.xml</pomFile>
<!-- ะัะธะฝัะดะธัะตะปัะฝะพะต ะพะฑะฝะพะฒะปะตะฝะธะต ะผะตัะฐะดะฐะฝะฝัั
ะฟัะพะตะบัะฐ -->
<updateReleaseInfo>true</updateReleaseInfo>
<!-- ะะพะฝััะพะปัะฝัะต ััะผะผั ะดะปั ะฟัะพะฒะตัะบะธ ัะตะปะพััะฝะพััะธ -->
<createChecksum>true</createChecksum>
</configuration>
</execution>
</executions>
</plugin>
maven-javadoc-เชชเซเชฒเชเชเชจ
เชชเซเชฐเซเชเซเชเซเช เชฎเชพเชเซ javadoc เชเชจเชฐเซเช เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<!-- ะะตะฝะตัะฐัะธั javadoc ะดะพะปะถะฝะฐ ะฑััั ะฟะพัะปะต ัะฐะทั ะณะตะฝะตัะฐัะธะธ ัะตััััะพะฒ -->
<phase>prepare-package</phase>
<configuration>
<!-- ะัะตะฝั ะฟะพะผะพะณะฐะตั ะฒ ะฟัะฑะปะธัะฝัั
ะฟัะพะตะบัะฐั
-->
<failOnError>true</failOnError>
<failOnWarnings>true</failOnWarnings>
<!-- ะฃะฑะธัะฐะตั ะพัะธะฑะบั ะฟะพะธัะบะฐ ะดะพะบัะผะตะฝัะฐัะธะธ ะฒ target ะดะธัะตะบัะพัะธะธ -->
<detectOfflineLinks>false</detectOfflineLinks>
</configuration>
</execution>
</executions>
</plugin>
เชเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชเชตเซเช เชฎเซเชกเซเชฏเซเชฒ เชเซ เชเซเชฎเชพเช เชเชพเชตเชพ เชจเชฅเซ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ เชฎเชพเชคเซเชฐ เชธเชเชธเชพเชงเชจเซ)
เช
เชฅเชตเชพ เชคเชฎเซ เชธเซเชฆเซเชงเชพเชเชคเชฟเช เชฐเซเชคเซ javadoc เชเชจเชฐเซเช เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชจเชฅเซ, เชชเชเซ เชฎเชฆเชฆ เชเชฐเชตเชพ เชฎเชพเชเซ maven-jar-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>empty-javadoc-jar</id>
<phase>generate-resources</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>javadoc</classifier>
<classesDirectory>${basedir}/javadoc</classesDirectory>
</configuration>
</execution>
</executions>
</plugin>
maven-gpg-เชชเซเชฒเชเชเชจ
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<!-- ะกะฑะพัะบะฐ ะฑัะดะตั ะฟะฐะดะฐัั, ะตัะปะธ ะพััััััะฒัะตั GPG ะบะปัั -->
<!-- ะะพะดะฟะธััะฒะฐะตะผ ะฐััะตัะฐะบัั ัะพะปัะบะพ ะฝะฐ ัะฐะทะต deploy -->
<phase>deploy</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
nexus-staging-maven-plugin
เชฐเซเชชเชฐเซเชเชพเชเชเชจ:
<project>
<!-- ... -->
<build>
<plugins>
<!-- ... -->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<serverId>sonatype</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<!-- ะะฑะฝะพะฒะปัะตะผ ะผะตัะฐะดะฐะฝะฝัะต, ััะพะฑั ะฟะพะผะตัะธัั ะฐััะตัะฐะบั ะบะฐะบ release -->
<!-- ะะต ะฒะปะธัะตั ะฝะฐ snapshot ะฒะตััะธะธ -->
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<!-- ะัะบะปััะฐะตะผ ะฟะปะฐะณะธะฝ -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<distributionManagement>
<snapshotRepository>
<id>sonatype</id>
<name>Nexus Snapshot Repository</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>sonatype</id>
<name>Nexus Release Repository</name>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
</project>
เชเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชฎเชฒเซเชเชฟ-เชฎเซเชกเซเชฏเซเชฒ เชชเซเชฐเซเชเซเชเซเช เชเซ, เช
เชจเซ เชคเชฎเชพเชฐเซ เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชเซเชเซเชเชธ เชฎเซเชกเซเชฏเซเชฒ เช
เชชเชฒเซเชก เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ, เชคเซ เชคเชฎเชพเชฐเซ เช เชฎเซเชกเซเชฏเซเชฒเชจเชพ pom.xml เชฎเชพเช เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. nexus-staging-maven-plugin
เชงเซเชตเช เชธเชพเชฅเซ skipNexusStagingDeployMojo
<build>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<configuration>
<skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
</configuration>
</plugin>
</plugins>
</build>
เช
เชชเชฒเซเชก เชเชฐเซเชฏเชพ เชชเชเซ เชธเซเชจเซเชชเชถเซเช/เชชเซเชฐเชเชพเชถเชจ เชเชตเซเชคเซเชคเชฟเช เชเชชเชฒเชฌเซเชง เชเซ
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- ะะต ะฝะฐะดะพ ัะบะฐะทัะฒะฐัั ัะปะฐะณะธ snapshot/release ะดะปั ัะตะฟะพะทะธัะพัะธั -->
</repository>
</repositories>
เชตเชงเซ เชชเซเชฒเซเชธเชธ
- เชจเซเชเซเชธเชธ เชฐเชฟเชชเซเชเซเชเชฐเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซเชจเชพ เชฒเชเซเชทเซเชฏเซเชจเซ เชเซเชฌ เชธเชฎเซเชฆเซเชง เชฏเชพเชฆเซ
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin
). - เชฎเซเชตเซเชจ เชธเซเชจเซเชเซเชฐเชฒเชฎเชพเช เชกเชพเชเชจเชฒเซเชกเชเซเชทเชฎเชคเชพ เชฎเชพเชเซ เชธเซเชตเชเชพเชฒเชฟเชค เชชเซเชฐเชเชพเชถเชจ เชคเชชเชพเชธเซ
เชชเชฐเชฟเชฃเชพเชฎ
เชธเซเชจเซเชชเชถเซเช เชธเชเชธเซเชเชฐเชฃ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชคเซ เชตเชเชคเซ, เชจเซเชเซเชธเชธเชฎเชพเช SNAPSHOT เชธเชเชธเซเชเชฐเชฃ เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซ เชฎเซเชจเซเชฏเซเช เชฒเซ เชเชพเชฐเซเชฏ เชถเชฐเซ เชเชฐเชตเซเช เชถเชเซเชฏ เชเซ.
เชเซเชฏเชพเชฐเซ เช เชเชพเชฐเซเชฏ เชฒเซเชเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชกเชฟเชชเซเชฒเซเชฏ เชชเซเชฐเซเชเซเชเซเชเชฎเชพเช เช
เชจเซเชฐเซเชช เชเชพเชฐเซเชฏ เชเซเชฐเชฟเชเชฐ เชฅเชพเชฏ เชเซ (
เชเชพเชชเซเชฒ เชฒเซเช
Running with gitlab-runner 11.10.0 (3001a600)
on Deploy runner JSKWyxUw
Using Shell executor...
Running on ih1174328.vds.myihor.ru...
Skipping Git repository setup
Skipping Git checkout
Skipping Git submodules setup
$ rm -rf .* *
$ git config --global credential.helper store
$ echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
$ git clone ${DEPLOY_CI_REPOSITORY_URL} .
Cloning into 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Note: checking out '850f86aa317194395c5387790da1350e437125a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # collapsed multi-line command
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # collapsed multi-line command
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO] ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Shields4J client [jar]
[INFO] TestNG listener [jar]
[INFO]
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0 [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Processing change of org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Processing org.touchbit.shields4j:shields4j-parent
[INFO] Updating project org.touchbit.shields4j:shields4j-parent
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]
[INFO] Processing org.touchbit.shields4j:client
[INFO] Updating parent org.touchbit.shields4j:shields4j-parent
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] Updating dependency org.touchbit.shields4j:test-core
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]
[INFO] Processing org.touchbit.shields4j:test-core
[INFO] Updating parent org.touchbit.shields4j:shields4j-parent
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]
[INFO] Processing org.touchbit.shields4j:testng
[INFO] Updating parent org.touchbit.shields4j:shields4j-parent
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] Updating dependency org.touchbit.shields4j:client
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] Updating dependency org.touchbit.shields4j:test-core
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 0.992 s]
[INFO] test-core .......................................... SKIPPED
[INFO] Shields4J client ................................... SKIPPED
[INFO] TestNG listener 1.0.0 .............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.483 s
[INFO] Finished at: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO] ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Shields4J client [jar]
[INFO] TestNG listener [jar]
[INFO]
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0-SNAPSHOT [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO] * Bulk deploy of locally gathered snapshot artifacts finished.
[INFO] Remote deploy finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUCCESS [ 2.375 s]
[INFO] test-core .......................................... SUCCESS [ 3.929 s]
[INFO] Shields4J client ................................... SUCCESS [ 3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... SUCCESS [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.629 s
[INFO] Finished at: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------
เชชเชฐเชฟเชฃเชพเชฎเซ, เชจเซเชเซเชธเชธ เชตเชฐเซเชเชจ เชฒเซเชก เชฅเชพเชฏ เชเซ
เชฌเชงเชพ เชธเซเชจเซเชชเชถเซเช เชธเชเชธเซเชเชฐเชฃเซ เชธเชพเชเช เชชเชฐเชจเชพ เชญเชเชกเชพเชฐเชฎเชพเชเชฅเซ เชฆเซเชฐ เชเชฐเซ เชถเชเชพเชฏ เชเซ
เชชเซเชฐเชเชพเชถเชจ เชธเชเชธเซเชเชฐเชฃเชจเซเช เชชเซเชฐเชเชพเชถเชจ
เชเซเชฏเชพเชฐเซ เชเซเช เชธเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชกเชฟเชชเซเชฒเซเชฏ เชชเซเชฐเซเชเซเชเซเชเชฎเชพเช เช
เชจเซเชฐเซเชช เชเชพเชฐเซเชฏ เชจเซเชเซเชธเชธ (
เชถเซเชฐเซเชทเซเช เชญเชพเช เช เชเซ เชเซ เชจเชเซเชเชจเชพ เชชเซเชฐเชเชพเชถเชจ เชจเซเชเซเชธเชธเชฎเชพเช เชเชชเชฎเซเชณเซ เชเซเชฐเชฟเชเชฐ เชฅเชพเชฏ เชเซ.
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO] * Created staging repository with ID "orgtouchbit-1037".
[INFO] * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Uploading locally staged artifacts to profile org.touchbit
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 9.603 s]
[INFO] test-core .......................................... SUCCESS [ 3.419 s]
[INFO] Shields4J client ................................... SUCCESS [ 9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------
เช เชจเซ เชเซ เชเชเชเช เชเซเชเซเช เชฅเชฏเซเช, เชคเซ เชเชพเชฐเซเชฏ เชจเชฟเชทเซเชซเชณ เชเชถเซ
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO] * Created staging repository with ID "orgtouchbit-1038".
[INFO] * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Uploading locally staged artifacts to profile org.touchbit
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "orgtouchbit-1038".
Waiting for operation to complete...
.......
[ERROR] Rule failure while trying to close staging repository with ID "orgtouchbit-1039".
[ERROR]
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR]
[ERROR] Repository "orgtouchbit-1039" failures
[ERROR] Rule "signature-staging" failures
[ERROR] * No public key: Key with id: (1f42b618d1cbe1b5) was not able to be located on <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 4.073 s]
[INFO] test-core .......................................... SUCCESS [ 2.788 s]
[INFO] Shields4J client ................................... SUCCESS [ 3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
เชชเชฐเชฟเชฃเชพเชฎเซ, เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชซเชเซเชค เชเช เช เชตเชฟเชเชฒเซเชช เชฌเชพเชเซ เชเซ. เช เชฅเชตเชพ เช เชธเชเชธเซเชเชฐเชฃ เชเชพเชขเซ เชจเชพเชเซ เช เชฅเชตเชพ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซ.
เชชเซเชฐเชเชพเชถเชจ เชชเชเซ, เชฅเซเชกเชพ เชธเชฎเชฏ เชชเชเซ, เชเชฒเชพเชเซเชคเชฟเช เช
เชเชฆเชฐ เชนเชถเซ
เชเชซเชเซเชชเชฟเช
เชคเซ เชฎเชพเชฐเชพ เชฎเชพเชเซ เชเช เชธเชพเชเซเชทเชพเชคเซเชเชพเชฐ เชนเชคเซ เชเซ เชฎเซเชตเซเชจ เช
เชจเซเชฏ เชเชพเชนเซเชฐ เชญเชเชกเชพเชฐเซเชจเซ เช
เชจเซเชเซเชฐเชฎเชฟเชค เชเชฐเซ เชเซ.
เชฎเชพเชฐเซ robots.txt เช
เชชเชฒเซเชก เชเชฐเชตเซ เชชเชกเซ เชเชพเชฐเชฃ เชเซ เชคเซ เชฎเชพเชฐเชพ เชเซเชจเชพ เชญเชเชกเชพเชฐเชจเซ เช
เชจเซเชเซเชฐเชฎเชฟเชค เชเชฐเซ เชเซ.
เชจเชฟเชทเซเชเชฐเซเชท
เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชถเซเช เชเซ
- เชเช เช เชฒเช เชกเชฟเชชเซเชฒเซเชฏ เชชเซเชฐเซเชเซเชเซเช เชเซเชฎเชพเช เชคเชฎเซ เชตเชฟเชตเชฟเชง เชกเซเชตเชฒเชชเชฎเซเชจเซเช เชฒเซเชเชเซเชตเซเช เชฎเชพเชเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชฐเชฟเชชเซเชเซเชเชฐเซเชเชฎเชพเช เชเชฐเซเชเชฟเชซเซเชเซเชเซเชธ เช เชชเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฃเชพ CI เชเชพเชฐเซเชฏเซเชจเซ เช เชฎเชฒ เชเชฐเซ เชถเชเซ เชเซ.
- เชกเชฟเชชเซเชฒเซเชฏเชฎเซเชจเซเช เชชเซเชฐเซเชเซเชเซเช เชฌเชนเชพเชฐเชจเซ เชฆเชเชฒเชเซเชฐเซเชฅเซ เช เชฒเช เชเซ เช เชจเซ เชซเชเซเชค เชฎเชพเชฒเชฟเช เช เชจเซ เชเชพเชณเชตเชฃเซเชจเซ เชญเซเชฎเชฟเชเชพ เชงเชฐเชพเชตเชคเชพ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชฆเซเชตเชพเชฐเชพ เช เชธเชเชถเซเชงเชฟเชค เชเชฐเซ เชถเชเชพเชฏ เชเซ.
- เชซเชเซเชค เชตเซเชฏเชตเชธเซเชฅเชฟเชค เชเชพเชฐเซเชฏเซเชจเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ "เชนเซเช" เชเซเชถ เชธเชพเชฅเซเชจเซ เชเช เช เชฒเช เชตเชฟเชถเชฟเชทเซเช เชฐเชจเชฐ.
- เชชเชฌเซเชฒเชฟเช เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชธเซเชจเซเชชเชถเซเช/เชฐเซเชฒเซเช เชตเชฐเซเชเชจเชจเซเช เชชเซเชฐเชเชพเชถเชจ.
- เชฎเซเชตเซเชจ เชธเซเชจเซเชเซเชฐเชฒ เชฎเชพเช เชชเซเชฐเชเชพเชถเชจ เชฎเชพเชเซ เชคเชคเซเชชเชฐเชคเชพ เชฎเชพเชเซ เชชเซเชฐเชเชพเชถเชจ เชธเชเชธเซเชเชฐเชฃเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชคเชชเชพเชธ.
- เชฎเซเชตเซเชจ เชธเซเชจเซเชเซเชฐเชฒเชฎเชพเช "เชเชพเชเชพ" เชธเชเชธเซเชเชฐเชฃเซเชจเชพ เชธเซเชตเชเชพเชฒเชฟเชค เชชเซเชฐเชเชพเชถเชจ เชธเชพเชฎเซ เชฐเชเซเชทเชฃ.
- "เชเซเชฒเชฟเช เชชเชฐ" เชธเซเชจเซเชชเชถเซเช เชธเชเชธเซเชเชฐเชฃเซ เชฌเชจเชพเชตเซ เช เชจเซ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซ.
- เชธเซเชจเซเชชเชถเซเช/เชฐเซเชฒเซเช เชตเชฐเซเชเชจ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ เชเช เชฐเซเชชเซเชเซเชเชฐเซ.
- เชเชพเชตเชพ เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชตเชพ/เชชเชฐเซเชเซเชทเชฃ/เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชชเชพเชเชชเชฒเชพเชเชจ.
GitLab CI เชธเซเช เชเชฐเชตเซเช เช เชเชเชฒเซ เชเชเชฟเชฒ เชตเชฟเชทเชฏ เชจเชฅเซ เชเซเชเชฒเซ เชคเซ เชชเซเชฐเชฅเชฎ เชจเชเชฐเชฎเชพเช เชฒเชพเชเซ เชเซ. เชเชฐเซเชจเชเซ เชงเซเชฐเชฃเซ เชธเซเชเชเชจเซ เชฌเซ เชตเชเชค เชธเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซ เชชเซเชฐเชคเซเช เชเซ, เช เชจเซ เชนเชตเซ เชคเชฎเซ เช เชฌเชพเชฌเชคเชฎเชพเช เชเชฒเชพเชชเซเชฐเซเชฎเซเชฅเซ เชฆเซเชฐ เชเซ. เชตเชงเซเชฎเชพเช, GitLab เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เชเซเชฌ เช เชฌเชฟเชจเชเชฐเซเชฐเซ เชเซ. เชชเซเชฐเชฅเชฎ เชชเชเชฒเซเช เชฒเซเชตเชพเชฅเซ เชกเชฐเชถเซ เชจเชนเซเช. เชเชพเชฒเชคเซ เชตเซเชฏเชเซเชคเชฟเชจเชพ เชชเชเชฅเชฟเชฏเชพเช เชจเซเชเซ เชฐเชธเซเชคเซ เชฆเซเชเชพเชฏ เชเซ (เชฎเชจเซ เชฏเชพเชฆ เชจเชฅเซ เชเซ เชเซเชฃเซ เชเชนเซเชฏเซเช :)
เชฎเชจเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเชตเชพเชฎเชพเช เชเชจเชเชฆ เชฅเชถเซ.
เชเชเชฒเชพ เชฒเซเชเชฎเชพเช, เชนเซเช เชคเชฎเชจเซ เชฌเชคเชพเชตเซเชถ เชเซ เชเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชฎเชพเชคเซเชฐ เชเช เชถเซเชฒ เชฐเชจเชฐ เชนเซเชฏ เชคเซ เชธเซเชชเชฐเซเชงเชพเชคเซเชฎเช เชฐเซเชคเซ (เชกเซเชเชฐ-เชเชเชชเซเช เชธเชพเชฅเซ เชชเชฐเซเชเซเชทเชฃ เชธเซเชตเชพเช เชเชฒเชพเชตเชตเซ) เชเชเซเชเชฐเชฃ เชชเชฐเซเชเซเชทเชฃ เชเชพเชฐเซเชฏเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ GitLab CI เชเซเชตเซ เชฐเซเชคเซ เชธเซเช เชเชฐเชตเซเช.
เชธเซเชฐเซเชธ: www.habr.com