เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช† เชฒเซ‡เช– เชœเชพเชตเชพ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชฌเชจเชพเชตเชพเชฏเซ‡เชฒ เช›เซ‡ เชœเซ‡เชฎเชฃเซ‡ เช—เชฟเชŸเชฒเซ‡เชฌเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชฎเชจเชพ เช‰เชคเซเชชเชพเชฆเชจเซ‹เชจเซ‡ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เช…เชจเซ‡/เช…เชฅเชตเชพ เชฎเซ‡เชตเซ‡เชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชเชฎเชพเช‚ เชเชกเชชเชฅเซ€ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เชฒเซ‡เช–เชฎเชพเช‚, เชนเซเช‚ เช† เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ gitlab-runner, gitlab-ci เช…เชจเซ‡ maven-plugin เชธเซ‡เชŸ เช•เชฐเชตเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถ.

เชชเซ‚เชฐเซเชตเชœเชฐเซ‚เชฐเซ€เชฏเชพเชคเซ‹:

  • mvn เช…เชจเซ‡ GPG เช•เซ€เชจเซ‹ เชธเซเชฐเช•เซเชทเชฟเชค เชธเช‚เช—เซเชฐเชน.
  • เชœเชพเชนเซ‡เชฐ CI เช•เชพเชฐเซเชฏเซ‹เชจเซ‹ เชธเซเชฐเช•เซเชทเชฟเชค เช…เชฎเชฒ.
  • เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชญเช‚เชกเชพเชฐเซ‹เชฎเชพเช‚ เช•เชฒเชพเช•เซƒเชคเชฟเช“ (เชชเซเชฐเช•เชพเชถเชจ/เชธเซเชจเซ‡เชชเชถเซ‹เชŸ) เช…เชชเชฒเซ‹เชก เช•เชฐเชตเซ€.
  • เชฎเซ‡เชตเซ‡เชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒเชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชจ เชฎเชพเชŸเซ‡ เชชเซเชฐเช•เชพเชถเชจ เชธเช‚เชธเซเช•เชฐเชฃเซ‹เชจเซ€ เชธเซเชตเชšเชพเชฒเชฟเชค เชคเชชเชพเชธ.
  • เชฌเชนเซเชตเชฟเชง เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸเซเชธ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชธเชพเชฎเชพเชจเซเชฏ เช‰เช•เซ‡เชฒ.
  • เชธเชฐเชณเชคเชพ เช…เชจเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชธเชฐเชณเชคเชพ.

เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ

เชธเชพเชฎเชพเชจเซเชฏ เชœเชพเชฃเช•เชพเชฐเซ€

  • เชธเซ‹เชจเชพเชŸเชพเช‡เชช เช“เชเชธเชเชธ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เชนเซ‹เชธเซเชŸเชฟเช‚เช— เชธเซ‡เชตเชพ เชฆเซเชตเชพเชฐเชพ เชฎเซ‡เชตเซ‡เชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เช•เชฒเชพเช•เซƒเชคเชฟเช“ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟเชจเซเช‚ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡. เช† เชฒเซ‡เช– เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช—เซ‹เช—เซ‹เชฒเชชเซเชฒเซ‡เช•เซเชธ, เชคเซ‡เชฅเซ€ เชนเซเช‚ เชฏเซ‹เช—เซเชฏ เชธเซเชฅเชณเซ‹เช เช† เชฒเซ‡เช–เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เชฒเชˆเชถ.
  • เชชเชฐ เชชเซ‚เชฐเซเชต-เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชœเซ€เชฐเชพ เช…เชจเซ‡ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เช–เซ‹เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชŸเชฟเช•เชฟเชŸ เชถเชฐเซ‚ เช•เชฐเซ‹ (เชตเชงเซ เชตเชฟเช—เชคเซ‹ เชฎเชพเชŸเซ‡, เชตเชฟเชญเชพเช— เชตเชพเช‚เชšเซ‹ Sonatype JIRA เชŸเชฟเช•เชฟเชŸ เชฌเชจเชพเชตเซ‹). เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เช–เซ‹เชฒเซเชฏเชพ เชชเช›เซ€, JIRA เชฒเซ‰เช—เชฟเชจ/เชชเชพเชธเชตเชฐเซเชก เชœเซ‹เชกเซ€ (เชคเซเชฏเชพเชฐเชฌเชพเชฆ Sonatype เชเช•เชพเช‰เชจเซเชŸ เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡) เชจเซ‹ เช‰เชชเชฏเซ‹เช— Sonatype เชจเซ‡เช•เซเชธเชธ เชชเชฐ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.
  • เช†เช—เชณ, GPG เช•เซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช–เซ‚เชฌ เชœ เชถเซเชทเซเช• เชฐเซ€เชคเซ‡ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡. เชตเชงเซ เชตเชฟเช—เชคเซ‹ เชฎเชพเชŸเซ‡ เชตเชฟเชญเชพเช— เชœเซเช“. เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชชเชฐ เชธเชนเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GnuPG เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช
  • เชœเซ‹ เชคเชฎเซ‡ GPG เช•เซ€ (gnupg/gnupg2) เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ Linux เช•เชจเซเชธเซ‹เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‹, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช†เชฐเชเชจเชœเซ€-เชธเชพเชงเชจเซ‹ เชเชจเซเชŸเซเชฐเซ‹เชชเซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡. เชจเชนเชฟเช‚เชคเชฐ, เช•เซ€ เชœเชจเชฐเซ‡เชถเชจเชฎเชพเช‚ เช˜เชฃเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซ€ เชถเช•เซ‡ เช›เซ‡.
  • เชธเช‚เช—เซเชฐเชน เชธเซ‡เชตเชพเช“ เชœเชพเชนเซ‡เชฐ GPG เช•เซ€เช“

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

GitLab เชฎเชพเช‚ เชกเชฟเชชเซเชฒเซ‹เชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

  • เชธเซŒ เชชเซเชฐเชฅเชฎ, เชคเชฎเชพเชฐเซ‡ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช…เชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช•เชฒเชพเช•เซƒเชคเชฟเช“เชจเซ€ เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เชธเชฐเชณ เช…เชจเซ‡ เชœเชŸเชฟเชฒ เช•เชนเซเชฏเซ‹ - เชœเชฎเชพเชตเชตเซเช‚
  • เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชฌเชจเชพเชตเซเชฏเชพ เชชเช›เซ€, เชคเชฎเชพเชฐเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช•เซเชธเซ‡เชธเชจเซ‡ เชชเซเชฐเชคเชฟเชฌเช‚เชงเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.
    เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ -> เชธเซเชฐเช•เซเชทเชฟเชค เชถเชพเช–เชพเช“ เชชเชฐ เชœเชพเช“. เช…เชฎเซ‡ เชฌเชงเชพ เชจเชฟเชฏเชฎเซ‹ เช•เชพเชขเซ€ เชจเชพเช–เซ€เช เช›เซ€เช เช…เชจเซ‡ เชตเชพเช‡เชฒเซเชกเช•เชพเชฐเซเชก เชธเชพเชฅเซ‡ เชเช• เชจเชฟเชฏเชฎ เช‰เชฎเซ‡เชฐเซ€เช เช›เซ€เช * เชฆเชฌเชพเชฃ เช…เชจเซ‡ เชฎเชฐเซเชœ เช•เชฐเชตเชพเชจเชพ เช…เชงเชฟเช•เชพเชฐ เชธเชพเชฅเซ‡ เชฎเชพเชคเซเชฐ เชœเชพเชณเชตเชฃเซ€เชจเซ€ เชญเซ‚เชฎเชฟเช•เชพ เชงเชฐเชพเชตเชคเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡. เช† เชจเชฟเชฏเชฎ เช† เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชจเซ‡ เชœเซ‡ เชœเซ‚เชฅเชจเซ‹ เช† เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช›เซ‡ เชคเซ‡เชจเชพ เชคเชฎเชพเชฎ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เช•เชพเชฎ เช•เชฐเชถเซ‡.
    เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡
  • เชœเซ‹ เชคเซเชฏเชพเช‚ เช˜เชฃเชพ เชœเชพเชณเชตเชฃเซ€เช•เชพเชฐเซ‹ เช›เซ‡, เชคเซ‹ เชถเซเชฐเซ‡เชทเซเช  เช‰เช•เซ‡เชฒ เช เช›เซ‡ เช•เซ‡ เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เชเช•เซเชธเซ‡เชธเชจเซ‡ เชชเซเชฐเชคเชฟเชฌเช‚เชงเชฟเชค เช•เชฐเชตเซ€.
    เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชชเชฐ เชœเชพเช“ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> เชธเชพเชฎเชพเชจเซเชฏ -> เชฆเซƒเชถเซเชฏเชคเชพ, เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซเชตเชฟเชงเชพเช“, เชชเชฐเชตเชพเชจเช—เซ€เช“ เช…เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฆเซƒเชถเซเชฏเชคเชพ เชธเซ‡เชŸ เช•เชฐเซ‹ เช–เชพเชจเช—เซ€.
    เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชเช•เซเชธเซ‡เชธเชฎเชพเช‚ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชนเซเช‚ เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เช—เชฟเชŸเชฒเซ‡เชฌ เชฐเชจเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚ เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ เช›เซ‡. เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชฒเซ‹เช—เชฎเชพเช‚ เช–เชพเชจเช—เซ€ เชฎเชพเชนเชฟเชคเซ€ เชฆเชฐเซเชถเชพเชตเชตเซ€ เช–เชฐเซ‡เช–เชฐ เชฎเชพเชฐเชพ เชนเชฟเชคเชฎเชพเช‚ เชจเชฅเซ€.
  • เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เชฌเชฆเชฒเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชจเชฟเชฏเชฎเซ‹เชจเซ‡ เช•เชกเช• เชฌเชจเชพเชตเชตเซเช‚
    เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชชเชฐ เชœเชพเช“ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ -> เชชเซเชถ เชจเชฟเชฏเชฎเซ‹ เช…เชจเซ‡ เชซเซเชฒเซ‡เช—เซเชธ เช•เชฎเชฟเชŸเชฐ เชชเซเชฐเชคเชฟเชฌเช‚เชง เชธเซ‡เชŸ เช•เชฐเซ‹, เชคเชชเชพเชธเซ‹ เช•เซ‡ เชฒเซ‡เช–เช• เช—เชฟเชŸเชฒเซ‡เชฌ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ. เชนเซเช‚ เชธเซ‡เชŸเชฟเช‚เช—เชจเซ€ เชชเชฃ เชญเชฒเชพเชฎเชฃ เช•เชฐเซเช‚ เช›เซเช‚ เชธเชนเซ€ เช•เชฐเชตเชพเชจเซเช‚ เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เช•เชฐเซ‹, เช…เชจเซ‡ เช…เชธเซเชตเซ€เช•เชพเชฐเชฟเชค เช•เชฎเชฟเชŸ เชงเซเชตเชœ เชธเซ‡เชŸ เช•เชฐเซ‹.
  • เช†เช—เชณ, เชคเชฎเชพเชฐเซ‡ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชŸเซเชฐเชฟเช—เชฐเชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡
    เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> CI / CD -> เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชŸเซเชฐเชฟเช—เชฐเซเชธ เชชเชฐ เชœเชพเช“ เช…เชจเซ‡ เชจเชตเซเช‚ เชŸเซเชฐเชฟเช—เชฐ-เชŸเซ‹เช•เชจ เชฌเชจเชพเชตเซ‹
    เช† เชŸเซ‹เช•เชจ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชœเซ‚เชฅ เชฎเชพเชŸเซ‡ เชšเชฒเซ‹เชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเชฎเชพเช‚ เชคเชฐเชค เชœ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.
    เชœเซ‚เชฅ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> CI / CD -> เชตเซ‡เชฐเซ€เชเชฌเชฒ เชชเชฐ เชœเชพเช“ เช…เชจเซ‡ เชšเชฒ เช‰เชฎเซ‡เชฐเซ‹ DEPLOY_TOKEN เชฎเซ‚เชฒเซเชฏเชฎเชพเช‚ เชŸเซเชฐเชฟเช—เชฐ-เชŸเซ‹เช•เชจ เชธเชพเชฅเซ‡.

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

GitLab เชฐเชจเชฐ

เช† เชตเชฟเชญเชพเช— เชฎเซ‚เชณ (เชตเชฟเชถเชฟเชทเซเชŸ) เช…เชจเซ‡ เชธเชพเชฐเซเชตเชœเชจเชฟเช• (เชถเซ‡เชฐเซเชก) เชฐเชจเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเชฎเชพเชตเชŸ เชชเชฐ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡.

เชšเซ‹เช•เซเช•เชธ เชฐเชจเชฐ

เชนเซเช‚ เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชฆเซ‹เชกเชตเซ€เชฐเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชธเซŒ เชชเซเชฐเชฅเชฎ เชคเซ‡ เช…เชจเซเช•เซ‚เชณ, เชเชกเชชเซ€, เชธเชธเซเชคเซเช‚ เช›เซ‡.
เชฐเชจเชฐ เชฎเชพเชŸเซ‡ เชนเซเช‚ 1 CPU, 2 GB RAM, 20 GB HDD เชธเชพเชฅเซ‡ Linux VDS เชจเซ€ เชญเชฒเชพเชฎเชฃ เช•เชฐเซเช‚ เช›เซเช‚. เช‡เชถเซเชฏเซ‚ เช•เชฟเช‚เชฎเชค ~ 3000โ‚ฝ เชชเซเชฐเชคเชฟ เชตเชฐเซเชท.

เชฎเชพเชฐเชพ เชฆเซ‹เชกเชตเซ€เชฐ

เชฆเซ‹เชกเชตเซ€เชฐ เชฎเชพเชŸเซ‡ เชฎเซ‡เช‚ VDS 4 CPU, 4 GB RAM, 50 GB SSD เชฒเซ€เชงเซเช‚. เชคเซ‡เชจเซ€ เช•เชฟเช‚เชฎเชค ~11000โ‚ฝ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช•เซเชฏเชพเชฐเซ‡เชฏ เช…เชซเชธเซ‹เชธ เชฅเชฏเซ‹ เชจเชฅเซ€.
เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช•เซเชฒ 7 เชฎเชถเซ€เชจเซ‹ เช›เซ‡. เช…เชฐเซเชฌเชพ เชชเชฐ 5 เช…เชจเซ‡ ihor เชชเชฐ 2.

เชคเซ‡เชฅเซ€, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฆเซ‹เชกเชตเซ€เชฐ เช›เซ‡. เชนเชตเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเซ€เชถเซเช‚.
เช…เชฎเซ‡ SSH เชฆเซเชตเชพเชฐเชพ เชฎเชถเซ€เชจ เชชเชฐ เชœเชˆเช เช›เซ€เช เช…เชจเซ‡ java, git, maven, gnupg2 เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เช เช›เซ€เช.

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เช—เชฟเชŸเชฒเซ‡เชฌ เชฐเชจเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

  • เชจเชตเซเช‚ เชœเซ‚เชฅ เชฌเชจเชพเชตเซ‹ runner
    sudo groupadd runner
  • เชฎเซ‡เชตเซ‡เชจ เช•เซ‡เชถ เชฎเชพเชŸเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชœเซ‚เชฅ เช…เชงเชฟเช•เชพเชฐเซ‹ เชธเซ‹เช‚เชชเซ‹ runner
    เชœเซ‹ เชคเชฎเซ‡ เชเช• เชœ เชฎเชถเซ€เชจ เชชเชฐ เชฌเชนเซเชตเชฟเชง เชฆเซ‹เชกเชตเซ€เชฐเซ‹เชจเซ‡ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เช†เชฏเซ‹เชœเชจ เชจ เช•เชฐเชคเชพ เชนเซ‹เชต เชคเซ‹ เชคเชฎเซ‡ เช† เชชเช—เชฒเซเช‚ เช›เซ‹เชกเซ€ เชถเช•เซ‹ เช›เซ‹.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ‹ gitlab-deployer เช…เชจเซ‡ เชœเซ‚เชฅเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‹ runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • เชซเชพเช‡เชฒเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‹ /etc/ssh/sshd_config เช†เช—เชฒเซ€ เชชเช‚เช•เซเชคเชฟ
    AllowUsers root@* [email protected]
  • เชฐเซ€เชฌเซ‚เชŸ เช•เชฐเซ‹ sshd
    systemctl restart sshd
  • เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡ เชชเชพเชธเชตเชฐเซเชก เชธเซ‡เชŸ เช•เชฐเซ‹ gitlab-deployer (เชคเซ‡ เชธเชฐเชณ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชฒเซ‹เช•เชฒเชนเซ‹เชธเซเชŸ เชฎเชพเชŸเซ‡ เชชเซเชฐเชคเชฟเชฌเช‚เชง เช›เซ‡)
    passwd gitlab-deployer
  • GitLab เชฐเชจเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹ (Linux x86-64)
    sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    sudo chmod +x /usr/local/bin/gitlab-runner
    ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner
    ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner
  • gitlab.com เชชเชฐ เชœเชพเช“ -> deploy-project -> Settings -> CI/CD -> เชฐเชจเชฐเซเชธ -> เชšเซ‹เช•เซเช•เชธ เชฐเชจเชฐเซเชธ เช…เชจเซ‡ เชฐเชœเซ€เชธเซเชŸเซเชฐเซ‡เชถเชจ เชŸเซ‹เช•เชจ เช•เซ‹เชชเซ€ เช•เชฐเซ‹

เชธเซเช•เซเชฐเซ€เชจ

เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

  • เชฆเซ‹เชกเชตเซ€เชฐเชจเซ€ เชจเซ‹เช‚เชงเชฃเซ€
    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 -> เชฐเชจเชฐเซเชธ -> เชšเซ‹เช•เซเช•เชธ เชฆเซ‹เชกเชตเซ€เชฐเซ‹ -> เช† เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเชพเชŸเซ‡ เชธเช•เซเชฐเชฟเชฏ เช•เชฐเชพเชฏเซ‡เชฒเชพ เชฆเซ‹เชกเชตเซ€เชฐเซ‹

เชธเซเช•เซเชฐเซ€เชจ

เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

  • เช‰เชฎเซ‡เชฐเซ‹ เช…เชฒเช— เชธเซ‡เชตเชพ /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 เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

GPG เช•เซ€ เชœเชจเชฐเซ‡เชถเชจ

  • เช เชœ เชฎเชถเซ€เชจเชฎเชพเช‚เชฅเซ€ เช†เชชเชฃเซ‡ เชฏเซเชเชฐ เชนเซ‡เช เชณ ssh เชฎเชพเชฐเชซเชคเซ‡ เชœเชˆเช เช›เซ€เช gitlab-deployer (เช† GPG เช•เซ€ เชœเชจเชฐเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡)

    ssh [email protected]

  • เช…เชฎเซ‡ เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เชœเชตเชพเชฌ เช†เชชเซ€เชจเซ‡ เช•เซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช. เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชจเชพเชฎ เช…เชจเซ‡ เชˆเชฎเซ‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹.
    เช•เซ€ เชฎเชพเชŸเซ‡ เชชเชพเชธเชตเชฐเซเชก เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‹. เช† เช•เซ€ เชตเชกเซ‡ เช•เชฒเชพเช•เซƒเชคเชฟเช“ เชชเชฐ เชนเชธเซเชคเชพเช•เซเชทเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

    gpg --gen-key 

  • เชคเชชเชพเชธเชตเซเช‚

    gpg --list-keys -a
    /home/gitlab-deployer/.gnupg/pubring.gpg
    ----------------------------------------
    pub   4096R/00000000 2019-04-19
    uid                  Petruha Petrov <[email protected]>
    sub   4096R/11111111 2019-04-19

  • เช•เซ€เชธเชฐเซเชตเชฐ เชชเชฐ เช…เชฎเชพเชฐเซ€ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เช•เซ€ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช

    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: sending key 00000000 to hkp server keys.gnupg.net

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชฎเซ‡เชตเชจ เชธเซ‡เชŸเช…เชช

  • เช…เชฎเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชนเซ‡เช เชณ เชœเชพเช“ gitlab-deployer
    su gitlab-deployer 
  • เชฎเซ‡เชตเชจ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเซ‹ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เช…เชจเซ‡ เช•เซ‡เชถ เชธเชพเชฅเซ‡ เชฒเชฟเช‚เช• เช•เชฐเซ‹ (เช•เซ‹เชˆ เชญเซ‚เชฒ เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚)
    เชœเซ‹ เชคเชฎเซ‡ เชเช• เชœ เชฎเชถเซ€เชจ เชชเชฐ เช˜เชฃเชพ เชฆเซ‹เชกเชตเซ€เชฐเซ‹เชจเซ‡ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชฏเซ‹เชœเชจเชพ เชจ เช•เชฐเซ‹ เชคเซ‹ เช† เชชเช—เชฒเซเช‚ เช›เซ‹เชกเซ€ เชถเช•เชพเชฏ เช›เซ‡.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • เชเช• เชฎเชพเชธเซเชŸเชฐ เช•เซ€ เชฌเชจเชพเชตเซ‹
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • ~/.m2/settings-security.xml เชซเชพเช‡เชฒ เชฌเชจเชพเชตเซ‹
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype เชเช•เชพเช‰เชจเซเชŸเชฎเชพเช‚เชฅเซ€ เชชเชพเชธเชตเชฐเซเชก เชเชจเซเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • ~/.m2/settings.xml เชซเชพเช‡เชฒ เชฌเชจเชพเชตเซ‹
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

เช•เซเชฏเชพเช‚,
GPG_SECRET_KEY_PASSPHRASE - GPG เช•เซ€ เชชเชพเชธเชตเชฐเซเชก
SONATYPE_USERNAME - sonatype เชเช•เชพเช‰เชจเซเชŸ เชฒเซ‹เช—เชฟเชจ

เช† เชฐเชจเชฐ เชธเซ‡เชŸเช…เชช เชชเซ‚เชฐเซเชฃ เช•เชฐเซ‡ เช›เซ‡, เชคเชฎเซ‡ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช†เช—เชณ เชตเชงเซ€ เชถเช•เซ‹ เช›เซ‹ เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€.เช†เชˆ.

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒ เชฐเชจเชฐ

GPG เช•เซ€ เชœเชจเชฐเซ‡เชถเชจ

  • เชธเซŒ เชชเซเชฐเชฅเชฎ, เชคเชฎเชพเชฐเซ‡ GPG เช•เซ€ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, gnupg เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹.

    yum install -y gnupg

  • เช…เชฎเซ‡ เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เชœเชตเชพเชฌ เช†เชชเซ€เชจเซ‡ เช•เซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช. เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชจเชพเชฎ เช…เชจเซ‡ เชˆเชฎเซ‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹. เช•เซ€ เชฎเชพเชŸเซ‡ เชชเชพเชธเชตเชฐเซเชก เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‹.

    gpg --gen-key 

  • เชฎเซเช–เซเชฏ เชฎเชพเชนเชฟเชคเซ€ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเซ‹

    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expires: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp <[email protected]>
    sub   rsa3072 2019-04-24 [E] [expires: none]

  • เช•เซ€เชธเชฐเซเชตเชฐ เชชเชฐ เช…เชฎเชพเชฐเซ€ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เช•เซ€ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช

    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net

  • เช–เชพเชจเช—เซ€ เช•เซ€ เชฎเซ‡เชณเชตเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช

    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----

  • เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> CI / CD -> เชตเซ‡เชฐเซ€เชเชฌเชฒ เชชเชฐ เชœเชพเช“ เช…เชจเซ‡ เช–เชพเชจเช—เซ€ เช•เซ€เชจเซ‡ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เชธเชพเชšเชตเซ‹ GPG_SECRET_KEY
    เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชฎเซ‡เชตเชจ เชธเซ‡เชŸเช…เชช

  • เชเช• เชฎเชพเชธเซเชŸเชฐ เช•เซ€ เชฌเชจเชพเชตเซ‹
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> CI / CD -> เชตเซ‡เชฐเซ€เชเชฌเชฒ เชชเชฐ เชœเชพเช“ เช…เชจเซ‡ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เชธเชพเชšเชตเซ‹ SETTINGS_SECURITY_XML เชจเซ€เชšเซ‡เชจเซ€ เชฒเซ€เชŸเซ€เช“:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype เชเช•เชพเช‰เชจเซเชŸเชฎเชพเช‚เชฅเซ€ เชชเชพเชธเชตเชฐเซเชก เชเชจเซเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> CI / CD -> เชตเซ‡เชฐเซ€เชเชฌเชฒ เชชเชฐ เชœเชพเช“ เช…เชจเซ‡ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เชธเชพเชšเชตเซ‹ SETTINGS_XML เชจเซ€เชšเซ‡เชจเซ€ เชฒเซ€เชŸเซ€เช“:
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

เช•เซเชฏเชพเช‚,
GPG_SECRET_KEY_PASSPHRASE - GPG เช•เซ€ เชชเชพเชธเชตเชฐเซเชก
SONATYPE_USERNAME - sonatype เชเช•เชพเช‰เชจเซเชŸ เชฒเซ‹เช—เชฟเชจ

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชœเชฎเชพเชตเซ‹

  • เช…เชฎเซ‡ Java เชจเชพ เช‡เชšเซเช›เชฟเชค เชธเช‚เชธเซเช•เชฐเชฃ เชธเชพเชฅเซ‡ เชœเชฎเชพเชตเชŸ เชชเชฐ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชเช•เชฆเชฎ เชธเชฐเชณ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒ เชฌเชจเชพเชตเซ€เช เช›เซ€เช. เชจเซ€เชšเซ‡ เช†เชฒเซเชชเชพเช‡เชจ เชฎเชพเชŸเซ‡เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡.

    FROM java:8u111-jdk-alpine
    RUN apk add gnupg maven git --update-cache 
    --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && 
    mkdir ~/.m2/

  • เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเชพเชŸเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชฌเชจเชพเชตเชตเซเช‚

    docker build -t registry.gitlab.com/group/deploy .

  • เช…เชฎเซ‡ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ‡ เชชเซเชฐเชฎเชพเชฃเชฟเชค เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชฒเซ‹เชก เช•เชฐเซ€เช เช›เซ€เช.

    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€.เช†เชˆ.

เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชœเชฎเชพเชตเซ‹

เชกเชฟเชชเซเชฒเซ‹เชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชฐเซ‚เชŸเชฎเชพเช‚ เชซเชพเชˆเชฒ .gitlab-ci.yml เช‰เชฎเซ‡เชฐเซ‹
เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฌเซ‡ เชชเชฐเชธเซเชชเชฐ เชตเชฟเชถเชฟเชทเซเชŸ เชœเชฎเชพเชตเชŸ เช•เชพเชฐเซเชฏเซ‹ เชฐเชœเซ‚ เช•เชฐเซ‡ เช›เซ‡. เช…เชจเซเช•เซเชฐเชฎเซ‡ เชšเซ‹เช•เซเช•เชธ เชฐเชจเชฐ เช…เชฅเชตเชพ เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒ เชฐเชจเชฐ.

.gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # ะ—ะฐะดะฐั‡ะฐ ะฑัƒะดะตั‚ ะฒั‹ะฟะพะปะฝัั‚ัŒัั ะฝะฐ ะฒะฐัˆะตะผ shell-ั€ะฐะฝะฝะตั€ะต
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # ะ—ะฐะดะฐั‡ะฐ ะฑัƒะดะตั‚ ะฒั‹ะฟะพะปะฝัั‚ัŒัั ะฝะฐ ะฟัƒะฑะปะธั‡ะฝะพะผ docker-ั€ะฐะฝะฝะตั€ะต
  tags:
    - docker
  # ะžะฑั€ะฐะท ะธะท ั€ะฐะทะดะตะปะฐ GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # ะ˜ะผะฟะพั€ั‚ะธั€ัƒะตะผ GPG ะบะปัŽั‡
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # ะกะพั…ั€ะฐะฝัะตะผ maven ะบะพะฝั„ะธะณัƒั€ะฐั†ะธัŽ
    - printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # ะ—ะฐะดะฐั‡ะฐ ัั€ะฐะฑะพั‚ะฐะตั‚ ะฟะพ ั‚ั€ะธะณะณะตั€ัƒ, ะตัะปะธ ะฟะตั€ะตะดะฐะฝะฐ ะฟะตั€ะตะผะตะฝะฝะฐั DEPLOY ัะพ ะทะฝะฐั‡ะตะฝะธะตะผ java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # ะพั‚ะบะปัŽั‡ะฐะตะผ ะบะปะพะฝะธั€ะพะฒะฐะฝะธะต ั‚ะตะบัƒั‰ะตะณะพ ะฟั€ะพะตะบั‚ะฐ
    GIT_STRATEGY: none
  script:
    # ะŸั€ะตะดะพัั‚ะฐะฒะปัะตะผ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ั…ั€ะฐะฝะตะฝะธั ะฟะฐั€ะพะปั ะฒ ะฝะตะทะฐัˆะธั„ั€ะพะฒะฐะฝะฝะพะผ ะฒะธะดะต
    - git config --global credential.helper store
    # ะกะพั…ั€ะฐะฝัะตะผ ะฒั€ะตะผะตะฝะฝั‹ะต ะบั€ะตะดั‹ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั gitlab-ci-token
    # ะขะพะบะตะฝ ั€ะฐะฑะพั‚ะฐะตั‚ ะดะปั ะฒัะตั… ะฟัƒะฑะปะธั‡ะฝั‹ั… ะฟั€ะพะตะบั‚ะพะฒ gitlab.com ะธ ะดะปั ะฟั€ะพะตะบั‚ะพะฒ ะณั€ัƒะฟะฟั‹
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
    # ะŸะพะปะฝะพัั‚ัŒัŽ ั‡ะธัั‚ะธะผ ั‚ะตะบัƒั‰ัƒัŽ ะดะธั€ะตะบั‚ะพั€ะธัŽ
    - rm -rf .* *
    # ะšะปะพะฝะธั€ัƒะตะผ ะฟั€ะพะตะบั‚ ะบะพั‚ะพั€ั‹ะน, ะฑัƒะดะตะผ ะดะตะฟะปะพะธั‚ัŒ ะฒ Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # ะŸะตั€ะตะบะปัŽั‡ะฐะตะผัั ะฝะฐ ะฝัƒะถะฝั‹ะน ะบะพะผะผะธั‚
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # ะ•ัะปะธ ั…ะพั‚ัŒ ะพะดะธะฝ pom.xml ัะพะดะตั€ะถะธั‚ ะฟะฐั€ะฐะผะตั‚ั€ autoReleaseAfterClose ะฒะฐะปะธะผ ัะฑะพั€ะบัƒ.
    # ะ’ ะฟั€ะพั‚ะธะฒะฝะพะผ ัะปัƒั‡ะฐะต ะตัั‚ัŒ ั€ะธัะบ ะทะฐะปะธั‚ัŒ ัั‹ั€ั‹ะต ะฐั€ั‚ะตั„ะฐะบั‚ั‹ ะฒ maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
          exit 1;
        fi;
      done
    # ะ•ัะปะธ ะฟะฐั€ะฐะผะตั‚ั€ DEPLOY_CI_COMMIT_TAG ะฟัƒัั‚ะพะน, ั‚ะพ ะฟั€ะธะฝัƒะดะธั‚ะตะปัŒะฝะพ ัั‚ะฐะฒะธะผ SNAPSHOT-ะฒะตั€ัะธัŽ
    - >
      if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
        mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
      else
        VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
        if [[ "${VERSION}" == *-SNAPSHOT ]]; then
          mvn versions:set -DnewVersion=${VERSION}
        else
          mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
        fi
      fi
    # ะ—ะฐะฟัƒัะบะฐะตะผ ะทะฐะดะฐั‡ัƒ ะฝะฐ ัะฑะพั€ะบัƒ ะธ ะดะตะฟะปะพะน ะฐั€ั‚ะตั„ะฐะบั‚ะพะฒ
    - mvn clean deploy -DskipTests=true

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ

เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชฎเชพเช‚ เช•เซ‡ เชœเซ‡ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชเชฎเชพเช‚ เช…เชชเชฒเซ‹เชก เชฅเชตเชพเชจเชพ เช›เซ‡, เชคเชฎเชพเชฐเซ‡ เชฐเชฟเชฒเซ€เช เช…เชจเซ‡ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เชตเชฐเซเชเชจ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ 2 เชชเช—เชฒเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy

<...>

Release:
  extends: .trigger_deploy
  # ะ—ะฐะฟัƒัะบะฐั‚ัŒ ะทะฐะดะฐั‡ัƒ ั‚ะพะปัŒะบะพ ะฟo ั‚ะตะณัƒ.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # ะ—ะฐะฟัƒัะบะฐะตะผ ะทะฐะดะฐั‡ัƒ ะฝะฐ ะฟัƒะฑะปะธะบะฐั†ะธัŽ SNAPSHOT ะฒะตั€ัะธะธ ะฒั€ัƒั‡ะฝัƒัŽ
  when: manual
  # ะะต ะทะฐะฟัƒัะบะฐั‚ัŒ ะทะฐะดะฐั‡ัƒ, ะตัะปะธ ะฟั€ะพัั‚ะฐะฒะปะตะฝ ั‚ะตะณ.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # ะžั‚ะบะปัŽั‡ะฐะตะผ ะบะปะพะฝะธั€ะพะฒะฐะฝะธะต ั‚ะตะบัƒั‰ะตะณะพ ะฟั€ะพะตะบั‚ะฐ
    GIT_STRATEGY: none
    # ะกัั‹ะปะบะฐ ะฝะฐ ั‚ั€ะธะณะณะตั€ deploy-ะทะฐะดะฐั‡ะธ
    URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
    # ะŸะตั€ะตะผะตะฝะฝั‹ะต deploy-ะทะฐะดะฐั‡ะธ
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
    # ะะต ะธัะฟะพะปัŒะทัƒัŽ cURL, ั‚ะฐะบ ะบะฐะบ ั ั„ะปะฐะณะฐะผะธ --fail --show-error
    # ะพะฝ ะฝะต ะฒั‹ะฒะพะดะธั‚ ั‚ะตะปะพ ะพั‚ะฒะตั‚ะฐ, ะตัะปะธ HTTP ะบะพะด 400 ะธ ะฑะพะปะตะต 
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

เช† เช‰เช•เซ‡เชฒเชฎเชพเช‚, เชนเซเช‚ เชฅเซ‹เชกเซ‹ เช†เช—เชณ เช—เชฏเซ‹ เช…เชจเซ‡ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชเช• CI เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚.

เชตเชฟเช—เชคเซ‹เชฎเชพเช‚

เชฎเซ‡เช‚ เชเช• เช…เชฒเช— เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซเชฏเซ‹ gitlab-ci เชœเซ‡เชฎเชพเช‚ เชคเซ‡เชฃเซ‡ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชฎเชพเชŸเซ‡ CI เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ เชฎเซ‚เช•เซเชฏเซเช‚ เชนเชคเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ.yml.

เชธเชพเชฎเชพเชจเซเชฏ.yml

stages:
  - build
  - test
  - verify
  - deploy

variables:
  SONAR_ARGS: "
  -Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA} 
  -Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME} 
  "

.build_java_project:
  stage: build
  tags:
    - touchbit-shell
  variables:
    SKIP_TEST: "false"
  script:
    - mvn clean
    - mvn package -DskipTests=${SKIP_TEST}
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.build_sphinx_doc:
  stage: build
  tags:
    - touchbit-shell
  variables:
    DOCKERFILE: .indirect/docs/Dockerfile
  script:
    - docker build --no-cache -t ${CI_PROJECT_NAME}/doc -f ${DOCKERFILE} .

.junit_module_test_run:
  stage: test
  tags:
    - touchbit-shell
  variables:
    MODULE: ""
  script:
    - cd ${MODULE}
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.junit_test_run:
  stage: test
  tags:
    - touchbit-shell
  script:
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
    - "*/target/reports"

.sonar_review:
  stage: verify
  tags:
    - touchbit-shell
  dependencies: []
  script:
    - >
      if [ "$CI_BUILD_REF_NAME" == "master" ]; then
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
      else
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
      fi

.trigger_deploy:
  stage: deploy
  tags:
    - touchbit-shell
  variables:
    URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
  - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

.trigger_release_deploy:
  extends: .trigger_deploy
  only:
    - tags

.trigger_snapshot_deploy:
  extends: .trigger_deploy
  when: manual
  except:
    - tags

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชฎเชพเช‚, .gitlab-ci.yml เช–เซ‚เชฌ เช•เซ‹เชฎเซเชชเซ‡เช•เซเชŸ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชตเชฐเซเชฌเซ‹เช เชจเชฅเซ€

.gitlab-ci.yml

include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml

Shields4J:
  extends: .build_java_project

Sphinx doc:
  extends: .build_sphinx_doc
  variables:
    DOCKERFILE: .docs/Dockerfile

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

pom.xml เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ

เช† เชตเชฟเชทเชฏเชจเซเช‚ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡. เช—เซ‹เช—เซ‹เชฒเชชเซเชฒเซ‡เช•เซเชธ ะฒ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เช…เชจเซ‡ เชธเซเชŸเซ‡เชœเซ€เช‚เช— เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชเชฎเชพเช‚ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸเซเชธเชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชธเชพเช‡เชจ เช•เชฐเชตเชพ เช…เชจเซ‡ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เชตเชจเชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเซเช‚, เชคเซ‡เชฅเซ€ เชนเซเช‚ เชชเซเชฒเช—เชฟเชจเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เช˜เซ‹เช‚เช˜เชพเชŸเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถ. เชนเซเช‚ เช เชชเชฃ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถ เช•เซ‡ เชคเชฎเซ‡ เช•เซ‡เชŸเชฒเซ€ เชธเชฐเชณเชคเชพเชฅเซ€ เช…เชจเซ‡ เช•เซเชฆเชฐเชคเซ€ เชฐเซ€เชคเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ nexus-staging-maven-pluginเชœเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเชพเชŸเซ‡ เชชเซ‡เชฐเซ‡เชจเซเชŸ เชคเชฐเซ€เช•เซ‡ org.sonatype.oss:oss-parent เช‡เชšเซเช›เชคเชพ เชจเชฅเซ€ เช…เชฅเชตเชพ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€.

maven-install-plugin

เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡ เช›เซ‡.
เช…เชจเซเชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชฎเชพเช‚ เช‰เช•เซ‡เชฒเซ‹เชจเซ€ เชธเซเชฅเชพเชจเชฟเช• เชšเช•เชพเชธเชฃเซ€ เชคเซ‡เชฎเชœ เชšเซ‡เช•เชธเชฎ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เชœ เช‰เชชเชฏเซ‹เช—เซ€.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-project</id>
      <!-- ะ•ัะปะธ ัƒ ะฒะฐั ะผะฝะพะณะพะผะพะดัƒะปัŒะฝั‹ะน ะฟั€ะพะตะบั‚ ั ะดะตะฟะปะพะตะผ ั€ะพะดะธั‚ะตะปัŒัะบะพะณะพ ะฟะพะผะธะบะฐ -->
      <phase>install</phase>
      <!-- ะฏะฒะฝะพ ัƒะบะฐะทั‹ะฒะฐะตะผ ั„ะฐะนะปั‹ ะดะปั ะปะพะบะฐะปัŒะฝะพะน ัƒัั‚ะฐะฝะพะฒะบะธ -->
      <configuration>
        <file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
        <pomFile>dependency-reduced-pom.xml</pomFile>
        <!-- ะŸั€ะธะฝัƒะดะธั‚ะตะปัŒะฝะพะต ะพะฑะฝะพะฒะปะตะฝะธะต ะผะตั‚ะฐะดะฐะฝะฝั‹ั… ะฟั€ะพะตะบั‚ะฐ -->
        <updateReleaseInfo>true</updateReleaseInfo>
        <!-- ะšะพะฝั‚ั€ะพะปัŒะฝั‹ะต ััƒะผะผั‹ ะดะปั ะฟั€ะพะฒะตั€ะบะธ ั†ะตะปะพัั‚ะฝะพัั‚ะธ -->
        <createChecksum>true</createChecksum>
      </configuration>
    </execution>
  </executions>
</plugin>

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

maven-javadoc-เชชเซเชฒเช—เช‡เชจ

เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเชพเชŸเซ‡ javadoc เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
      <!-- ะ“ะตะฝะตั€ะฐั†ะธั javadoc ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ะฟะพัะปะต ั„ะฐะทั‹ ะณะตะฝะตั€ะฐั†ะธะธ ั€ะตััƒั€ัะพะฒ -->
      <phase>prepare-package</phase>
      <configuration>
        <!-- ะžั‡ะตะฝัŒ ะฟะพะผะพะณะฐะตั‚ ะฒ ะฟัƒะฑะปะธั‡ะฝั‹ั… ะฟั€ะพะตะบั‚ะฐั… -->
        <failOnError>true</failOnError>
        <failOnWarnings>true</failOnWarnings>
        <!-- ะฃะฑะธั€ะฐะตั‚ ะพัˆะธะฑะบัƒ ะฟะพะธัะบะฐ ะดะพะบัƒะผะตะฝั‚ะฐั†ะธะธ ะฒ target ะดะธั€ะตะบั‚ะพั€ะธะธ -->
        <detectOfflineLinks>false</detectOfflineLinks>
      </configuration>
    </execution>
  </executions>
</plugin>

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเชตเซเช‚ เชฎเซ‹เชกเซเชฏเซเชฒ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชœเชพเชตเชพ เชจเชฅเซ€ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชฎเชพเชคเซเชฐ เชธเช‚เชธเชพเชงเชจเซ‹)
เช…เชฅเชตเชพ เชคเชฎเซ‡ เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡ javadoc เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€, เชชเช›เซ€ เชฎเชฆเชฆ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ maven-jar-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>empty-javadoc-jar</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <classifier>javadoc</classifier>
        <classesDirectory>${basedir}/javadoc</classesDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

maven-gpg-เชชเซเชฒเช—เช‡เชจ

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- ะกะฑะพั€ะบะฐ ะฑัƒะดะตั‚ ะฟะฐะดะฐั‚ัŒ, ะตัะปะธ ะพั‚ััƒั‚ัั‚ะฒัƒะตั‚ GPG ะบะปัŽั‡ -->
      <!-- ะŸะพะดะฟะธัั‹ะฒะฐะตะผ ะฐั€ั‚ะตั„ะฐะบั‚ั‹ ั‚ะพะปัŒะบะพ ะฝะฐ ั„ะฐะทะต deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

nexus-staging-maven-plugin

เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ:

<project>
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <!-- ะžะฑะฝะพะฒะปัะตะผ ะผะตั‚ะฐะดะฐะฝะฝั‹ะต, ั‡ั‚ะพะฑั‹ ะฟะพะผะตั‚ะธั‚ัŒ ะฐั€ั‚ะตั„ะฐะบั‚ ะบะฐะบ release -->
            <!-- ะะต ะฒะปะธัะตั‚ ะฝะฐ snapshot ะฒะตั€ัะธะธ -->
            <updateReleaseInfo>true</updateReleaseInfo>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <configuration>
            <!-- ะžั‚ะบะปัŽั‡ะฐะตะผ ะฟะปะฐะณะธะฝ -->
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <distributionManagement>
    <snapshotRepository>
      <id>sonatype</id>
      <name>Nexus Snapshot Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype</id>
      <name>Nexus Release Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฎเชฒเซเชŸเชฟ-เชฎเซ‹เชกเซเชฏเซเชฒ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช›เซ‡, เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‡ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชšเซ‹เช•เซเช•เชธ เชฎเซ‹เชกเซเชฏเซเชฒ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เช† เชฎเซ‹เชกเซเชฏเซเชฒเชจเชพ pom.xml เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. nexus-staging-maven-plugin เชงเซเชตเชœ เชธเชพเชฅเซ‡ skipNexusStagingDeployMojo

<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <configuration>
        <skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
      </configuration>
    </plugin>
  </plugins>
</build>

เช…เชชเชฒเซ‹เชก เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ/เชชเซเชฐเช•เชพเชถเชจ เช†เชตเซƒเชคเซเชคเชฟเช“ เช‰เชชเชฒเชฌเซเชง เช›เซ‡ เชธเซเชŸเซ‡เชœเซ€เช‚เช— เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เช

<repositories>
  <repository>
    <id>SonatypeNexus</id>
    <url>https://oss.sonatype.org/content/groups/staging/</url>
    <!-- ะะต ะฝะฐะดะพ ัƒะบะฐะทั‹ะฒะฐั‚ัŒ ั„ะปะฐะณะธ snapshot/release ะดะปั ั€ะตะฟะพะทะธั‚ะพั€ะธั -->
  </repository>
</repositories>

เชตเชงเซ เชชเซเชฒเซ€เชธเชธ

  • เชจเซ‡เช•เซเชธเชธ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชฒเช•เซเชทเซเชฏเซ‹เชจเซ€ เช–เซ‚เชฌ เชธเชฎเซƒเชฆเซเชง เชฏเชพเชฆเซ€mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • เชฎเซ‡เชตเซ‡เชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒเชฎเชพเช‚ เชกเชพเช‰เชจเชฒเซ‹เชกเช•เซเชทเชฎเชคเชพ เชฎเชพเชŸเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เชชเซเชฐเช•เชพเชถเชจ เชคเชชเชพเชธเซ‹

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชชเชฐเชฟเชฃเชพเชฎ

เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เชธเช‚เชธเซเช•เชฐเชฃ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡, เชจเซ‡เช•เซเชธเชธเชฎเชพเช‚ SNAPSHOT เชธเช‚เชธเซเช•เชฐเชฃ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เช•เชพเชฐเซเชฏ เชถเชฐเซ‚ เช•เชฐเชตเซเช‚ เชถเช•เซเชฏ เช›เซ‡.

เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชœเซเชฏเชพเชฐเซ‡ เช† เช•เชพเชฐเซเชฏ เชฒเซ‹เช‚เชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชกเชฟเชชเซเชฒเซ‹เชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เช…เชจเซเชฐเซ‚เชช เช•เชพเชฐเซเชฏ เชŸเซเชฐเชฟเช—เชฐ เชฅเชพเชฏ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ).

เช•เชพเชชเซ‡เชฒ เชฒเซ‹เช—

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

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชจเซ‡เช•เซเชธเชธ เชตเชฐเซเชเชจ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡ 1.0.0-เชธเซเชจเซ‡เชชเชถเซ‹เชŸ.

เชฌเชงเชพ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชธเชพเช‡เชŸ เชชเชฐเชจเชพ เชญเช‚เชกเชพเชฐเชฎเชพเช‚เชฅเซ€ เชฆเซ‚เชฐ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ oss.sonatype.org เชคเชฎเชพเชฐเชพ เช–เชพเชคเชพ เชนเซ‡เช เชณ.

เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชชเซเชฐเช•เชพเชถเชจ เชธเช‚เชธเซเช•เชฐเชฃเชจเซเช‚ เชชเซเชฐเช•เชพเชถเชจ

เชœเซเชฏเชพเชฐเซ‡ เชŸเซ‡เช— เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชกเชฟเชชเซเชฒเซ‹เชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เช…เชจเซเชฐเซ‚เชช เช•เชพเชฐเซเชฏ เชจเซ‡เช•เซเชธเชธ (เช‰เชฆเชพเชนเชฐเชฃ).

เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชถเซเชฐเซ‡เชทเซเช  เชญเชพเช— เช เช›เซ‡ เช•เซ‡ เชจเชœเซ€เช•เชจเชพ เชชเซเชฐเช•เชพเชถเชจ เชจเซ‡เช•เซเชธเชธเชฎเชพเช‚ เช†เชชเชฎเซ‡เชณเซ‡ เชŸเซเชฐเชฟเช—เชฐ เชฅเชพเชฏ เช›เซ‡.

[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 เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชชเซเชฐเช•เชพเชถเชจ เชชเช›เซ€, เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€, เช•เชฒเชพเช•เซƒเชคเชฟเช“ เช…เช‚เชฆเชฐ เชนเชถเซ‡ เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชชเชฐ เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เชธเซ‡เชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช‘เชซเชŸเซ‹เชชเชฟเช•

เชคเซ‡ เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชเช• เชธเชพเช•เซเชทเชพเชคเซเช•เชพเชฐ เชนเชคเซ‹ เช•เซ‡ เชฎเซ‡เชตเซ‡เชจ เช…เชจเซเชฏ เชœเชพเชนเซ‡เชฐ เชญเช‚เชกเชพเชฐเซ‹เชจเซ‡ เช…เชจเซเช•เซเชฐเชฎเชฟเชค เช•เชฐเซ‡ เช›เซ‡.
เชฎเชพเชฐเซ‡ robots.txt เช…เชชเชฒเซ‹เชก เช•เชฐเชตเซ€ เชชเชกเซ€ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชฎเชพเชฐเชพ เชœเซ‚เชจเชพ เชญเช‚เชกเชพเชฐเชจเซ‡ เช…เชจเซเช•เซเชฐเชฎเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชจเชฟเชทเซเช•เชฐเซเชท

เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชถเซเช‚ เช›เซ‡

  • เชเช• เช…เชฒเช— เชกเชฟเชชเซเชฒเซ‹เชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชœเซ‡เชฎเชพเช‚ เชคเชฎเซ‡ เชตเชฟเชตเชฟเชง เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชฒเซ‡เช‚เช—เซเชตเซ‡เชœ เชฎเชพเชŸเซ‡ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชเชฎเชพเช‚ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸเซเชธ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ CI เช•เชพเชฐเซเชฏเซ‹เชจเซ‹ เช…เชฎเชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.
  • เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชนเชพเชฐเชจเซ€ เชฆเช–เชฒเช—เซ€เชฐเซ€เชฅเซ€ เช…เชฒเช— เช›เซ‡ เช…เชจเซ‡ เชซเช•เซเชค เชฎเชพเชฒเชฟเช• เช…เชจเซ‡ เชœเชพเชณเชตเชฃเซ€เชจเซ€ เชญเซ‚เชฎเชฟเช•เชพ เชงเชฐเชพเชตเชคเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฆเซเชตเชพเชฐเชพ เชœ เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.
  • เชซเช•เซเชค เชตเซเชฏเชตเชธเซเชฅเชฟเชค เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ "เชนเซ‹เชŸ" เช•เซ‡เชถ เชธเชพเชฅเซ‡เชจเซ‹ เชเช• เช…เชฒเช— เชตเชฟเชถเชฟเชทเซเชŸ เชฐเชจเชฐ.
  • เชชเชฌเซเชฒเชฟเช• เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ/เชฐเซ€เชฒเซ€เช เชตเชฐเซเชเชจเชจเซเช‚ เชชเซเชฐเช•เชพเชถเชจ.
  • เชฎเซ‡เชตเซ‡เชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชจ เชฎเชพเชŸเซ‡ เชคเชคเซเชชเชฐเชคเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเช•เชพเชถเชจ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ€ เชธเซเชตเชšเชพเชฒเชฟเชค เชคเชชเชพเชธ.
  • เชฎเซ‡เชตเซ‡เชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒเชฎเชพเช‚ "เช•เชพเชšเชพ" เชธเช‚เชธเซเช•เชฐเชฃเซ‹เชจเชพ เชธเซเชตเชšเชพเชฒเชฟเชค เชชเซเชฐเช•เชพเชถเชจ เชธเชพเชฎเซ‡ เชฐเช•เซเชทเชฃ.
  • "เช•เซเชฒเชฟเช• เชชเชฐ" เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‹.
  • เชธเซเชจเซ‡เชชเชถเซ‹เชŸ/เชฐเซ€เชฒเซ€เช เชตเชฐเซเชเชจ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€.
  • เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชตเชพ/เชชเชฐเซ€เช•เซเชทเชฃ/เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชชเชพเช‡เชชเชฒเชพเช‡เชจ.

GitLab CI เชธเซ‡เชŸ เช•เชฐเชตเซเช‚ เช เชเชŸเชฒเซ‹ เชœเชŸเชฟเชฒ เชตเชฟเชทเชฏ เชจเชฅเซ€ เชœเซ‡เชŸเชฒเซ‹ เชคเซ‡ เชชเซเชฐเชฅเชฎ เชจเชœเชฐเชฎเชพเช‚ เชฒเชพเช—เซ‡ เช›เซ‡. เชŸเชฐเซเชจเช•เซ€ เชงเซ‹เชฐเชฃเซ‡ เชธเซ€เช†เชˆเชจเซ‡ เชฌเซ‡ เชตเช–เชค เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เชชเซ‚เชฐเชคเซเช‚ เช›เซ‡, เช…เชจเซ‡ เชนเชตเซ‡ เชคเชฎเซ‡ เช† เชฌเชพเชฌเชคเชฎเชพเช‚ เช•เชฒเชพเชชเซเชฐเซ‡เชฎเซ€เชฅเซ€ เชฆเซ‚เชฐ เช›เซ‹. เชตเชงเซเชฎเชพเช‚, GitLab เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เช–เซ‚เชฌ เชœ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชชเซเชฐเชฅเชฎ เชชเช—เชฒเซเช‚ เชฒเซ‡เชตเชพเชฅเซ€ เชกเชฐเชถเซ‹ เชจเชนเซ€เช‚. เชšเชพเชฒเชคเซ€ เชตเซเชฏเช•เซเชคเชฟเชจเชพ เชชเช—เชฅเชฟเชฏเชพเช‚ เชจเซ€เชšเซ‡ เชฐเชธเซเชคเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ (เชฎเชจเซ‡ เชฏเชพเชฆ เชจเชฅเซ€ เช•เซ‡ เช•เซ‹เชฃเซ‡ เช•เชนเซเชฏเซเช‚ :)

เชฎเชจเซ‡ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชจเช‚เชฆ เชฅเชถเซ‡.

เช†เช—เชฒเชพ เชฒเซ‡เช–เชฎเชพเช‚, เชนเซเช‚ เชคเชฎเชจเซ‡ เชฌเชคเชพเชตเซ€เชถ เช•เซ‡ เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชถเซ‡เชฒ เชฐเชจเชฐ เชนเซ‹เชฏ เชคเซ‹ เชธเซเชชเชฐเซเชงเชพเชคเซเชฎเช• เชฐเซ€เชคเซ‡ (เชกเซ‹เช•เชฐ-เช•เช‚เชชเซ‹เช เชธเชพเชฅเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชธเซ‡เชตเชพเช“ เชšเชฒเชพเชตเชตเซ€) เชเช•เซ€เช•เชฐเชฃ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ GitLab CI เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเซเช‚.

เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชŸเซ‡

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹