เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ java เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบœเบตเบเปเบœเปˆเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบขเปˆเบฒเบ‡เป„เบงเบงเบฒเปƒเบ™ sonatype เปเบฅเบฐ / เบซเบผเบท maven repositories เบเบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰ GitLab. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ gitlab-runner, gitlab-ci เปเบฅเบฐ maven-plugin เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰.

เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™:

  • เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ—เบตเปˆเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบเบฐเปเบˆ mvn เปเบฅเบฐ GPG.
  • เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™ CI เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ.
  • เบเบณเบฅเบฑเบ‡เบญเบฑเบšเป‚เบซเบผเบ”เบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ” (เบ›เปˆเบญเบเบ•เบปเบง/เบžเบฒเบšเบ–เปˆเบฒเบ) เป„เบ›เปƒเบชเปˆเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ.
  • เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เบชเบฐเบšเบฑเบšเบ›เปˆเบญเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบดเบกเป€เบœเบตเบเปเบœเปˆเปƒเบ™ maven Central.
  • เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบปเปˆเบงเป„เบ›เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฑเบšเป‚เบซเบฅเบ” artifacts เบเบฑเบš repository เบชเปเบฒเบฅเบฑเบšเบซเบผเบฒเบเป‚เบ„เบ‡เบเบฒเบ™.
  • เบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰.

เป€เบ™เบทเป‰เบญเปƒเบ™

เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบปเปˆเบงโ€‹เป„เบ›

  • เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบปเบ™โ€‹เป„เบโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบžเบดเบกโ€‹เป€เบœเบตเบโ€‹เปเบœเปˆโ€‹เบงเบฑเบ”โ€‹เบ–เบธโ€‹เบšเบนโ€‹เบฎเบฒเบ™โ€‹เปƒเบ™ Maven Central เบœเปˆเบฒเบ™ Sonatype OSS Repository Hosting Service เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เปเบฅเป‰เบงโ€‹เปƒเบ™ เบซเบปเบงโ€‹เบ‚เปเป‰โ€‹เบ™เบตเป‰ เบœเบนเป‰เปƒเบŠเป‰ Googolplex, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเป‰เบฒเบ‡เป€เบ–เบดเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก.
  • เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบฅเปˆเบงเบ‡เปœเป‰เบฒเบชเบณเบฅเบฑเบš Sonatype JIRA เปเบฅเบฐเป€เบ›เบตเบ”เบ›เบตเป‰เป€เบžเบทเปˆเบญเป€เบ›เบตเบ” repository (เบญเปˆเบฒเบ™เบžเบฒเบเบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก เบชเป‰เบฒเบ‡เบ›เบตเป‰เปƒเบ™ Sonatype JIRA). เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบ›เบตเบ”เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™, เบ„เบนเปˆเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš / เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบˆเบฒเบ JIRA (เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบšเบฑเบ™เบŠเบต Sonatype) เบˆเบฐเบ–เบทเบเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”เปƒเบชเปˆ Sonatype nexus.
  • เบ•เปเปˆเป„เบ›, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ” GPG เป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเบขเปˆเบฒเบ‡เปเบซเป‰เบ‡เปเบฅเป‰เบ‡. เป€เบšเบดเปˆเบ‡เบžเบฒเบเบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก เบเบณเบ™เบปเบ”เบ„เปˆเบฒ GnuPG เป€เบžเบทเปˆเบญเป€เบŠเบฑเบ™เบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”
  • เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰ Linux console เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ” GPG (gnupg/gnupg2), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡. rng-tools เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡ entropy. เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฐเปเบˆเบญเบฒเบ”เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบ”เบปเบ™เบซเบผเบฒเบ.
  • เบšเปเบฅเบดเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ เบเบฐเปเบˆ GPG

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เปƒเบ™ GitLab

  • เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ—เปˆเบฒเบ™ เบˆเบณ เป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เปเบฅเบฐ เบเบณ เบ™เบปเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ—เปเปˆเบ™เบฑเป‰เบ™เบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เป€เบžเบทเปˆเบญ เบ™เบณ เปƒเบŠเป‰เบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”. เบ‚เป‰เบญเบเบ•เบฑเป‰เบ‡เบŠเบทเปˆเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบšเบšเบ‡เปˆเบฒเบเป†เปเบฅเบฐเบšเปเปˆเบชเบฑเบšเบชเบปเบ™ - deploy
  • เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบชเป‰เบฒเบ‡ repository, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป€เบžเบทเปˆเบญเบ›เปˆเบฝเบ™ repository.
    เป„เบ›โ€‹เบ—เบตเปˆโ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™ -โ€‹> เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒ -โ€‹> Repository -โ€‹> เบชเบฒเบ‚เบฒโ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบปเบโ€‹เบ›เป‰เบญเบ‡โ€‹. เบžเบงเบเป€เบฎเบปเบฒเบฅเบถเบšเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ”เบฝเบงเบเบฑเบš Wildcard * เบ—เบตเปˆเบกเบตเบชเบดเบ”เบ—เบดเปƒเบ™เบเบฒเบ™เบŠเบธเบเบเบนเป‰เปเบฅเบฐเบฅเบงเบกเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบกเบตเบšเบปเบ”เบšเบฒเบ” Maintainers. เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เปเบฅเบฐเบเบธเปˆเบกเบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เบ‚เบถเป‰เบ™เบเบฑเบš.
    เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central
  • เบ–เป‰เบฒเบกเบตเบœเบนเป‰เบฎเบฑเบเบชเบฒเบซเบผเบฒเบเป†เบ„เบปเบ™, เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบเบฒเบ™เบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™.
    เป„เบ›โ€‹เบ—เบตเปˆโ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™ -โ€‹> เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒ -โ€‹> เบ—เบปเปˆเบงโ€‹เป„เบ› -โ€‹> เบเบฒเบ™โ€‹เบชเบฑเบ‡โ€‹เป€เบเบ”โ€‹เป€เบซเบฑเบ™โ€‹, เบ„เบธเบ™โ€‹เบ™เบฐโ€‹เบชเบปเบกโ€‹เบšเบฑเบ”โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹, เบเบฒเบ™โ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปเบฅเบฐโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™โ€‹เบชเบฑเบ‡โ€‹เป€เบเบ”โ€‹เบ‚เบญเบ‡โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เป€เบ›เบฑเบ™โ€‹ เบชเปˆเบงเบ™เบ•เบปเบง.
    เบ‚เป‰เบญเบเบกเบตเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเป„เบ”เป‰, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ‚เป‰เบญเบเปƒเบŠเป‰ GitLab Runner เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบญเบ‡เปเบฅเบฐเบ‚เป‰เบญเบเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ repository. เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเบ—เบตเปˆเบˆเบฐเบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบกเบนเบ™เบชเปˆเบงเบ™เบ•เบปเบงเปƒเบ™เบšเบฑเบ™เบ—เบถเบเบ—เปเปˆเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ.
  • เป€เบ„เบฑเปˆเบ‡โ€‹เบ„เบฑเบ”โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เบ‚เบญเบ‡ repositoryโ€‹
    เป„เบ›เบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™ -> Settings -> Repository -> Push Rules เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ‚เบญเบ‡ Committer, เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบœเบนเป‰เบ‚เบฝเบ™เป€เบ›เบฑเบ™เบ—เบธเบ‡เบœเบนเป‰เปƒเบŠเป‰ GitLab. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบ•เบฑเป‰เบ‡ เบชเบฑเบ™เบเบฒเบฅเบฒเบเป€เบŠเบฑเบ™, เปเบฅเบฐเบ•เบฑเป‰เบ‡เบ—เบธเบ‡ Reject unsigned commits.
  • เบ•เปเปˆเป„เบ›, เบ—เปˆเบฒเบ™ เบˆเบณ เป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเบเบฐเบ•เบธเป‰เบ™เป€เบžเบทเปˆเบญเป€เบ›เบตเบ” เปœเป‰เบฒ เบงเบฝเบ
    เป„เบ›เบ—เบตเปˆ project -> Settings -> CI / CD -> Pipeline triggers เปเบฅเบฐเบชเป‰เบฒเบ‡ trigger-token เปƒเปเปˆ.
    token เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบžเบตเปˆเบกเบ—เบฑเบ™เบ—เบตเปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบ•เบปเบงเปเบ›เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบกเป‚เบ„เบ‡เบเบฒเบ™.
    เป„เบ›เบ—เบตเปˆเบเบธเปˆเบก -> เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ -> CI / CD -> เบ•เบปเบงเปเบ›เปเบฅเบฐเป€เบžเบตเปˆเบกเบ•เบปเบงเปเบ› DEPLOY_TOKEN เบเบฑเบš trigger-token เปƒเบ™เบกเบนเบ™เบ„เปˆเบฒ.

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เปเบฅเปˆเบ™ GitLab

เบžเบฒเบเบชเปˆเบงเบ™เบ™เบตเป‰เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบเบณเบ™เบปเบ”เบ„เปˆเบฒเบชเบณเบฅเบฑเบšเบเบฒเบ™เปเบฅเปˆเบ™เปœเป‰เบฒเบงเบฝเบเปƒเบ™เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเปเบฅเปˆเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡ (เบชเบฐเป€เบžเบฒเบฐ) เปเบฅเบฐเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ (เปเบšเปˆเบ‡เบ›เบฑเบ™).

เบ™เบฑเบเปเบฅเปˆเบ™เบชเบฐเป€เบžเบฒเบฐ

เบ‚เป‰เบญเบเปƒเบŠเป‰เบ™เบฑเบเปเบฅเปˆเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบญเบ‡เป€เบžเบฒเบฐเบงเปˆเบฒ, เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบกเบฑเบ™เบชเบฐเบ”เบงเบ, เป„เบง, เปเบฅเบฐเบฅเบฒเบ„เบฒเบ–เบทเบ.
เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเปเบฅเปˆเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปเบ™เบฐเบ™เปเบฒ Linux VDS เบ—เบตเปˆเบกเบต 1 CPU, 2 GB RAM, 20 GB HDD. เบฅเบฒเบ„เบฒเบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™ ~3000โ‚ฝ เบ•เปเปˆเบ›เบต.

เบ™เบฑเบเปเบฅเปˆเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ

เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเปเบฅเปˆเบ™เบ‚เป‰เบญเบเป€เบญเบปเบฒ VDS 4 CPU, 4 GB RAM, 50 GB SSD. เบฅเบฒเบ„เบฒ 11000โ‚ฝ เบšเปเปˆเป€เบ„เบตเบเป€เบชเบเปƒเบˆ.
เบ‚เป‰เบญเบเบกเบตเบ—เบฑเบ‡เปเบปเบ” 7 เป€เบ„เบทเปˆเบญเบ‡. 5 เปƒเบ™ aruba เปเบฅเบฐ 2 เบชเบธเบ” ihor.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ™เบฑเบเปเบฅเปˆเบ™. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐ configure เบกเบฑเบ™.
เบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เบœเปˆเบฒเบ™ SSH เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ java, git, maven, gnupg2.

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ•เบปเบงเปเบฅเปˆเบ™ gitlab

  • เบชเป‰เบฒเบ‡เบเบธเปˆเบกเปƒเบซเบกเปˆ runner
    sudo groupadd runner
  • เบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบชเปเบฒเบฅเบฑเบš maven cache เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบเบธเปˆเบก 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 (เบชเบฒเบกเบฒเบ”เบ‡เปˆเบฒเบเบ”เบฒเบ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบชเปเบฒเบฅเบฑเบš localhost)
    passwd gitlab-deployer
  • เบ•เบดเบ”เบ•เบฑเป‰เบ‡ GitLab Runner (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 CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

  • เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบ™เบฑเบเปเบฅเปˆเบ™
    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 activated for this project

เปœเป‰เบฒเบˆเป

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

  • เบ•เบทเปˆเบก เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ /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
  • เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ™เบฑเบเปเบฅเปˆเบ™เปเบฅเปˆเบ™.

เบ•เบปเบงเบขเปˆเบฒเบ‡:

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบเบณเบฅเบฑเบ‡เบชเป‰เบฒเบ‡เบเบฐเปเบˆ 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 
  • เบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต maven repository เปเบฅเบฐโ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เบเบฑเบšโ€‹เบ–เบฒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบˆเปเบฒ (เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบšเปเปˆโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹)
    เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบกเบˆเบธเบ”เบ™เบตเป‰เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเปเบฅเปˆเบ™เบ™เบฑเบเปเบฅเปˆเบ™เบซเบผเบฒเบเป†เบ„เบปเบ™เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ”เบฝเบง.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบซเบผเบฑเบ
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบฅเบฑเบšเบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบŠเบต Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ ~/.m2/settings.xml
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

เบšเปˆเบญเบ™เปƒเบ”,
GPG_SECRET_KEY_PASSHRASE - เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเบณเบฅเบฑเบšเบเบฐเปเบˆ GPG
SONATYPE_USERNAME โ€” เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบšเบฑเบ™เบŠเบต sonatype

เบ™เบตเป‰เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ runner, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบฑเบšเบžเบฒเบ GitLab CI

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เปเบšเปˆเบ‡เบ›เบฑเบ™ Runner

เบเบณเบฅเบฑเบ‡เบชเป‰เบฒเบ‡เบเบฐเปเบˆ 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
    เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Maven

  • เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบซเบผเบฑเบ
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • เป„เบ›เบ—เบตเปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™ -> เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ -> CI / CD -> เบ•เบปเบงเปเบ›เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบเปƒเบ™เบ•เบปเบงเปเบ› SETTINGS_SECURITY_XML เบชเบฒเบเบ•เปเปˆเป„เบ›เบ™เบตเป‰:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบฅเบฑเบšเบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบŠเบต Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • เป„เบ›เบ—เบตเปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™ -> เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ -> CI / CD -> เบ•เบปเบงเปเบ›เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบเปƒเบ™เบ•เบปเบงเปเบ› SETTINGS_XML เบชเบฒเบเบ•เปเปˆเป„เบ›เบ™เบตเป‰:
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

เบšเปˆเบญเบ™เปƒเบ”,
GPG_SECRET_KEY_PASSHRASE - เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเบณเบฅเบฑเบšเบเบฐเปเบˆ GPG
SONATYPE_USERNAME โ€” เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบšเบฑเบ™เบŠเบต sonatype

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบ™เบณเปƒเบŠเป‰เบฎเบนเบš docker

  • เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ Dockerfile เบ‡เปˆเบฒเบเบ”เบฒเบเบžเปเบชเบปเบกเบ„เบงเบ™เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบ•เปˆเบฒเบ‡เป†เบเบฑเบš Java เป€เบงเบตเบŠเบฑเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเปเบฒเบฅเบฑเบš alpine.

    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

เบ™เบณเปƒเบŠเป‰เป‚เบ„เบ‡เบเบฒเบ™

เป€เบžเบตเปˆเบกเป„เบŸเบฅเปŒ .gitlab-ci.yml เปƒเบชเปˆเบฎเบฒเบเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ deploy
เบชเบฐเบ„เบฃเบดเบšเบ™เบณเบชเบฐเป€เปœเบตเบชเบญเบ‡เปœเป‰เบฒเบงเบฝเบเบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบชเบฐเป€เบžเบฒเบฐเป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™. Runner เบชเบฐเป€เบžเบฒเบฐเบซเบผเบท Shared Runner เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš.

.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

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เป‚เบ„เบ‡เบเบฒเบ™ Java

เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ java เบ—เบตเปˆเบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเบ–เบทเบเบญเบฑเบšเป‚เบซเบฅเบ”เป„เบ›เบเบฑเบ‡เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบก 2 เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบžเบทเปˆเบญเบ”เบฒเบงเป‚เบซเบฅเบ”เป€เบงเบตเบŠเบฑเบ™เบ›เปˆเบญเบเปเบฅเบฐ Snapshot.

.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 เปเบกเปˆเปเบšเบšเบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ java.

เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก

เบ‚เป‰เบญเบเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ gitlab-ci เปƒเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเป„เบ”เป‰เบงเบฒเบ‡เปเบกเปˆเปเบšเบš CI เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ java common.yml.

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

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ java เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, .gitlab-ci.yml เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบซเบ™เบฒเปเบซเบ™เป‰เบ™เบซเบผเบฒเบเปเบฅเบฐเบšเปเปˆ verbose.

.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

เบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”. Googolplex ะฒ เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ maven เป€เบžเบทเปˆเบญเป€เบŠเบฑเบ™เบŠเบทเปˆ เปเบฅเบฐเบญเบฑเบšเป‚เบซเบฅเบ” artifacts เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบชเปˆ snapshot เปเบฅเบฐ staging repositories, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบšเบฒเบ‡ nuances เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ plugins. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบเบฑเบ‡โ€‹เบˆเบฐโ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ‡เปˆเบฒเบโ€‹เปเบฅเบฐโ€‹เบœเปˆเบญเบ™โ€‹เบ„เบฒเบโ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹ nexus-staging-maven-pluginเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบผเบทเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ org.sonatype.oss:oss-parent เป€เบ›เบฑเบ™เบžเปเปˆเปเบกเปˆเบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

maven-install-plugin

เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบกเบ”เบนเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ repository เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™.
เบกเบตเบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบขเบฑเป‰เบ‡เบขเบทเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบญเบทเปˆเบ™เป†, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš checksum.

<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

เบเบฒเบ™เบชเป‰เบฒเบ‡ 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>

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเป‚เบกเบ”เบนเบ™เบ—เบตเปˆเบšเปเปˆเบกเบต java (เบ•เบปเบงเบขเปˆเบฒเบ‡เบžเบฝเบ‡เปเบ•เปˆเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™)
เบซเบผเบทเบ—เปˆเบฒเบ™เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡ 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

<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>

pluses เบซเบผเบฒเบ

  • เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเบญเบธเบ”เบปเบกเบชเบปเบกเบšเบนเบ™เบซเบผเบฒเบเบ‚เบญเบ‡เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš repository nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • เบเบงเบ”เบชเบญเบšเบเบฒเบ™เบ›เปˆเบญเบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฑเบšเป‚เบซเบฅเบ”เป„เบ›เบเบฑเบ‡ maven central

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบœเบปเบ™

เป€เบœเบตเบเปเบœเปˆเบชเบฐเบšเบฑเบš SNAPSHOT

เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เบซเบ™เป‰เบฒเบงเบฝเบเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เป€เบžเบทเปˆเบญเบ”เบฒเบงเป‚เบซเบฅเบ”เป€เบงเบตเบŠเบฑเบ™ SNAPSHOT เป„เบ›เบซเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

เป€เบกเบทเปˆเบญเบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰, เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ deploy เบˆเบฐเบ–เบทเบเบเบฐเบ•เบธเป‰เบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡).

เป„เบกเป‰เบ—เปˆเบญเบ™เบ–เบทเบเบ•เบฑเบ”

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 1.0.0-SNAPSHOT.

เบชเบฐเบšเบฑเบš snapshot เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเบฅเบถเบšเบญเบญเบเบˆเบฒเบ repository เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒ oss.sonatype.org เบžเบฒเบเปƒเบ•เป‰เบšเบฑเบ™เบŠเบตเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบเบณเบฅเบฑเบ‡เป€เบœเบตเบเปเบœเปˆเบชเบฐเบšเบฑเบš

เป€เบกเบทเปˆเบญเปเบ—เบฑเบเบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡, เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ deploy เบˆเบฐเบ–เบทเบเบเบฐเบ•เบธเป‰เบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป€เบžเบทเปˆเบญเบ”เบฒเบงเป‚เบซเบฅเบ”เป€เบงเบตเบŠเบฑเบ™เบ›เปˆเบญเบเป„เบ›เบซเบฒ nexus (เบ•เบปเบงเบขเปˆเบฒเบ‡).

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

เบชเปˆเบงเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เบ›เปˆเบญเบเบ—เบตเปˆเปƒเบเป‰เบŠเบดเบ”เบˆเบฐเบ–เบทเบเบเบฐเบ•เบธเป‰เบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ 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 &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. 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] ------------------------------------------------------------------------

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เป€เบซเบผเบทเบญเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบ. เบ—เบฑเบ‡เบฅเบถเบšเป€เบงเบตเบŠเบฑเบ™เบ™เบตเป‰ เบซเบผเบทเป€เบœเบตเบเปเบœเปˆเบกเบฑเบ™.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบญเบโ€‹เบญเบญเบโ€‹เบกเบฒโ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ—เบตเปˆโ€‹เปƒเบŠเป‰โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบšเบฒเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบ›เบญเบกโ€‹เบˆเบฐโ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹ เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™ java เบเบฑเบš maven central

เบ™เบญเบเบซเบปเบงเบ‚เปเป‰

เบกเบฑเบ™เปเบกเปˆเบ™เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบเบ—เบตเปˆ maven indexes repositories เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบญเบทเปˆเบ™เป†.
เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบก robots.txt เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบ”เบฑเบ”เบชเบฐเบ™เบตเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เป€เบเบปเปˆเบฒเบ‚เบญเบ‡เบ‚เป‰เบญเบ.

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบชเบฐเบซเบฅเบธเบš

เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบต

  • เป‚เบ„เบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™ CI เบซเบผเบฒเบเบขเปˆเบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฑเบšเป‚เบซเบฅเบ”เบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”เปƒเบชเปˆเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ•เปˆเบฒเบ‡เป†.
  • เป‚เบ„เบ‡เบเบฒเบ™ Deploy เปเบกเปˆเบ™เป‚เบ”เบ”เบ”เปˆเบฝเบงเบˆเบฒเบเบเบฒเบ™เปเบŠเบเปเบŠเบ‡เบˆเบฒเบเบžเบฒเบเบ™เบญเบ เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰เป‚เบ”เบเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบกเบตเบšเบปเบ”เบšเบฒเบ”เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡ เปเบฅเบฐเบœเบนเป‰เบฎเบฑเบเบชเบฒเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™.
  • Runner เบชเบฐเป€เบžเบฒเบฐเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบกเบต cache "เบฎเป‰เบญเบ™" เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบงเบฝเบ.
  • เบเบฒเบ™เป€เบœเบตเบเปเบœเปˆเบชเบฐเปเบ™เบฑเบšเบŠเบฑเบญเบ”/เบเบฒเบ™เบ›เปˆเบญเบเป€เบงเบตเบŠเบฑเบ™เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ.
  • เบเบงเบ”เป€เบšเบดเปˆเบ‡เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เบชเบฐเบšเบฑเบšเบ›เปˆเบญเบเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบดเบกเป€เบœเบตเบเปเบœเปˆเปƒเบ™ maven central.
  • เบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เบžเบดเบกเป€เบœเบตเบเปเบœเปˆเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡ "เบงเบฑเบ”เบ–เบธเบ”เบดเบš" เบชเบฐเบšเบฑเบšเปƒเบ™ maven central.
  • เบชเป‰เบฒเบ‡โ€‹เปเบฅเบฐโ€‹เป€เบœเบตเบโ€‹เปเบœเปˆโ€‹เบชเบฐโ€‹เบšเบฑเบš snapshot โ€œเบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ„เบฅเบดเบโ€‹เปƒเบชเปˆโ€‹โ€โ€‹.
  • เบ„เบฑเบ‡เป€เบเบฑเบšเบกเป‰เบฝเบ™เบญเบฑเบ™เบ”เบฝเบงเบชเบณเบฅเบฑเบšเบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเปเบ™เบฑเบšเบŠเบฑเบญเบ”/เบฅเบธเป‰เบ™เบญเบญเบ.
  • เบ—เปเปˆเบ—เบปเปˆเบงเป„เบ›เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ / เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš / เป€เบœเบตเบเปเบœเปˆเป‚เบ„เบ‡เบเบฒเบ™ java.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI เบšเปเปˆเปเบกเปˆเบ™เบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”. เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบ•เบฑเป‰เบ‡ CI เบšเบปเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™ turnkey เบชเบญเบ‡เบชเบฒเบกเป€เบ—เบทเปˆเบญ, เปเบฅเบฐเบ•เบญเบ™เบ™เบตเป‰เป€เบˆเบปเป‰เบฒเบขเบนเปˆเป„เบเบˆเบฒเบเบ™เบฑเบเบชเบกเบฑเบเป€เบฅเปˆเบ™เปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เป€เบญเบเบฐเบชเบฒเบ™ GitLab เปเบกเปˆเบ™เบŠเป‰เปเบฒเบŠเป‰เบญเบ™เบซเบผเบฒเบ. เบขเปˆเบฒเบขเป‰เบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเบšเบฒเบ”เบเป‰เบฒเบงเบ—เปเบฒเบญเบดเบ”. เบซเบปเบ™เบ—เบฒเบ‡เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ•เป‰เบ‚เบฑเป‰เบ™เป„เบ”เบ‚เบญเบ‡เบ„เบปเบ™เบเปˆเบฒเบ‡ (เบ‚เป‰เบญเบเบšเปเปˆเบˆเบทเปˆเบงเปˆเบฒเปƒเบœเป€เบงเบปเป‰เบฒ :)

เบ‚เป‰เบญเบเบˆเบฐเบ”เบตเปƒเบˆเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบดเบŠเบปเบก.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒ GitLab CI เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™ (เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰ docker-compose) เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡ shell runner.

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™