เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต GitLab CI เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดˆ เดฒเต‡เด–เดจเด‚, GitLab เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเต‹เดฃเดพเดŸเตˆเดชเตเดชเต เด•เต‚เดŸเดพเดคเต†/เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเตฝ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด…เดตเดฐเตเดŸเต† เด‰เตฝเดชเตเดชเดจเตเดจเด™เตเด™เตพ เดตเต‡เด—เดคเตเดคเดฟเตฝ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เต‡เดฃเตเดŸ เดœเดพเดต เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เดพเดฏเดฟ เด‰เดฆเตเดฆเต‡เดถเดฟเดšเตเดšเตเดณเตเดณเดคเดพเดฃเต. เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดˆ เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเตป gitlab-runner, gitlab-ci, maven-plugin เดŽเดจเตเดจเดฟเดต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเดพเตป เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเด‚.

เดฎเตเตปเดตเตเดฏเดตเดธเตเดฅเด•เตพ:

  • mvn, GPG เด•เต€เด•เดณเตเดŸเต† เดธเตเดฐเด•เตเดทเดฟเดค เดธเด‚เดญเดฐเดฃเด‚.
  • เดชเตŠเดคเต CI เดŸเดพเดธเตเด•เตเด•เตเด•เดณเตเดŸเต† เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏ เดจเดฟเตผเดตเตเดตเดนเดฃเด‚.
  • เดชเตŠเดคเต เดถเต‡เด–เดฐเดฃเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดพเดตเดธเตเดคเตเด•เตเด•เตพ (เดฑเดฟเดฒเต€เดธเต/เดธเตเดจเดพเดชเตเดชเตเดทเต‹เดŸเตเดŸเต) เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  • เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเตฝ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดฑเดฟเดฒเต€เดธเต เดชเดคเดฟเดชเตเดชเตเด•เดณเตเดŸเต† เดฏเดพเดจเตเดคเตเดฐเดฟเด• เดชเดฐเดฟเดถเต‹เดงเดจ.
  • เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เตเดณเตเดณ เด’เดฐเต เดถเต‡เด–เดฐเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดพเดตเดธเตเดคเตเด•เตเด•เตพ เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเตŠเดคเต เดชเดฐเดฟเดนเดพเดฐเด‚.
  • เดฒเดพเดณเดฟเดคเตเดฏเดตเตเด‚ เด‰เดชเดฏเต‹เด— เดŽเดณเตเดชเตเดชเดตเตเด‚.

เด‰เดณเตเดณเดŸเด•เตเด•เด‚

เดชเตŠเดคเตเดตเดฟเดตเดฐเด™เตเด™เตพ

  • Sonatype OSS Repository Hosting Service เดตเดดเดฟ เดฎเดพเดตเต†เตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดพเดตเดธเตเดคเตเด•เตเด•เตพ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเด‚เดตเดฟเดงเดพเดจเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดถเดฆเดฎเดพเดฏ เดตเดฟเดตเดฐเดฃเด‚ เด‡เดคเดฟเดจเด•เด‚ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เดˆ เดฒเต‡เด–เดจเด‚ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เด—เต‚เด—เต‹เตพเดชเตเดฒเต†เด•เตเดธเต, เด…เดคเดฟเดจเดพเตฝ เดžเดพเตป เดˆ เดฒเต‡เด–เดจเด‚ เดถเดฐเดฟเดฏเดพเดฏ เดธเตเดฅเดฒเด™เตเด™เดณเดฟเตฝ เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเด‚.
  • เดŽเดจเตเดจ เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเตฝ เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด• เดธเต‹เดฃเดŸเตˆเดชเตเดชเต JIRA เดถเต‡เด–เดฐเด‚ เดคเตเดฑเด•เตเด•เดพเตป เด’เดฐเต เดŸเดฟเด•เตเด•เดฑเตเดฑเต เดคเตเดฑเด•เตเด•เตเด• (เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพเด•เตเด•เต เดตเดฟเดญเดพเด—เด‚ เดตเดพเดฏเดฟเด•เตเด•เตเด• Sonatype JIRA-เดฏเดฟเตฝ เด’เดฐเต เดŸเดฟเด•เตเด•เดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•). เดถเต‡เด–เดฐเด‚ เดคเตเดฑเดจเตเดจเดคเดฟเดจเต เดถเต‡เดทเด‚, เดธเต‹เดฃเดŸเตˆเดชเตเดชเต เดจเต†เด•เตเดธเดธเดฟเดฒเต‡เด•เตเด•เต เด†เตผเดŸเตเดŸเดฟเดซเดพเด•เตเดฑเตเดฑเตเด•เตพ เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเตป JIRA เดฒเต‹เด—เดฟเตป/เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดœเต‹เดŸเดฟ (เด‡เดจเดฟเดฎเตเดคเตฝ เดธเต‹เดฃเดŸเตˆเดชเตเดชเต เด…เด•เตเด•เต—เดฃเตเดŸเต เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด‚) เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.
  • เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เด’เดฐเต GPG เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดตเดณเดฐเต† เดตเดฐเดฃเตเดŸ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพเด•เตเด•เต เดตเดฟเดญเดพเด—เด‚ เด•เดพเดฃเตเด• เดชเตเดฐเดพเดตเดธเตเดคเตเด•เตเด•เตพ เด’เดชเตเดชเดฟเดŸเดพเตป GnuPG เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต
  • เด’เดฐเต GPG เด•เต€ (gnupg/gnupg2) เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ Linux เด•เตบเดธเต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต rng- เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดŽเตปเดŸเตเดฐเต‹เดชเตเดชเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป. เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด•เต€ เดœเดจเดฑเต‡เดทเตป เดตเดณเดฐเต† เดธเดฎเดฏเดฎเต†เดŸเตเด•เตเด•เตเด‚.
  • เดธเด‚เดญเดฐเดฃ โ€‹โ€‹เดธเต‡เดตเดจเด™เตเด™เตพ เดชเตŠเดคเต GPG เด•เต€เด•เตพ

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

GitLab-เตฝ เด’เดฐเต เดตเดฟเดจเตเดฏเดพเดธ เดชเดฆเตเดงเดคเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

  • เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เด†เตผเดŸเตเดŸเดฟเดซเดพเด•เตเดฑเตเดฑเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเตˆเดชเตเดชเตเดฒเตˆเตป เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดจเดฟเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดตเต‡เดฃเด‚. เดžเดพเตป เดŽเดจเตเดฑเต† เดชเตเดฐเต‹เดœเด•เตเดŸเดฟเดจเต เดฒเดณเดฟเดคเดฎเดพเดฏเตเด‚ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดชเต‡เดฐเดฟเดŸเตเดŸเต - เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•
  • เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดถเต‡เดทเด‚, เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด†เด•เตเดธเดธเต เดจเดฟเด™เตเด™เตพ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.
    เดชเตเดฐเตŠเดœเด•เตเดฑเตเดฑเต -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ -> เดธเด‚เดฐเด•เตเดทเดฟเดค เดถเดพเด–เด•เตพ เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเด•. เดžเด™เตเด™เตพ เดŽเดฒเตเดฒเดพ เดจเดฟเดฏเดฎเด™เตเด™เดณเตเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•เดฏเตเด‚ เดตเตˆเตฝเดกเตโ€Œเด•เดพเตผเดกเต * เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเตŠเดฑเตเดฑ เดจเดฟเดฏเดฎเด‚ เดšเต‡เตผเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เดฎเต†เดฏเดฟเตปเดฑเดจเต‡เดดเตโ€Œเดธเต เดฑเต‹เดณเตเดณเตเดณ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เต เดฎเดพเดคเตเดฐเด‚ เดชเตเดทเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดฒเดฏเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเดฎเตเดณเตเดณ เด…เดตเด•เดพเดถเดฎเตเดฃเตเดŸเต. เดˆ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต†เดฏเตเด‚ เดˆ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจ เด—เตเดฐเต‚เดชเตเดชเดฟเดจเตเดฑเต†เดฏเตเด‚ เดŽเดฒเตเดฒเดพ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เตเด‚ เดˆ เดจเดฟเดฏเดฎเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚.
    เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต GitLab CI เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต
  • เดจเดฟเดฐเดตเดงเดฟ เดฎเต†เดฏเดฟเดจเตเดฑเดจเตผเดฎเดพเตผ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเตเดฐเดตเต‡เดถเดจเด‚ เดคเดคเตเดตเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดเดฑเตเดฑเดตเตเด‚ เดฎเดฟเด•เดšเตเดš เดชเดฐเดฟเดนเดพเดฐเด‚.
    เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> เดชเตŠเดคเตเดตเดพเดฏเดคเต -> เดฆเตƒเดถเตเดฏเดชเดฐเดค, เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ, เด…เดจเตเดฎเดคเดฟเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดฆเตƒเดถเตเดฏเดชเดฐเดค เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด• เดธเตเดตเด•เดพเดฐเตเดฏ.
    เดŽเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ GitLab เดฑเดฃเตเดฃเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เดŽเดจเดฟเด•เตเด•เต เดชเตŠเดคเต เด†เด•เตโ€Œเดธเดธเตเดธเดฟเตฝ เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตโ€Œเดฑเตเดฑเต เด‰เดฃเตเดŸเต, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดถเต‡เด–เดฐเด‚ เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เดพเตป เดŽเดจเดฟเด•เตเด•เต เดฎเดพเดคเตเดฐเดฎเต‡ เด†เด•เตโ€Œเดธเดธเต เด‰เดณเตเดณเต‚. เดถเดฐเดฟ, เดชเตŠเดคเต เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเตป เดฒเต‹เด—เตเด•เดณเดฟเตฝ เดธเตเดตเด•เดพเดฐเตเดฏ เดตเดฟเดตเดฐเด™เตเด™เตพ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดŽเดจเตเดฑเต† เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเดฒเตเดฒ.
  • เดถเต‡เด–เดฐเด‚ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดฟเดฏเดฎเด™เตเด™เตพ เด•เตผเดถเดจเดฎเดพเด•เตเด•เตเดจเตเดจเต
    เดชเตเดฐเตŠเดœเด•เตเดฑเตเดฑเต -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ -> เดชเตเดทเต เดฑเต‚เดณเตเด•เตพ เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เด•เดฎเตเดฎเต€เดฑเตเดฑเตผ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด‚ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด•, เดฐเดšเดฏเดฟเดคเดพเดตเต เด’เดฐเต GitLab เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดซเตเดฒเดพเด—เตเด•เดณเดพเดฃเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•. เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดžเดพเตป เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต เด’เดชเตเดชเดฟเดŸเตฝ เดจเดŸเดคเตเดคเตเด•, เด’เดชเตเดชเดฟเดŸเดพเดคเตเดค เด•เดฎเตเดฎเดฟเดฑเตเดฑเต เดซเตเดฒเดพเด—เต เดจเดฟเดฐเดธเดฟเด•เตเด•เตเด•.
  • เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดŸเตเดฐเดฟเด—เตผ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต
    เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> CI / CD -> เดชเตˆเดชเตเดชเตเดฒเตˆเตป เดŸเตเดฐเดฟเด—เดฑเตเด•เตพ เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เด’เดฐเต เดชเตเดคเดฟเดฏ เดŸเตเดฐเดฟเด—เตผ-เดŸเต‹เด•เตเด•เตบ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
    เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เตเดณเตเดณ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเตเดŸเต† เดชเตŠเดคเตเดตเดพเดฏ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเดฟเดฒเต‡เด•เตเด•เต เดˆ เดŸเต‹เด•เตเด•เตบ เด‰เดŸเดจเดŸเดฟ เดšเต‡เตผเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต.
    เด—เตเดฐเต‚เดชเตเดชเต -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> CI / CD -> เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เด’เดฐเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เดšเต‡เตผเด•เตเด•เตเด• DEPLOY_TOKEN เดฎเต‚เดฒเตเดฏเดคเตเดคเดฟเตฝ เดŸเตเดฐเดฟเด—เตผ-เดŸเต‹เด•เตเด•เดฃเดฟเดจเตŠเดชเตเดชเด‚.

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

GitLab เดฑเดฃเตเดฃเตผ

เดจเต‡เดฑเตเดฑเต€เดตเต (เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ), เดชเตŠเดคเต (เดชเด™เตเด•เดฟเดŸเตเดŸ) เดฑเดฃเตเดฃเตผ เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดˆ เดตเดฟเดญเดพเด—เด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดชเตเดฐเดคเตเดฏเต‡เด• เดฑเดฃเตเดฃเตผ

เดžเดพเตป เดŽเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ เดฑเดฃเตเดฃเต‡เดดเตเดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚, เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เด‡เดคเต เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดตเตเด‚ เดตเต‡เด—เดคเดฏเต‡เดฑเดฟเดฏเดคเตเด‚ เดตเดฟเดฒเด•เตเดฑเดžเตเดžเดคเตเดฎเดพเดฃเต.
เดฑเดฃเตเดฃเตผเด•เตเด•เดพเดฏเดฟ เดžเดพเตป 1 เดธเดฟเดชเดฟเดฏเต, 2 เดœเดฟเดฌเดฟ เดฑเดพเด‚, 20 เดœเดฟเดฌเดฟ เดŽเดšเตเดšเตเดกเดฟเดกเดฟ เด‰เดณเตเดณ เดฒเดฟเดจเด•เตเดธเต เดตเดฟเดกเดฟเดŽเดธเต เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด‡เดทเตเดฏเต‚ เดตเดฟเดฒ เดชเตเดฐเดคเดฟเดตเตผเดทเด‚ ~3000โ‚ฝ เด†เดฃเต.

เดŽเดจเตเดฑเต† เด“เดŸเตเดŸเด•เตเด•เดพเดฐเตป

เดฑเดฃเตเดฃเดฑเดฟเดจเดพเดฏเดฟ เดžเดพเตป VDS 4 CPU, 4 GB RAM, 50 GB SSD เดŽเดจเตเดจเดฟเดต เดŽเดŸเตเดคเตเดคเต. เดตเดฟเดฒ ~11000โ‚ฝ, เด’เดฐเดฟเด•เตเด•เดฒเตเด‚ เด–เต‡เดฆเดฟเดšเตเดšเดฟเดฒเตเดฒ.
เดŽเดจเดฟเด•เตเด•เต เด†เด•เต† 7 เดฎเต†เดทเต€เดจเตเด•เตพ เด‰เดฃเตเดŸเต. เด…เดฐเต‚เดฌเดฏเดฟเตฝ 5 เด‰เด‚ เด‡เดนเต‹เดฑเดฟเตฝ 2 เด‰เด‚.

เด…เดคเดฟเดจเดพเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด“เดŸเตเดŸเด•เตเด•เดพเดฐเตป เด‰เดฃเตเดŸเต. เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เตพ เด…เดคเต เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เตเด‚.
เดžเด™เตเด™เตพ SSH เดตเดดเดฟ เดฎเต†เดทเต€เดจเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ java, git, maven, gnupg2 เดŽเดจเตเดจเดฟเดต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

gitlab เดฑเดฃเตเดฃเตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

  • เด’เดฐเต เดชเตเดคเดฟเดฏ เด—เตเดฐเต‚เดชเตเดชเต เด‰เดฃเตเดŸเดพเด•เตเด•เตเด• runner
    sudo groupadd runner
  • เดฎเดพเดตเตป เด•เดพเดทเต†เดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด—เตเดฐเต‚เดชเตเดชเต เด…เดจเตเดฎเดคเดฟเด•เตพ เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด• runner
    เด’เดฐเต‡ เดฎเต†เดทเต€เดจเดฟเตฝ เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดฑเดฃเตเดฃเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด‰เดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เด˜เดŸเตเดŸเด‚ เด’เดดเดฟเดตเดพเด•เตเด•เดพเด‚.

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

เดธเตเด•เตเดฐเต€เตป

เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต GitLab 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 -> Runners -> Specific Runners -> Runners เดˆ เดชเตเดฐเตŠเดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เดธเดœเต€เดตเดฎเดพเด•เตเด•เดฟ

เดธเตเด•เตเดฐเต€เตป

เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต 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 (เดœเดฟเดชเดฟเดœเดฟ เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด‡เดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต)

    ssh [email protected]

  • เดšเต‹เดฆเตเดฏเด™เตเด™เตพเด•เตเด•เต เด‰เดคเตเดคเดฐเด‚ เดจเตฝเด•เดฟ เดžเด™เตเด™เตพ เด’เดฐเต เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต. เดžเดพเตป เดŽเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ เดชเต‡เดฐเตเด‚ เด‡เดฎเต†เดฏเดฟเดฒเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต.
    เด•เต€เดฏเตเดŸเต† เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเด•. เดˆ เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดพเดตเดธเตเดคเตเด•เตเด•เตพ เด’เดชเตเดชเดฟเดŸเตเด‚.

    gpg --gen-key 

  • เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•

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

  • เด•เต€เดธเต†เตผเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เดžเด™เตเด™เดณเตเดŸเต† เดชเตŠเดคเต เด•เต€ เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

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

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดฎเดพเดตเตป เดธเดœเตเดœเต€เด•เดฐเดฃเด‚

  • เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เด•เต€เดดเดฟเตฝ เดชเต‹เด•เตเดจเตเดจเต gitlab-deployer
    su gitlab-deployer 
  • เด’เดฐเต เดฎเดพเดตเตป เดกเดฏเดฑเด•เตเดŸเดฑเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• เดธเด‚เดญเดฐเดฃเดฟเดฏเดพเดฃเต เด•เต‚เดŸเดพเดคเต† เด•เดพเดทเต†เดฏเดฟเดฒเต‡เด•เตเด•เต เดฒเดฟเด™เตเด•เต เดšเต†เดฏเตเดฏเตเด• (เดคเต†เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดฐเตเดคเต)
    เด’เดฐเต เดฎเต†เดทเต€เดจเดฟเตฝ เดจเดฟเดฐเดตเดงเดฟ เดฑเดฃเตเดฃเดฑเตเด•เดณเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด‰เดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เดชเต‹เดฏเดฟเดจเตเดฑเต เด’เดดเดฟเดตเดพเด•เตเด•เดพเด‚.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • เด’เดฐเต เดฎเดพเดธเตเดฑเตเดฑเตผ เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • เดซเดฏเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • เดธเต‹เดฃเดŸเตˆเดชเตเดชเต เด…เด•เตเด•เต—เดฃเตเดŸเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • ~/.m2/settings.xml เดซเดฏเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

เดŽเดตเดฟเดŸเต†,
GPG_SECRET_KEY_PASSPHRASE - GPG เด•เต€เดฏเตเดŸเต† เดชเดพเดธเตโ€Œเดตเต‡เดกเต
SONATYPE_USERNAME - เดธเต‹เดฃเดŸเตˆเดชเตเดชเต เด…เด•เตเด•เต—เดฃเตเดŸเต เดฒเต‹เด—เดฟเตป

เด‡เดคเต เดฑเดฃเตเดฃเตผ เดธเดœเตเดœเต€เด•เดฐเดฃเด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เตเดจเตเดจเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เดพเด‚ เดœเดฟเดฑเตเดฑเตโ€Œเดฒเดพเดฌเต เดธเดฟ.เด

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดชเด™เตเด•เดฟเดŸเตเดŸ เดฑเดฃเตเดฃเตผ

GPG เด•เต€ เดœเดจเดฑเต‡เดทเตป

  • เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดจเดฟเด™เตเด™เตพ เด’เดฐเต GPG เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, gnupg เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•.

    yum install -y gnupg

  • เดšเต‹เดฆเตเดฏเด™เตเด™เตพเด•เตเด•เต เด‰เดคเตเดคเดฐเด‚ เดจเตฝเด•เดฟ เดžเด™เตเด™เตพ เด’เดฐเต เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต. เดžเดพเตป เดŽเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ เดชเต‡เดฐเตเด‚ เด‡เดฎเต†เดฏเดฟเดฒเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต. เด•เต€เดฏเตเดŸเต† เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเด•.

    gpg --gen-key 

  • เด•เต€เดฏเดฟเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต

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

  • เด•เต€เดธเต†เตผเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เดžเด™เตเด™เดณเตเดŸเต† เดชเตŠเดคเต เด•เต€ เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

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

  • เด’เดฐเต เดธเตเดตเด•เดพเดฐเตเดฏ เด•เต€ เดจเต‡เดŸเตเดจเตเดจเต

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

  • เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> CI / CD -> เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เดธเตเดตเด•เดพเดฐเตเดฏ เด•เต€ เด’เดฐเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด• GPG_SECRET_KEY
    เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต GitLab CI เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดฎเดพเดตเตป เดธเดœเตเดœเต€เด•เดฐเดฃเด‚

  • เด’เดฐเต เดฎเดพเดธเตเดฑเตเดฑเตผ เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> CI / CD -> เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เด’เดฐเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด• SETTINGS_SECURITY_XML เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดฐเดฟเด•เตพ:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • เดธเต‹เดฃเดŸเตˆเดชเตเดชเต เด…เด•เตเด•เต—เดฃเตเดŸเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> CI / CD -> เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เด’เดฐเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด• SETTINGS_XML เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดฐเดฟเด•เตพ:
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

เดŽเดตเดฟเดŸเต†,
GPG_SECRET_KEY_PASSPHRASE - GPG เด•เต€เดฏเตเดŸเต† เดชเดพเดธเตโ€Œเดตเต‡เดกเต
SONATYPE_USERNAME - เดธเต‹เดฃเดŸเตˆเดชเตเดชเต เด…เด•เตเด•เต—เดฃเตเดŸเต เดฒเต‹เด—เดฟเตป

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดกเต‹เด•เตเด•เตผ เดšเดฟเดคเตเดฐเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•

  • เดœเดพเดตเดฏเตเดŸเต† เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเดคเดฟเดชเตเดชเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดžเด™เตเด™เตพ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฏ เด’เดฐเต เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต. เด†เตฝเดชเตˆเดจเดฟเดจเตเดณเตเดณ เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดšเตเดตเดŸเต†เดฏเตเดฃเตเดŸเต.

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

  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตเดจเตเดจเต

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

  • เดžเด™เตเด™เตพ เด†เดงเดฟเด•เดพเดฐเดฟเด•เดค เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเด•เดฏเตเด‚ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

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

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดœเดฟเดฑเตเดฑเตโ€Œเดฒเดพเดฌเต เดธเดฟ.เด

เดชเดฆเตเดงเดคเดฟ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•

เดกเดฟเดชเตเดฒเต‹เดฏเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดฑเต‚เดŸเตเดŸเดฟเดฒเต‡เด•เตเด•เต .gitlab-ci.yml เดซเดฏเตฝ เดšเต‡เตผเด•เตเด•เตเด•
เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดฐเดฃเตเดŸเต เดชเดฐเดธเตเดชเดฐ เดตเดฟเดฐเตเดฆเตเดงเดฎเดพเดฏ เดตเดฟเดจเตเดฏเดพเดธ เดœเต‹เดฒเดฟเด•เตพ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เดฏเดฅเดพเด•เตเดฐเดฎเด‚ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดฑเดฃเตเดฃเตผ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเด™เตเด•เดฟเดŸเตเดŸ เดฑเดฃเตเดฃเตผ.

.gitlab-ci.yml

stages:
  - deploy

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

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

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

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดœเดพเดต เดชเดฆเตเดงเดคเดฟ

เดชเดฌเตเดฒเดฟเด•เต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸ เดœเดพเดต เดชเตเดฐเตŠเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเดฟเตฝ, เดฑเดฟเดฒเต€เดธเต, เดธเตโ€Œเดจเดพเดชเตเดชเตโ€Œเดทเต‹เดŸเตเดŸเต เดชเดคเดฟเดชเตเดชเตเด•เตพ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพ 2 เด˜เดŸเตเดŸเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy

<...>

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

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

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

เดˆ เดชเดฐเดฟเดนเดพเดฐเดคเตเดคเดฟเตฝ, เดžเดพเตป เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เดฎเตเดจเตเดจเต‹เดŸเตเดŸเต เดชเต‹เดฏเดฟ เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด’เดฐเต CI เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต.

เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพ

เดžเดพเตป เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต gitlab-ci เด…เดคเดฟเตฝ เด…เดฆเตเดฆเต‡เดนเด‚ เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ CI เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เดธเตเดฅเดพเดชเดฟเดšเตเดšเต 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

เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดœเดพเดต เดชเตเดฐเตŠเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเดฟเตฝ เดคเดจเตเดจเต†, .gitlab-ci.yml เดตเดณเดฐเต† เด’เดคเตเด•เตเด•เดฎเตเดณเตเดณเดคเตเด‚ เดตเดพเดšเดพเดฒเดฎเดพเดฏเดคเตเดฎเดฒเตเดฒ.

.gitlab-ci.yml

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

Shields4J:
  extends: .build_java_project

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

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

pom.xml เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป

เดˆ เดตเดฟเดทเดฏเด‚ เดตเดณเดฐเต† เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด—เต‚เด—เต‹เตพเดชเตเดฒเต†เด•เตเดธเต ะฒ เดธเตโ€Œเดจเดพเดชเตเดชเตโ€Œเดทเต‹เดŸเตเดŸเดฟเดฒเต‡เด•เตเด•เตเด‚ เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต เดถเต‡เด–เดฐเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เดชเตเดฐเดพเดตเดธเตเดคเตเด•เตเด•เตพ เดธเตเดตเดฏเดฎเต‡เดต เดธเตˆเตป เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดฎเดพเดตเตป เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเดพเตฝ เดชเตเดฒเด—เดฟเดจเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดšเดฟเดฒ เดธเต‚เด•เตเดทเตเดฎเดคเด•เตพ เดžเดพเตป เดตเดฟเดตเดฐเดฟเด•เตเด•เตเด‚. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดคเตเดฐ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเดฒเตเด‚ เดธเตเดตเดพเดญเดพเดตเดฟเด•เดฎเดพเดฏเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเตเด‚ เดžเดพเตป เดตเดฟเดตเดฐเดฟเด•เตเด•เตเด‚ nexus-staging-maven-pluginเดจเดฟเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ org.sonatype.oss:oss-parent เดŽเดจเตเดจเดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเดพเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ.

maven-install-plugin

เดฒเต‹เด•เตเด•เตฝ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
เดฎเดฑเตเดฑเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เดณเดฟเดฒเต† เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดชเดฐเดฟเดถเต‹เดงเดจเดฏเตเด•เตเด•เตเด‚ เด’เดฐเต เดšเต†เด•เตเด•เตโ€Œเดธเดคเตเดคเดฟเดจเตเด‚ เดตเดณเดฐเต† เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฃเต.

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

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

maven-javadoc-plugin

เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เดœเดพเดตเดกเต‹เด•เตเด•เต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเต.

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

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดœเดพเดต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเดพเดคเตเดค เด’เดฐเต เดฎเตŠเดกเตเดฏเต‚เตพ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เดตเดฟเดญเดตเด™เตเด™เตพ เดฎเดพเดคเตเดฐเด‚)
เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดคเดคเตเดคเตเดตเดคเตเดคเดฟเตฝ javadoc เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดคเตเดŸเตผเดจเตเดจเต เดธเดนเดพเดฏเดฟเด•เตเด•เตเด• maven-jar-plugin

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

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

maven-gpg-เดชเตเดฒเด—เดฟเตป

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

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

nexus-staging-maven-plugin

เด•เต‡เดพเตบเดซเดฟเด—เดฑเต‡เดทเตป:

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

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดฎเตพเดŸเตเดŸเดฟ-เดฎเตŠเดกเตเดฏเต‚เตพ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดฎเตŠเดกเตเดฏเต‚เตพ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เดˆ เดฎเตŠเดกเตเดฏเต‚เดณเดฟเดจเตเดฑเต† pom.xml-เดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. nexus-staging-maven-plugin เดชเดคเดพเด•เดฏเตเดฎเดพเดฏเดฟ skipNexusStagingDeployMojo

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

เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดค เดถเต‡เดทเด‚ เดธเตโ€Œเดจเดพเดชเตเดชเตเดทเต‹เดŸเตเดŸเต/เดฑเดฟเดฒเต€เดธเต เดชเดคเดฟเดชเตเดชเตเด•เตพ เดฒเดญเตเดฏเดฎเดพเดฃเต เดธเตเดฑเตเดฑเต‡เดœเดฟเด‚เด—เต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เตพ

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

เด•เต‚เดŸเตเดคเตฝ เดชเตเดฒเดธเต

  • เดจเต†เด•เตเดธเดธเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฒเด•เตเดทเตเดฏเด™เตเด™เดณเตเดŸเต† เดตเดณเดฐเต† เดธเดฎเตเดชเดจเตเดจเดฎเดพเดฏ เดฒเดฟเดธเตเดฑเตเดฑเต (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเตฝ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด“เดŸเตเดŸเต‹เดฎเดพเดฑเตเดฑเดฟเด•เต เดฑเดฟเดฒเต€เดธเต เดชเดฐเดฟเดถเต‹เดงเดจ

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดซเดฒเด‚

เด’เดฐเต SNAPSHOT เดชเดคเดฟเดชเตเดชเต เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตโ€Œเดฑเตเดฑเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดธเตโ€Œเดจเดพเดชเตโ€Œเดทเต‹เดŸเตเดŸเต เดชเดคเดฟเดชเตเดชเต เดจเต†เด•เตโ€Œเดธเดธเดฟเดฒเต‡เด•เตเด•เต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดŸเดพเดธเตโ€Œเด•เต เดธเตเดตเดฎเต‡เดงเดฏเดพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚

เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต 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 เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดฑเดฟเดฒเต€เดธเต เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃเด‚

เด’เดฐเต เดŸเดพเด—เต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, nexus-เดฒเต‡เด•เตเด•เต เดฑเดฟเดฒเต€เดธเต เดชเดคเดฟเดชเตเดชเต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดตเดฟเดจเตเดฏเดพเดธ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดฒเต† เด…เดจเตเดฌเดจเตเดง เดŸเดพเดธเตเด•เตเด•เต เดธเตเดตเดฏเดฎเต‡เดต เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด‚ (เด‰เดฆเดพเดนเดฐเดฃเด‚).

เดฎเดพเดตเตป เดธเต†เตปเดŸเตเดฐเดฒเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดœเดพเดต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต 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 เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดฑเตเดฑเดจเต‹เดŸเตเดŸเดคเตเดคเดฟเตฝ เดคเต‹เดจเตเดจเตเดจเตเดจเดคเตเดฐ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด’เดฐเต เดตเดฟเดทเดฏเดฎเดฒเตเดฒ. เดฐเดฃเตเดŸเต เดคเดตเดฃ เด’เดฐเต เดŸเต‡เตบเด•เต€ เด…เดŸเดฟเดธเตเดฅเดพเดจเดคเตเดคเดฟเตฝ CI เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเตป เด‡เดคเต เดฎเดคเดฟเดฏเดพเด•เตเด‚, เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพ เดˆ เดตเดฟเดทเดฏเดคเตเดคเดฟเตฝ เด’เดฐเต เด…เดฎเต‡เดšเตเดตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดณเดฐเต† เด…เด•เดฒเต†เดฏเดพเดฃเต. เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, GitLab เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เดตเดณเดฐเต† เด…เดจเดพเดตเดถเตเดฏเดฎเดพเดฃเต. เด†เดฆเตเดฏเดชเดŸเดฟ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เดพเตป เดญเดฏเดชเตเดชเต†เดŸเดฐเตเดคเต. เดจเดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจ เด†เดณเตเดŸเต† เดชเดŸเดฟเด•เตเด•เต†เดŸเตเดŸเดฟเดจเดŸเดฟเดฏเดฟเตฝ เดฑเต‹เดกเต เดฆเตƒเดถเตเดฏเดฎเดพเด•เตเดจเตเดจเต (เด†เดฐเดพเดฃเต เดชเดฑเดžเตเดžเดคเต เดŽเดจเตเดจเต เดŽเดจเดฟเด•เตเด•เต เด“เตผเดฎเดฏเดฟเดฒเตเดฒ :)

เดซเต€เดกเตโ€Œเดฌเดพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดžเดพเตป เดธเดจเตเดคเตเดทเตเดŸเดจเดพเด•เตเด‚.

เด…เดŸเตเดคเตเดค เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดทเต†เตฝ เดฑเดฃเตเดฃเตผ เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดณเตเดณเต‚เดตเต†เด™เตเด•เดฟเตฝ, เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเต เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพ เดฎเดคเตเดธเดฐเดพเดงเดฟเดทเตเด เดฟเดคเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต (เดกเต‹เด•เตเด•เตผ-เด•เด‚เดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเต†เดธเตเดฑเตเดฑเต เดธเต‡เดตเดจเด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต) GitLab CI เดŽเด™เตเด™เดจเต† เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดžเดพเตป เด•เดพเดฃเดฟเดšเตเดšเตเดคเดฐเดพเด‚.

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•