เจเจน เจฒเฉเจ เจเจพเจตเจพ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฒเจ เจคเจฟเจเจฐ เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจเจฟเจจเฉเจนเจพเจ เจจเฉเฉฐ GitLab เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจธเฉเจจเจพเจเจพเจเจช เจ เจคเฉ/เจเจพเจ เจฎเฉเจตเฉเจจ เจธเฉเจเจเจฐเจฒ เจฐเจฟเจชเฉเจเจผเจเจฐเฉเจเจ เจตเจฟเฉฑเจ เจเจชเจฃเฉ เจเจคเจชเจพเจฆเจพเจ เจจเฉเฉฐ เจเจฒเจฆเฉ เจชเฉเจฐเจเจพเจธเจผเจฟเจค เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ เจฎเฉเจ เจเจธ เจธเจฎเฉฑเจธเจฟเจ เจจเฉเฉฐ เจนเฉฑเจฒ เจเจฐเจจ เจฒเจ gitlab-runner, gitlab-ci เจ เจคเฉ maven-plugin เจธเจฅเจพเจชเจค เจเจฐเจจ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเจพเจเจเจพเฅค
เจเจผเจฐเฉเจฐเฉ เจธเจผเจฐเจคเจพเจ:
- mvn เจ เจคเฉ GPG เจเฉเฉฐเจเฉเจเจ เจฆเฉ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจธเจเฉเจฐเฉเจเฅค
- เจเจจเจคเจ CI เจเจพเจฐเจเจพเจ เจฆเจพ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเจเจเจผเฉเจเจฟเจเจธเจผเจจเฅค
- เจเจจเจคเจ เจญเฉฐเจกเจพเจฐเจพเจ เจตเจฟเฉฑเจ เจเจฒเจพเจคเจฎเจ เจเฉเจเจผเจพเจ (เจฐเจฟเจฒเฉเจเจผ/เจธเจจเฉเจชเจธเจผเจพเจ) เจ เฉฑเจชเจฒเฉเจก เจเจฐเจจเจพเฅค
- เจฎเจพเจตเฉเจจ เจธเฉเจเจเจฐเจฒ เจตเจฟเฉฑเจ เจชเฉเจฐเจเจพเจธเจผเจจ เจฒเจ เจฐเฉเจฒเฉเจเจผ เจธเฉฐเจธเจเจฐเจฃเจพเจ เจฆเฉ เจเจเฉเจฎเฉเจเจฟเจ เจเจพเจเจเฅค
- เจฎเจฒเจเฉเจชเจฒ เจชเฉเจฐเฉเจเฉเจเจเจพเจ เจฒเจ เจเฉฑเจ เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจตเจฟเฉฑเจ เจเจฒเจพเจคเจฎเจ เจเฉเจเจผเจพเจ เจจเฉเฉฐ เจ เจชเจฒเฉเจก เจเจฐเจจ เจฒเจ เจเฉฑเจ เจเจฎ เจนเฉฑเจฒเฅค
- เจธเจพเจฆเจเฉ เจ เจคเฉ เจตเจฐเจคเฉเจ เจตเจฟเฉฑเจ เจเจธเจพเจจเฉ.
เจธเจฎเฉฑเจเจฐเฉ
เจเจฎ เจเจพเจฃเจเจพเจฐเฉ GitLab เจตเจฟเฉฑเจ เจเฉฑเจ เจชเฉเจฐเฉเจเฉเจเจ เจคเฉเจจเจพเจคเฉ เจธเจฅเจพเจชเจค เจเจฐเจจเจพ GitLab เจฆเฉเฉเจพเจ เจเจฟเฉฑเจเจฒเจพเจฌ เจธเฉ.เจเจ. Pom.xml เจธเฉฐเจฐเจเจจเจพ เจเจธ เจฆเจพ เจจเจคเฉเจเจพ เจธเจฟเฉฑเจเจพ
เจเจฎ เจเจพเจฃเจเจพเจฐเฉ
- เจธเฉเจจเจพเจเจพเจเจช เจเจเจธเจเจธ เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจนเฉเจธเจเจฟเฉฐเจ เจธเฉเจตเจพ เจฆเฉเจเจฐเจพ เจฎเจพเจตเฉเจจ เจธเฉเจเจเจฐเจฒ เจตเจฟเฉฑเจ เจเจฒเจพเจเฉเจฐเจฟเจคเฉเจเจ เจจเฉเฉฐ เจชเฉเจฐเจเจพเจธเจผเจฟเจค เจเจฐเจจ เจฒเจ เจตเจฟเจงเฉ เจฆเจพ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจตเจฐเจฃเจจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจตเจฟเฉฑเจ เจฆเฉฑเจธเจฟเจ เจเจฟเจ เจนเฉเฅค
เจเจน เจฒเฉเจ เจเจชเจญเฉเจเจคเจพGoogolplex , เจเจธ เจฒเจ เจฎเฉเจ เจเจธ เจฒเฉเจ เจฆเจพ เจธเจนเฉ เจธเจฅเจพเจจเจพเจ 'เจคเฉ เจนเจตเจพเจฒเจพ เจฆเฉเจตเจพเจเจเจพเฅค - เจฒเจ เจชเฉเจฐเฉ-เจฐเจเจฟเจธเจเจฐ เจเจฐเฉ
เจธเฉเจจเจพเจเจพเจเจช เจเฉเจฐเจพ เจ เจคเฉ เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจเฉเจฒเฉเจนเจฃ เจฒเจ เจเฉฑเจ เจเจฟเจเจ เจเฉเจฒเฉเจนเฉ (เจตเจงเฉเจฐเฉ เจตเฉเจฐเจตเจฟเจเจ เจฒเจ เจญเจพเจ เจชเฉเฉเจนเฉเจธเฉเจจเจพเจเจพเจเจช เจเฉเจฐเจพ 'เจคเฉ เจเจฟเจเจ เจฌเจฃเจพเจ ). เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจเฉเจฒเฉเจนเจฃ เจคเฉเจ เจฌเจพเจ เจฆ, JIRA เจคเฉเจ เจฒเฉเจเจเจจ/เจชเจพเจธเจตเจฐเจก เจเฉเฉเจพ (เจเจธ เจคเฉเจ เจฌเจพเจ เจฆ เจธเฉเจจเจพเจเจพเจเจช เจเจพเจคเฉ เจตเจเฉเจ เจเจพเจฃเจฟเจ เจเจพเจเจฆเจพ เจนเฉ) เจฆเฉ เจตเจฐเจคเฉเจ เจธเฉเจจเจพเจเจพเจเจช เจเจ เจเฉเฉ 'เจคเฉ เจเจฒเจพเจเฉเจฐเจฟเจคเฉเจเจ เจจเฉเฉฐ เจ เฉฑเจชเจฒเฉเจก เจเจฐเจจ เจฒเจ เจเฉเจคเฉ เจเจพเจตเฉเจเฉเฅค - เจ
เฉฑเจเฉ, เจเฉฑเจ GPG เจเฉเฉฐเจเฉ เจฌเจฃเจพเจเจฃ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจจเฉเฉฐ เจฌเจนเฉเจค เจเฉเจธเจผเจ เจคเจฐเฉเจเฉ เจจเจพเจฒ เจฆเฉฑเจธเจฟเจ เจเจฟเจ เจนเฉเฅค เจนเฉเจฐ เจตเฉเจฐเจตเจฟเจเจ เจฒเจ เจธเฉเจเจธเจผเจจ เจฆเฉเจเฉ
เจเจฐเจเฉเจซเฉเจเจเจพเจ 'เจคเฉ เจฆเจธเจคเจเจค เจเจฐเจจ เจฒเจ GnuPG เจฆเฉ เจธเฉฐเจฐเจเจจเจพ เจเฉเจคเฉ เจเจพ เจฐเจนเฉ เจนเฉ - เจเฉเจเจฐ เจคเฉเจธเฉเจ เจเฉฑเจ GPG เจเฉเฉฐเจเฉ (gnupg/gnupg2) เจฌเจฃเจพเจเจฃ เจฒเจ เจฒเฉเจจเจเจธ เจเฉฐเจธเฉเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉฐเจธเจเจพเจฒ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค
rng- เจธเฉฐเจฆ เจเจจเจเฉเจฐเฉเจชเฉ เจฌเจฃเจพเจเจฃ เจฒเจเฅค เจจเจนเฉเจ เจคเจพเจ, เจเฉเฉฐเจเฉ เจฌเจฃเจพเจเจฃ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจฒเฉฐเจฎเจพ เจธเจฎเจพเจ เจฒเฉฑเจ เจธเจเจฆเจพ เจนเฉเฅค - เจธเจเฉเจฐเฉเจ เจธเฉเจตเจพเจตเจพเจ เจเจจเจคเจ GPG เจเฉเฉฐเจเฉเจเจ
http://keys.gnupg.net http://pool.sks-keyservers.net http://keyserver.ubuntu.com
GitLab เจตเจฟเฉฑเจ เจเฉฑเจ เจคเฉเจจเจพเจค เจชเฉเจฐเฉเจเฉเจเจ เจธเจฅเจพเจชเจค เจเจฐเจจเจพ
- เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจคเฉเจนเจพเจจเฉเฉฐ เจเฉฑเจ เจชเฉเจฐเฉเจเฉเจเจ เจฌเจฃเจพเจเจฃ เจ
เจคเฉ เจเฉเจเจซเจฟเจเจฐ เจเจฐเจจ เจฆเฉ เจเจผเจฐเฉเจฐเจค เจนเฉ เจเจฟเจธ เจตเจฟเฉฑเจ เจชเจพเจเจชเจฒเจพเจเจจ เจจเฉเฉฐ เจเจฐเจเฉเจซเฉเจเจเจพเจ เจจเฉเฉฐ เจคเฉเจจเจพเจค เจเจฐเจจ เจฒเจ เจธเจเฉเจฐ เจเฉเจคเจพ เจเจพเจตเฉเจเจพเฅค เจฎเฉเจ เจเจชเจฃเฉ เจชเฉเจฐเฉเจเฉเจเจ เจฆเจพ เจจเจพเจฎ เจธเจงเจพเจฐเจจ เจ
เจคเฉ เจ
เจธเฉฐเจญเจต เจคเฉเจฐ 'เจคเฉ เจฐเฉฑเจเจฟเจ เจนเฉ -
เจตเฉฐเจกเฉ - เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจฌเจฃเจพเจเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ, เจคเฉเจนเจพเจจเฉเฉฐ เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจฌเจฆเจฒเจฃ เจฒเจ เจชเจนเฉเฉฐเจ เจจเฉเฉฐ เจธเฉเจฎเจค เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค
เจชเฉเจฐเฉเจเฉเจเจ -> เจธเฉเจเจฟเฉฐเจเจพเจ -> เจฐเจฟเจชเฉเจเจผเจเจฐเฉ -> เจธเฉเจฐเฉฑเจเจฟเจ เจค เจธเจผเจพเจเจพเจตเจพเจ 'เจคเฉ เจเจพเจเฅค เจ เจธเฉเจ เจธเจพเจฐเฉ เจจเจฟเจฏเจฎเจพเจ เจจเฉเฉฐ เจฎเจฟเจเจพเจเจเจฆเฉ เจนเจพเจ เจ เจคเฉ เจตเจพเจเจฒเจกเจเจพเจฐเจก * เจฆเฉ เจจเจพเจฒ เจธเจฟเจฐเจซเจผ เจฎเฉเจจเจเฉเจจเจฐเจเจผ เจฆเฉ เจญเฉเจฎเจฟเจเจพ เจตเจพเจฒเฉ เจเจชเจญเฉเจเจคเจพเจตเจพเจ เจฒเจ เจงเฉฑเจเจฃ เจ เจคเฉ เจ เจญเฉเจฆ เจเจฐเจจ เจฆเฉ เจ เจงเจฟเจเจพเจฐ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจธเจฟเฉฐเจเจฒ เจจเจฟเจฏเจฎ เจเฉเฉเจฆเฉ เจนเจพเจเฅค เจเจน เจจเจฟเจฏเจฎ เจเจธ เจชเฉเจฐเฉเจเฉเจเจ เจ เจคเฉ เจธเจฎเฉเจน เจฆเฉ เจธเจพเจฐเฉ เจเจชเจญเฉเจเจคเจพเจตเจพเจ เจฒเจ เจเฉฐเจฎ เจเจฐเฉเจเจพ เจเจฟเจธ เจจเจพเจฒ เจเจน เจชเฉเจฐเฉเจเฉเจเจ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจนเฉเฅค
- เจเฉ เจเฉฑเจฅเฉ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจชเฉเจฐเจฌเฉฐเจงเจ เจนเจจ, เจคเจพเจ เจธเจญ เจคเฉเจ เจตเจงเฉเจ เจนเฉฑเจฒ เจธเจฟเจงเจพเจเจค เจตเจฟเฉฑเจ เจชเฉเจฐเฉเจเฉเจเจ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจจเฉเฉฐ เจธเฉเจฎเจค เจเจฐเจจเจพ เจนเฉเจตเฉเจเจพเฅค
เจชเฉเจฐเฉเจเฉเจเจ -> เจธเฉเจเจฟเฉฐเจเจพเจ -> เจเจฎ -> เจฆเจฟเฉฑเจ, เจชเฉเจฐเฉเจเฉเจเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ, เจ เจจเฉเจฎเจคเฉเจเจ 'เจคเฉ เจเจพเจ เจ เจคเฉ เจชเฉเจฐเฉเจเฉเจเจ เจฆเฉ เจฆเจฟเฉฑเจ เจจเฉเฉฐ เจธเฉเฉฑเจ เจเจฐเฉ เจชเฉเจฐเจพเจเจตเฉเจ.
เจฎเฉเจฐเฉ เจเฉเจฒ เจเฉฑเจ เจเจจเจคเจ เจคเฉเจฐ 'เจคเฉ เจชเจนเฉเฉฐเจเจฏเฉเจ เจชเฉเจฐเฉเจเฉเจเจ เจนเฉ, เจเจฟเจเจเจเจฟ เจฎเฉเจ เจเจชเจฃเฉ เจเฉเจฆ เจฆเฉ 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 เจ
เจฐเฉเจฌเจพ 'เจคเฉ เจ
เจคเฉ 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
Maven เจฆเฉ เจธเจฅเจพเจชเจจเจพ เจเฉเจคเฉ เจเจพ เจฐเจนเฉ เจนเฉ
- เจเจชเจญเฉเจเจคเจพ เจตเจเฉเจ เจฒเฉเจเจเจจ เจเจฐเฉ
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 โ 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
Maven เจฆเฉ เจธเจฅเจพเจชเจจเจพ เจเฉเจคเฉ เจเจพ เจฐเจนเฉ เจนเฉ
- เจเฉฑเจ เจฎเจพเจธเจเจฐ เจเฉเฉฐเจเฉ เจฌเจฃเจพเจ
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 โ 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}
เจเจธ เจนเฉฑเจฒ เจตเจฟเฉฑเจ, เจฎเฉเจ เจฅเฉเฉเจพ เจนเฉเจฐ เจ เฉฑเจเฉ เจเจฟเจ เจ เจคเฉ เจเจพเจตเจพ เจชเฉเจฐเฉเจเฉเจเจเจพเจ เจฒเจ เจเฉฑเจ เจธเฉเจเจ เจเฉเจเจชเจฒเฉเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ.
เจนเฉเจฐ เจตเฉเจฐเจตเฉ
เจฎเฉเจ เจเฉฑเจ เจตเฉฑเจเจฐเจพ เจชเฉเจฐเฉเจเฉเจเจ เจฌเจฃเจพเจเจ เจนเฉ
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-เจชเจฒเฉฑเจเจเจจ
เจชเฉเจฐเฉเจเฉเจเจ เจฒเจ 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>
เจเฉเจเจฐ เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจเฉฑเจ เจฎเจฒเจเฉ-เจฎเฉเจกเจฟเจเจฒ เจชเฉเจฐเฉเจเฉเจเจ เจนเฉ เจ
เจคเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจตเจฟเฉฑเจ เจเฉฑเจ เจเจพเจธ เจฎเฉเจกเฉเจเจฒ เจ
เฉฑเจชเจฒเฉเจก เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเฉเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ 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