เด เดฒเตเดเดจเด, GitLab เดเดชเดฏเตเดเดฟเดเตเดเต เดธเตเดฃเดพเดเตเดชเตเดชเต เดเตเดเดพเดคเต/เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดฎเดพเดตเตป เดธเตเตปเดเตเดฐเตฝ เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟเดเดณเดฟเดฒเตเดเตเดเต เด เดตเดฐเตเดเต เดเตฝเดชเตเดชเดจเตเดจเดเตเดเตพ เดตเตเดเดคเตเดคเดฟเตฝ เดชเตเดฐเดธเดฟเดฆเตเดงเตเดเดฐเดฟเดเตเดเตเดฃเตเด เดเดพเดต เดกเตเดตเดฒเดชเตเดชเตผเดฎเดพเตผเดเตเดเดพเดฏเดฟ เดเดฆเตเดฆเตเดถเดฟเดเตเดเตเดณเตเดณเดคเดพเดฃเต. เด เดฒเตเดเดจเดคเตเดคเดฟเตฝ, เด เดชเตเดฐเดถเตเดจเด เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเตป gitlab-runner, gitlab-ci, maven-plugin เดเดจเตเดจเดฟเดต เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเต เดเดพเตป เดธเดเดธเดพเดฐเดฟเดเตเดเตเด.
เดฎเตเตปเดตเตเดฏเดตเดธเตเดฅเดเตพ:
- mvn, GPG เดเตเดเดณเตเดเต เดธเตเดฐเดเตเดทเดฟเดค เดธเดเดญเดฐเดฃเด.
- เดชเตเดคเต CI เดเดพเดธเตเดเตเดเตเดเดณเตเดเต เดธเตเดฐเดเตเดทเดฟเดคเดฎเดพเดฏ เดจเดฟเตผเดตเตเดตเดนเดฃเด.
- เดชเตเดคเต เดถเตเดเดฐเดฃเดเตเดเดณเดฟเดฒเตเดเตเดเต เดชเตเดฐเดพเดตเดธเตเดคเตเดเตเดเตพ (เดฑเดฟเดฒเตเดธเต/เดธเตเดจเดพเดชเตเดชเตเดทเตเดเตเดเต) เด เดชเตโเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต.
- เดฎเดพเดตเตป เดธเตเตปเดเตเดฐเดฒเดฟเตฝ เดชเตเดฐเดธเดฟเดฆเตเดงเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดฑเดฟเดฒเตเดธเต เดชเดคเดฟเดชเตเดชเตเดเดณเตเดเต เดฏเดพเดจเตเดคเตเดฐเดฟเด เดชเดฐเดฟเดถเตเดงเดจ.
- เดเดจเตเดจเดฟเดฒเดงเดฟเดเด เดชเตเดฐเตเดเดเตเดฑเตเดฑเตเดเตพเดเตเดเตเดณเตเดณ เดเดฐเต เดถเตเดเดฐเดคเตเดคเดฟเดฒเตเดเตเดเต เดชเตเดฐเดพเดตเดธเตเดคเตเดเตเดเตพ เด เดชเตโเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดชเตเดคเต เดชเดฐเดฟเดนเดพเดฐเด.
- เดฒเดพเดณเดฟเดคเตเดฏเดตเตเด เดเดชเดฏเตเด เดเดณเตเดชเตเดชเดตเตเด.
เดเดณเตเดณเดเดเตเดเด
เดชเตเดคเตเดตเดฟเดตเดฐเดเตเดเตพ GitLab-เตฝ เดเดฐเต เดตเดฟเดจเตเดฏเดพเดธ เดชเดฆเตเดงเดคเดฟ เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต GitLab เดฑเดฃเตเดฃเตผ เดเดฟเดฑเตเดฑเตโเดฒเดพเดฌเต เดธเดฟ.เด pom.xml เดเตเตบเดซเดฟเดเดฑเตเดทเตป เดซเดฒเด เดคเตเดฐเตเดฎเดพเดจเด
เดชเตเดคเตเดตเดฟเดตเดฐเดเตเดเตพ
- Sonatype OSS Repository Hosting Service เดตเดดเดฟ เดฎเดพเดตเตเตป เดธเตเตปเดเตเดฐเดฒเดฟเดฒเตเดเตเดเต เดชเตเดฐเดพเดตเดธเตเดคเตเดเตเดเตพ เดชเตเดฐเดธเดฟเดฆเตเดงเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเดเดตเดฟเดงเดพเดจเดคเตเดคเดฟเดจเตเดฑเต เดตเดฟเดถเดฆเดฎเดพเดฏ เดตเดฟเดตเดฐเดฃเด เดเดคเดฟเดจเดเด เดตเดฟเดตเดฐเดฟเดเตเดเดฟเดเตเดเตเดฃเตเดเต.
เด เดฒเตเดเดจเด เดเดชเดฏเตเดเตเดคเดพเดตเตเดเตเดเตเตพเดชเตเดฒเตเดเตเดธเต , เด เดคเดฟเดจเดพเตฝ เดเดพเตป เด เดฒเตเดเดจเด เดถเดฐเดฟเดฏเดพเดฏ เดธเตเดฅเดฒเดเตเดเดณเดฟเตฝ เดชเดฐเดพเดฎเตผเดถเดฟเดเตเดเตเด. - เดเดจเตเดจ เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเตฝ เดฎเตเตปเดเตเดเตเดเดฟ เดฐเดเดฟเดธเตเดฑเตเดฑเตผ เดเตเดฏเตเดฏเตเด
เดธเตเดฃเดเตเดชเตเดชเต JIRA เดถเตเดเดฐเด เดคเตเดฑเดเตเดเดพเตป เดเดฐเต เดเดฟเดเตเดเดฑเตเดฑเต เดคเตเดฑเดเตเดเตเด (เดเตเดเตเดคเตฝ เดตเดฟเดตเดฐเดเตเดเตพเดเตเดเต เดตเดฟเดญเดพเดเด เดตเดพเดฏเดฟเดเตเดเตเดSonatype JIRA-เดฏเดฟเตฝ เดเดฐเต เดเดฟเดเตเดเดฑเตเดฑเต เดธเตเดทเตโเดเดฟเดเตเดเตเด ). เดถเตเดเดฐเด เดคเตเดฑเดจเตเดจเดคเดฟเดจเต เดถเตเดทเด, เดธเตเดฃเดเตเดชเตเดชเต เดจเตเดเตเดธเดธเดฟเดฒเตเดเตเดเต เดเตผเดเตเดเดฟเดซเดพเดเตเดฑเตเดฑเตเดเตพ เด เดชเตโเดฒเตเดกเต เดเตเดฏเตเดฏเดพเตป JIRA เดฒเตเดเดฟเตป/เดชเดพเดธเตโเดตเตเดกเต เดเตเดเดฟ (เดเดจเดฟเดฎเตเดคเตฝ เดธเตเดฃเดเตเดชเตเดชเต เด เดเตเดเตเดฃเตเดเต เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเดเตเด) เดเดชเดฏเตเดเดฟเดเตเดเตเด. - เด
เดเตเดคเตเดคเดคเดพเดฏเดฟ, เดเดฐเต GPG เดเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจ เดชเตเดฐเดเตเดฐเดฟเดฏ เดตเดณเดฐเต เดตเดฐเดฃเตเด เดฐเตเดคเดฟเดฏเดฟเตฝ เดตเดฟเดตเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเตเดเตเดคเตฝ เดตเดฟเดตเดฐเดเตเดเตพเดเตเดเต เดตเดฟเดญเดพเดเด เดเดพเดฃเตเด
เดชเตเดฐเดพเดตเดธเตเดคเตเดเตเดเตพ เดเดชเตเดชเดฟเดเดพเตป GnuPG เดเตเตบเดซเดฟเดเตผ เดเตเดฏเตเดฏเตเดจเตเดจเต - เดเดฐเต GPG เดเต (gnupg/gnupg2) เดธเตเดทเตเดเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเตพ Linux เดเตบเดธเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดจเดฟเดเตเดเตพ เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเดฃเตเดเดคเตเดฃเตเดเต
rng- เดเดชเดเดฐเดฃเดเตเดเตพ เดเตปเดเตเดฐเตเดชเตเดชเดฟ เดธเตเดทเตเดเดฟเดเตเดเดพเตป. เด เดฒเตเดฒเตเดเตเดเดฟเตฝ, เดเต เดเดจเดฑเตเดทเตป เดตเดณเดฐเต เดธเดฎเดฏเดฎเตเดเตเดเตเดเตเด. - เดธเดเดญเดฐเดฃ โโเดธเตเดตเดจเดเตเดเตพ เดชเตเดคเต GPG เดเตเดเตพ
http://keys.gnupg.net http://pool.sks-keyservers.net http://keyserver.ubuntu.com
GitLab-เตฝ เดเดฐเต เดตเดฟเดจเตเดฏเดพเดธ เดชเดฆเตเดงเดคเดฟ เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต
- เดเดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดเตผเดเตเดเดฟเดซเดพเดเตเดฑเตเดฑเตเดเตพ เดตเดฟเดจเตเดฏเดธเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดชเตเดชเตเดชเตเดฒเตเตป เดธเดเดญเดฐเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดจเดฟเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดเดฏเตเด เดเตเดฐเดฎเตเดเดฐเดฟเดเตเดเตเดเดฏเตเด เดตเตเดฃเด. เดเดพเตป เดเดจเตเดฑเต เดชเตเดฐเตเดเดเตเดเดฟเดจเต เดฒเดณเดฟเดคเดฎเดพเดฏเตเด เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏเตเด เดชเตเดฐเดฟเดเตเดเต -
เดตเดฟเดจเตเดฏเดธเดฟเดเตเดเตเด - เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟ เดธเตเดทเตเดเดฟเดเตเด เดถเตเดทเด, เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดเตเดธเดธเต เดจเดฟเดเตเดเตพ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต.
เดชเตเดฐเตเดเดเตเดฑเตเดฑเต -> เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ -> เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟ -> เดธเดเดฐเดเตเดทเดฟเดค เดถเดพเดเดเตพ เดเดจเตเดจเดคเดฟเดฒเตเดเตเดเต เดชเตเดเตเด. เดเดเตเดเตพ เดเดฒเตเดฒเดพ เดจเดฟเดฏเดฎเดเตเดเดณเตเด เดเดฒเตเดฒเดพเดคเดพเดเตเดเตเดเดฏเตเด เดตเตเตฝเดกเตโเดเดพเตผเดกเต * เดเดชเดฏเตเดเดฟเดเตเดเต เดเดฐเตเดฑเตเดฑ เดจเดฟเดฏเดฎเด เดเตเตผเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต, เดฎเตเดฏเดฟเตปเดฑเดจเตเดดเตโเดธเต เดฑเตเดณเตเดณเตเดณ เดเดชเดฏเตเดเตเดคเดพเดเตเดเตพเดเตเดเต เดฎเดพเดคเตเดฐเด เดชเตเดทเต เดเตเดฏเตเดฏเดพเดจเตเด เดฒเดฏเดฟเดชเตเดชเดฟเดเตเดเดพเดจเตเดฎเตเดณเตเดณ เด เดตเดเดพเดถเดฎเตเดฃเตเดเต. เด เดชเตเดฐเตเดเดเตเดฑเตเดฑเดฟเดจเตเดฑเตเดฏเตเด เด เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดเตพเดชเตเดชเตเดเตเดจเตเดจ เดเตเดฐเตเดชเตเดชเดฟเดจเตเดฑเตเดฏเตเด เดเดฒเตเดฒเดพ เดเดชเดฏเตเดเตเดคเดพเดเตเดเตพเดเตเดเตเด เด เดจเดฟเดฏเดฎเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเด.
- เดจเดฟเดฐเดตเดงเดฟ เดฎเตเดฏเดฟเดจเตเดฑเดจเตผเดฎเดพเตผ เดเดฃเตเดเตเดเตเดเดฟเตฝ, เดชเตเดฐเตเดเดเตเดฑเตเดฑเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเตเดฐเดตเตเดถเดจเด เดคเดคเตเดตเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเตเดเตเดคเตเดคเตเด เดเดจเตเดจเดคเดพเดฃเต เดเดฑเตเดฑเดตเตเด เดฎเดฟเดเดเตเด เดชเดฐเดฟเดนเดพเดฐเด.
เดชเตเดฐเตเดเดเตเดฑเตเดฑเต -> เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ -> เดชเตเดคเตเดตเดพเดฏเดคเต -> เดฆเตเดถเตเดฏเดชเดฐเดค, เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดธเดตเดฟเดถเตเดทเดคเดเตพ, เด เดจเตเดฎเดคเดฟเดเตพ เดเดจเตเดจเดฟเดตเดฏเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดฆเตเดถเตเดฏเดชเดฐเดค เดธเดเตเดเดฎเดพเดเตเดเตเด เดธเตเดตเดเดพเดฐเตเดฏ.
เดเดจเตเดฑเต เดธเตเดตเดจเตเดคเด GitLab เดฑเดฃเตเดฃเตผ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเตฝ เดเดจเดฟเดเตเดเต เดชเตเดคเต เดเดเตโเดธเดธเตเดธเดฟเตฝ เดเดฐเต เดชเตเดฐเตเดเดเตโเดฑเตเดฑเต เดเดฃเตเดเต, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดถเตเดเดฐเด เดชเดฐเดฟเดทเตโเดเตเดเดฐเดฟเดเตเดเดพเตป เดเดจเดฟเดเตเดเต เดฎเดพเดคเตเดฐเดฎเต เดเดเตโเดธเดธเต เดเดณเตเดณเต. เดถเดฐเดฟ, เดชเตเดคเต เดชเตเดชเตเดชเตโเดฒเตเตป เดฒเตเดเตเดเดณเดฟเตฝ เดธเตเดตเดเดพเดฐเตเดฏ เดตเดฟเดตเดฐเดเตเดเตพ เดเดพเดฃเดฟเดเตเดเตเดจเตเดจเดคเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดเดจเตเดฑเต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเดฒเตเดฒ. - เดถเตเดเดฐเด เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดฟเดฏเดฎเดเตเดเตพ เดเตผเดถเดจเดฎเดพเดเตเดเตเดจเตเดจเต
เดชเตเดฐเตเดเดเตเดฑเตเดฑเต -> เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ -> เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟ -> เดชเตเดทเต เดฑเตเดณเตเดเตพ เดเดจเตเดจเดคเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ เดเดฎเตเดฎเตเดฑเตเดฑเตผ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด เดธเดเตเดเดฎเดพเดเตเดเตเด, เดฐเดเดฏเดฟเดคเดพเดตเต เดเดฐเต GitLab เดเดชเดฏเตเดเตเดคเต เดซเตเดฒเดพเดเตเดเดณเดพเดฃเต เดเดจเตเดจเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเด. เดธเดเตเดเตเดเดฐเดฟเดเตเดเดพเดจเตเด เดเดพเตป เดถเตเดชเดพเตผเดถ เดเตเดฏเตเดฏเตเดจเตเดจเตเดเดชเตเดชเดฟเดเตฝ เดจเดเดคเตเดคเตเด , เดเดชเตเดชเดฟเดเดพเดคเตเดค เดเดฎเตเดฎเดฟเดฑเตเดฑเต เดซเตเดฒเดพเดเต เดจเดฟเดฐเดธเดฟเดเตเดเตเด. - เด
เดเตเดคเตเดคเดคเดพเดฏเดฟ, เดเดพเดธเตโเดเตเดเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดจเดฟเดเตเดเตพ เดเดฐเต เดเตเดฐเดฟเดเตผ เดเตเตบเดซเดฟเดเตผ เดเตเดฏเตเดฏเตเดฃเตเดเดคเตเดฃเตเดเต
เดชเตเดฐเตเดเดเตเดฑเตเดฑเต -> เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ -> CI / CD -> เดชเตเดชเตเดชเตเดฒเตเตป เดเตเดฐเดฟเดเดฑเตเดเตพ เดเดจเตเดจเดคเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ เดเดฐเต เดชเตเดคเดฟเดฏ เดเตเดฐเดฟเดเตผ-เดเตเดเตเดเตบ เดธเตเดทเตเดเดฟเดเตเดเตเด
เดเดฐเต เดเตเดเตเดเด เดชเตเดฐเตเดเดเตเดฑเตเดฑเตเดเตพเดเตเดเตเดณเตเดณ เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเดณเตเดเต เดชเตเดคเตเดตเดพเดฏ เดเตเตบเดซเดฟเดเดฑเตเดทเดจเดฟเดฒเตเดเตเดเต เด เดเตเดเตเดเตบ เดเดเดจเดเดฟ เดเตเตผเดเตเดเดพเดตเตเดจเตเดจเดคเดพเดฃเต.
เดเตเดฐเตเดชเตเดชเต -> เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ -> CI / CD -> เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเตพ เดเดจเตเดจเดคเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ เดเดฐเต เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดเตเตผเดเตเดเตเดDEPLOY_TOKEN
เดฎเตเดฒเตเดฏเดคเตเดคเดฟเตฝ เดเตเดฐเดฟเดเตผ-เดเตเดเตเดเดฃเดฟเดจเตเดชเตเดชเด.
GitLab เดฑเดฃเตเดฃเตผ
เดจเตเดฑเตเดฑเตเดตเต (เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด), เดชเตเดคเต (เดชเดเตเดเดฟเดเตเด) เดฑเดฃเตเดฃเตผ เดเดจเตเดจเดฟเดต เดเดชเดฏเตเดเดฟเดเตเดเต เดตเดฟเดจเตเดฏเดธเดฟเดเตเดเตเดฎเตเดชเตเตพ เดเดพเดธเตโเดเตเดเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเตเตบเดซเดฟเดเดฑเตเดทเตป เด เดตเดฟเดญเดพเดเด เดตเดฟเดตเดฐเดฟเดเตเดเตเดจเตเดจเต.
เดชเตเดฐเดคเตเดฏเตเด เดฑเดฃเตเดฃเตผ
เดเดพเตป เดเดจเตเดฑเต เดธเตเดตเดจเตเดคเด เดฑเดฃเตเดฃเตเดดเตเดธเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต, เดเดพเดฐเดฃเด, เดเดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดเดคเต เดธเตเดเดฐเตเดฏเดชเตเดฐเดฆเดตเตเด เดตเตเดเดคเดฏเตเดฑเดฟเดฏเดคเตเด เดตเดฟเดฒเดเตเดฑเดเตเดเดคเตเดฎเดพเดฃเต.
เดฑเดฃเตเดฃเตผเดเตเดเดพเดฏเดฟ เดเดพเตป 1 เดธเดฟเดชเดฟเดฏเต, 2 เดเดฟเดฌเดฟ เดฑเดพเด, 20 เดเดฟเดฌเดฟ เดเดเตเดเตเดกเดฟเดกเดฟ เดเดณเตเดณ เดฒเดฟเดจเดเตเดธเต เดตเดฟเดกเดฟเดเดธเต เดถเตเดชเดพเตผเดถ เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเดทเตเดฏเต เดตเดฟเดฒ เดชเตเดฐเดคเดฟเดตเตผเดทเด ~3000โฝ เดเดฃเต.
เดเดจเตเดฑเต เดเดเตเดเดเตเดเดพเดฐเตป
เดฑเดฃเตเดฃเดฑเดฟเดจเดพเดฏเดฟ เดเดพเตป VDS 4 CPU, 4 GB RAM, 50 GB SSD เดเดจเตเดจเดฟเดต เดเดเตเดคเตเดคเต. เดตเดฟเดฒ ~11000โฝ, เดเดฐเดฟเดเตเดเดฒเตเด เดเตเดฆเดฟเดเตเดเดฟเดฒเตเดฒ.
เดเดจเดฟเดเตเดเต เดเดเต 7 เดฎเตเดทเตเดจเตเดเตพ เดเดฃเตเดเต. เด
เดฐเตเดฌเดฏเดฟเตฝ 5 เดเด เดเดนเตเดฑเดฟเตฝ 2 เดเด.
เด
เดคเดฟเดจเดพเตฝ เดเดเตเดเตพเดเตเดเต เดเดฐเต เดเดเตเดเดเตเดเดพเดฐเตป เดเดฃเตเดเต. เดเดชเตเดชเตเตพ เดเดเตเดเตพ เด
เดคเต เดเตเดฐเดฎเตเดเดฐเดฟเดเตเดเตเด.
เดเดเตเดเตพ SSH เดตเดดเดฟ เดฎเตเดทเตเดจเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ java, git, maven, gnupg2 เดเดจเตเดจเดฟเดต เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเดจเตเดจเต.
gitlab เดฑเดฃเตเดฃเตผ เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเดจเตเดจเต
- เดเดฐเต เดชเตเดคเดฟเดฏ เดเตเดฐเตเดชเตเดชเต เดเดฃเตเดเดพเดเตเดเตเด
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 -> Runners -> Specific Runners เดเดจเตเดจเดคเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ เดฐเดเดฟเดธเตเดเตเดฐเตเดทเตป เดเตเดเตเดเตบ เดชเดเตผเดคเตเดคเตเด
เดธเตเดเตเดฐเตเตป
- เดเดเตเดเดเตเดเดพเดฐเดจเต เดฐเดเดฟเดธเตเดฑเตเดฑเตผ เดเตเดฏเตเดฏเตเดจเตเดจเต
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 -> Runners -> Specific Runners -> Runners เด เดชเตเดฐเตเดเดเตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เดธเดเตเดตเดฎเดพเดเตเดเดฟ
เดธเตเดเตเดฐเตเตป
- เดเตเตผเดเตเดเตเด เดตเตเตผเดคเดฟเดฐเดฟเดเตเดเตเด เดธเตเดตเดจเด
/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
(เดเดฟเดชเดฟเดเดฟ เดเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต)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>
- เดธเตเดฃเดเตเดชเตเดชเต เด
เดเตเดเตเดฃเตเดเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดพเดธเตโเดตเตเดกเต เดเตปเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเต
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 - เดธเตเดฃเดเตเดชเตเดชเต เด
เดเตเดเตเดฃเตเดเต เดฒเตเดเดฟเตป
เดเดคเต เดฑเดฃเตเดฃเตผ เดธเดเตเดเตเดเดฐเดฃเด เดชเตเตผเดคเตเดคเดฟเดฏเดพเดเตเดเตเดจเตเดจเต, เดจเดฟเดเตเดเตพเดเตเดเต เดตเดฟเดญเดพเดเดคเตเดคเดฟเดฒเตเดเตเดเต เดชเตเดเดพเด
เดชเดเตเดเดฟเดเตเด เดฑเดฃเตเดฃเตผ
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>
- เดธเตเดฃเดเตเดชเตเดชเต เด
เดเตเดเตเดฃเตเดเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดพเดธเตโเดตเตเดกเต เดเตปเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเต
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 - เดธเตเดฃเดเตเดชเตเดชเต เด
เดเตเดเตเดฃเตเดเต เดฒเตเดเดฟเตป
เดกเตเดเตเดเตผ เดเดฟเดคเตเดฐเด เดตเดฟเดจเตเดฏเดธเดฟเดเตเดเตเด
-
เดเดพเดตเดฏเตเดเต เดเดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเดคเดฟเดชเตเดชเต เดเดชเดฏเตเดเดฟเดเตเดเต เดตเดฟเดจเตเดฏเดธเดฟเดเตเดเตเดฎเตเดชเตเตพ เดเดพเดธเตโเดเตเดเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดเตเดเตพ เดตเดณเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดเดฐเต เดกเตเดเตเดเตผเดซเดฏเตฝ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเต. เดเตฝเดชเตเดจเดฟเดจเตเดณเตเดณ เดเดฐเต เดเดฆเดพเดนเดฐเดฃเด เดเตเดตเดเตเดฏเตเดฃเตเดเต.
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 เดเตเดเดชเตเดฒเตเดฑเตเดฑเต เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดคเตเดฐเตเดฎเดพเดจเดฟเดเตเดเต.
เดเตเดเตเดคเตฝ เดตเดฟเดถเดฆเดพเดเดถเดเตเดเตพ
เดเดพเตป เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดธเตเดทเตเดเดฟเดเตเดเต
common.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-plugin
เดชเตเดฐเตเดเดเตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เดเดพเดตเดกเตเดเตเดเต เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเดจเตเดจเต.
<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] ------------------------------------------------------------------------
เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดจเตเดเตเดธเดธเต เดชเดคเดฟเดชเตเดชเต เดฒเตเดกเต เดเตเดฏเตเดคเต
เดธเตเดฑเตเดฑเดฟเดฒเต เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฒเตเดฒเดพ เดธเตเดจเดพเดชเตเดชเตเดทเตเดเตเดเต เดชเดคเดฟเดชเตเดชเตเดเดณเตเด เดจเตเดเตเดเด เดเตเดฏเตเดฏเดพเดตเตเดจเตเดจเดคเดพเดฃเต
เดฑเดฟเดฒเตเดธเต เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต เดชเตเดฐเดธเดฟเดฆเตเดงเตเดเดฐเดฃเด
เดเดฐเต เดเดพเดเต เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเดฎเตเดชเตเตพ, nexus-เดฒเตเดเตเดเต เดฑเดฟเดฒเตเดธเต เดชเดคเดฟเดชเตเดชเต เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดตเดฟเดจเตเดฏเดพเดธ เดชเตเดฐเตเดเดเตเดฑเตเดฑเดฟเดฒเต เด
เดจเตเดฌเดจเตเดง เดเดพเดธเตเดเตเดเต เดธเตเดตเดฏเดฎเตเดต เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเด (
เดเตเดฒเตเดธเต เดฑเดฟเดฒเตเดธเต เดธเตเดตเดฏเดฎเตเดต เดจเตเดเตเดธเดธเดฟเตฝ เดเตเดฐเดฟเดเตผ เดเตเดฏเตเดฏเตเดจเตเดจเต เดเดจเตเดจเดคเดพเดฃเต เดเดฑเตเดฑเดตเตเด เดจเดฒเตเดฒ เดญเดพเดเด.
[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 เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดเดฑเตเดฑเดจเตเดเตเดเดคเตเดคเดฟเตฝ เดคเตเดจเตเดจเตเดจเตเดจเดคเตเดฐ เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ เดเดฐเต เดตเดฟเดทเดฏเดฎเดฒเตเดฒ. เดฐเดฃเตเดเต เดคเดตเดฃ เดเดฐเต เดเตเตบเดเต เด เดเดฟเดธเตเดฅเดพเดจเดคเตเดคเดฟเตฝ CI เดธเดเตเดเตเดเดฐเดฟเดเตเดเดพเตป เดเดคเต เดฎเดคเดฟเดฏเดพเดเตเด, เดเดชเตเดชเตเตพ เดจเดฟเดเตเดเตพ เด เดตเดฟเดทเดฏเดคเตเดคเดฟเตฝ เดเดฐเต เด เดฎเตเดเตเดตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดณเดฐเต เด เดเดฒเตเดฏเดพเดฃเต. เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, GitLab เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเตป เดตเดณเดฐเต เด เดจเดพเดตเดถเตเดฏเดฎเดพเดฃเต. เดเดฆเตเดฏเดชเดเดฟ เดธเตเดตเตเดเดฐเดฟเดเตเดเดพเตป เดญเดฏเดชเตเดชเตเดเดฐเตเดคเต. เดจเดเดจเตเดจเตเดชเตเดเตเดจเตเดจ เดเดณเตเดเต เดชเดเดฟเดเตเดเตเดเตเดเดฟเดจเดเดฟเดฏเดฟเตฝ เดฑเตเดกเต เดฆเตเดถเตเดฏเดฎเดพเดเตเดจเตเดจเต (เดเดฐเดพเดฃเต เดชเดฑเดเตเดเดคเต เดเดจเตเดจเต เดเดจเดฟเดเตเดเต เดเตผเดฎเดฏเดฟเดฒเตเดฒ :)
เดซเตเดกเตโเดฌเดพเดเตเดเต เดฒเดญเดฟเดเตเดเตเดจเตเดจเดคเดฟเตฝ เดเดพเตป เดธเดจเตเดคเตเดทเตเดเดจเดพเดเตเด.
เด เดเตเดคเตเดค เดฒเตเดเดจเดคเตเดคเดฟเตฝ, เดจเดฟเดเตเดเตพเดเตเดเต เดเดฐเต เดทเตเตฝ เดฑเดฃเตเดฃเตผ เดฎเดพเดคเตเดฐเดฎเต เดเดณเตเดณเตเดตเตเดเตเดเดฟเตฝ, เดเดจเตเดฑเดเตเดฐเตเดทเตป เดเตเดธเตเดฑเตเดฑเต เดเดพเดธเตโเดเตเดเตเดเตพ เดฎเดคเตเดธเดฐเดพเดงเดฟเดทเตเด เดฟเดคเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต (เดกเตเดเตเดเตผ-เดเดเดชเตเดธเต เดเดชเดฏเตเดเดฟเดเตเดเต เดเตเดธเตเดฑเตเดฑเต เดธเตเดตเดจเดเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต) GitLab CI เดเดเตเดเดจเต เดธเดเตเดเตเดเดฐเดฟเดเตเดเดพเดฎเตเดจเตเดจเต เดเดพเตป เดเดพเดฃเดฟเดเตเดเตเดคเดฐเดพเด.
เด เดตเดฒเดเดฌเด: www.habr.com