เบเบปเบเบเบงเบฒเบกเบเบตเปเบกเบตเบเบธเบเบเบฐเบชเบปเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ java เบเบตเปเบกเบตเบเบงเบฒเบกเบเปเบญเบเบเบฒเบเปเบเบตเบเปเบเปเบเบฐเบฅเบดเบเบเบฐเบเบฑเบเบเบญเบเบเบงเบเปเบเบปเบฒเบขเปเบฒเบเปเบงเบงเบฒเปเบ sonatype เปเบฅเบฐ / เบซเบผเบท maven repositories เบเบฒเบเปเบเบเปเบเป GitLab. เปเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบเปเบญเบเบเบฐเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒ gitlab-runner, gitlab-ci เปเบฅเบฐ maven-plugin เปเบเบทเปเบญเปเบเปเปเบเบเบฑเบเบซเบฒเบเบตเป.
เปเบเบทเปเบญเบเปเบเปเบเบทเปเบญเบเบเบปเปเบ:
- เบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเบเบตเปเบเบญเบเปเบเบเบญเบเบเบฐเปเบ mvn เปเบฅเบฐ GPG.
- เบฎเบฑเบเบเบฐเบเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบงเบฝเบเบเบฒเบ CI เบชเบฒเบเบฒเบฅเบฐเบเบฐ.
- เบเบณเบฅเบฑเบเบญเบฑเบเปเบซเบผเบเบชเบดเปเบเบเบฐเบเบดเบ (เบเปเบญเบเบเบปเบง/เบเบฒเบเบเปเบฒเบ) เปเบเปเบชเปเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบเบชเบฒเบเบฒเบฅเบฐเบเบฐ.
- เบเบฒเบเบเบงเบเบชเบญเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบญเบเบชเบฐเบเบฑเบเบเปเบญเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบดเบกเปเบเบตเบเปเบเปเปเบ maven Central.
- เบเบฒเบเปเบเปเปเบเบเบปเปเบงเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเบฑเบเปเบซเบฅเบ artifacts เบเบฑเบ repository เบชเปเบฒเบฅเบฑเบเบซเบผเบฒเบเปเบเบเบเบฒเบ.
- เบเบงเบฒเบกเบเปเบฒเบเบเบฒเบเปเบฅเบฐเบเบงเบฒเบกเบเปเบฒเบเบเบฒเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเป.
เปเบเบทเปเบญเปเบ
เบเปเปโเบกเบนเบโเบเบปเปเบงโเปเบ เบเบฑเปเบเบเปเบฒเบเบฒเบเบเบฑเบเบเบฑเปเบเบเบฐเบเบดเบเบฑเบเปเบเบเบเบฒเบเปเบ GitLab เปเบฅเปเบ GitLab GitLab CI เบเบฒเบเบเบฑเปเบเบเปเบฒ Pom.xml เบเบปเบ เบชเบฐเบซเบฅเบธเบ
เบเปเปโเบกเบนเบโเบเบปเปเบงโเปเบ
- เบฅเบฒเบโเบฅเบฐโเบญเบฝเบโเบฅเบฐโเบญเบฝเบโเบเปเบฝเบงโเบเบฑเบโเบเบปเบโเปเบโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเบเบดเบกโเปเบเบตเบโเปเบเปโเบงเบฑเบโเบเบธโเบเบนโเบฎเบฒเบโเปเบ Maven Central เบเปเบฒเบ Sonatype OSS Repository Hosting Service เปเบเปโเบเบทเบโเบญเบฐโเบเบดโเบเบฒเบโเปเบฅเปเบงโเปเบ
เบซเบปเบงโเบเปเปโเบเบตเป เบเบนเปเปเบเปGoogolplex , เบเบฑเปเบเบเบฑเปเบเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบญเปเบฒเบเปเบเบดเบเบเบปเบเบเบงเบฒเบกเบเบตเปเปเบเบชเบฐเบเบฒเบเบเบตเปเบเบตเปเปเบซเบกเบฒเบฐเบชเบปเบก. - เบฅเบปเบเบเบฐเบเบฝเบเบฅเปเบงเบเปเปเบฒเบชเบณเบฅเบฑเบ
Sonatype JIRA เปเบฅเบฐเปเบเบตเบเบเบตเปเปเบเบทเปเบญเปเบเบตเบ repository (เบญเปเบฒเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบกเบชเปเบฒเบเบเบตเปเปเบ Sonatype JIRA ). เบซเบผเบฑเบเบเบฒเบเปเบเบตเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ, เบเบนเปเบเบฒเบเปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบ / เบฅเบฐเบซเบฑเบเบเปเบฒเบเบเบฒเบ JIRA (เบเปเปเปเบเบเบตเปเปเบญเบตเปเบเบงเปเบฒเบเบฑเบเบเบต Sonatype) เบเบฐเบเบทเบเปเบเปเปเบเบทเปเบญเบญเบฑเบเปเบซเบฅเบเบชเบดเปเบเบเบฐเบเบดเบเปเบชเป Sonatype nexus. - เบเปเปเปเบ, เบเบฐเบเบงเบเบเบฒเบเบชเปเบฒเบเบฅเบฐเบซเบฑเบ GPG เปเบเปเบเบทเบเบญเบฐเบเบดเบเบฒเบเบขเปเบฒเบเปเบซเปเบเปเบฅเปเบ. เปเบเบดเปเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบก
เบเบณเบเบปเบเบเปเบฒ GnuPG เปเบเบทเปเบญเปเบเบฑเบเบชเบดเปเบเบเบฐเบเบดเบ - เบเปเบฒเบเปเบฒเบเปเบเป Linux console เปเบเบทเปเบญเบชเปเบฒเบเบฅเบฐเบซเบฑเบ GPG (gnupg/gnupg2), เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเบดเบเบเบฑเปเบ.
rng-tools เปเบเบทเปเบญเบชเปเบฒเบ entropy. เบเปเบฒเบเปเปเบเบฑเปเบเบเบฑเปเบ, เบเบฒเบเบชเปเบฒเบเบเบฐเปเบเบญเบฒเบเบเบฐเปเบเปเปเบงเบฅเบฒเบเบปเบเบซเบผเบฒเบ. - เบเปเบฅเบดเบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒ เบชเบฒเบเบฒเบฅเบฐเบเบฐ เบเบฐเปเบ GPG
http://keys.gnupg.net http://pool.sks-keyservers.net http://keyserver.ubuntu.com
เบเบฑเปเบเบเปเบฒเปเบเบเบเบฒเบเบเบณเปเบเปเปเบ GitLab
- เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบเปเบฒเบ เบเบณ เปเบเบฑเบเบเปเบญเบเบชเปเบฒเบเปเบฅเบฐ เบเบณ เบเบปเบเปเบเบเบเบฒเบเบเบตเปเบเปเปเบเบฑเปเบเบเบฐเบเบทเบเปเบเบฑเบเปเบงเปเปเบเบทเปเบญ เบเบณ เปเบเปเบชเบดเปเบเบเบฐเบเบดเบ. เบเปเบญเบเบเบฑเปเบเบเบทเปเปเบเบเบเบฒเบเบเบญเบเบเปเบญเบเปเบเบเบเปเบฒเบเปเปเบฅเบฐเบเปเปเบชเบฑเบเบชเบปเบ -
deploy - เบซเบผเบฑเบเบเบฒเบเบเบฒเบเบชเปเบฒเบ repository, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเปเบฒเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเบทเปเบญเบเปเบฝเบ repository.
เปเบโเบเบตเปโเปเบเบโเบเบฒเบ -โ> เบเบฒเบโเบเบฑเปเบโเบเปเบฒ -โ> Repository -โ> เบชเบฒเบเบฒโเบเบตเปโเปเบเปโเบฎเบฑเบโเบเบฒเบโเบเบปเบโเบเปเบญเบโ. เบเบงเบเปเบฎเบปเบฒเบฅเบถเบเบเบปเบเบฅเบฐเบเบฝเบเบเบฑเบเบซเบกเบปเบเปเบฅเบฐเปเบเบตเปเบกเบเบปเบเบฅเบฐเบเบฝเบเบเบฝเบงเบเบฑเบ Wildcard * เบเบตเปเบกเบตเบชเบดเบเบเบดเปเบเบเบฒเบเบเบธเบเบเบนเปเปเบฅเบฐเบฅเบงเบกเบเบฝเบเปเบเปเบชเปเบฒเบฅเบฑเบเบเบนเปเปเบเปเบเบตเปเบกเบตเบเบปเบเบเบฒเบ Maintainers. เบเบปเบเบฅเบฐเบเบฝเบเบเบตเปเบเบฐเปเบฎเบฑเบเบงเบฝเบเบชเปเบฒเบฅเบฑเบเบเบนเปเปเบเปเบเบฑเบเบซเบกเบปเบเบเบญเบเปเบเบเบเบฒเบเบเบตเปเปเบฅเบฐเบเบธเปเบกเบเบตเปเปเบเบเบเบฒเบเบเบตเปเบเบถเปเบเบเบฑเบ.
- เบเปเบฒเบกเบตเบเบนเปเบฎเบฑเบเบชเบฒเบซเบผเบฒเบเปเบเบปเบ, เบเบฒเบเปเบเปเปเบเบเบตเปเบเบตเบเบตเปเบชเบธเบเปเบกเปเบเบเบฒเบเบเปเบฒเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเบเบเบฒเบเปเบเบซเบผเบฑเบเบเบฒเบ.
เปเบโเบเบตเปโเปเบเบโเบเบฒเบ -โ> เบเบฒเบโเบเบฑเปเบโเบเปเบฒ -โ> เบเบปเปเบงโเปเบ -โ> เบเบฒเบโเบชเบฑเบโเปเบเบโเปเบซเบฑเบโ, เบเบธเบโเบเบฐโเบชเบปเบกโเบเบฑเบโเปเบเบโเบเบฒเบโ, เบเบฒเบโเบญเบฐโเบเบธโเบเบฒเบโเปเบฅเบฐโเบเปเบฒโเบเบปเบโเบเบฒเบโเบชเบฑเบโเปเบเบโเบเบญเบโเปเบเบโเบเบฒเบโเปเบเบฑเบโ เบชเปเบงเบเบเบปเบง.
เบเปเบญเบเบกเบตเปเบเบเบเบฒเบเบเบตเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบชเบฒเบเบฒเบฅเบฐเบเบฐเปเบเป, เบเบฑเบเบเบฑเปเบเปเบเปเบเปเบญเบเปเบเป GitLab Runner เบเบญเบเบเปเบญเบเปเบญเบเปเบฅเบฐเบเปเบญเบเปเบเบปเปเบฒเบเบฑเปเบเบเบตเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฒเบเบเปเบฝเบเปเบเบ repository. เปเบเปเบเบดเบเปเบฅเปเบง, เบกเบฑเบเบเปเปเปเบกเปเบเบเบปเบเบเบฐเปเบซเบเบเบเบญเบเบเปเบญเบเบเบตเปเบเบฐเบชเบฐเปเบเบเบเปเปเบกเบนเบเบชเปเบงเบเบเบปเบงเปเบเบเบฑเบเบเบถเบเบเปเปเบชเบฒเบเบฒเบฅเบฐเบเบฐ. - เปเบเบฑเปเบโเบเบฑเบโเบเปเบฝเบงโเบเบฑเบโเบเบฒเบโเบเปเบฝเบโเปเบเบโเบเบญเบ repositoryโ
เปเบเบเบตเปเปเบเบเบเบฒเบ -> Settings -> Repository -> Push Rules เปเบฅเบฐเบเปเบฒเบเบปเบเบเปเปเบเปเบฒเบเบฑเบเบเบญเบ Committer, เบเบงเบเปเบเบดเปเบเบงเปเบฒเบเบนเปเบเบฝเบเปเบเบฑเบเบเบธเบเบเบนเปเปเบเป GitLab. เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฑเบเปเบเบฐเบเปเบฒเปเบซเปเบเบฑเปเบเบชเบฑเบเบเบฒเบฅเบฒเบเปเบเบฑเบ , เปเบฅเบฐเบเบฑเปเบเบเบธเบ Reject unsigned commits. - เบเปเปเปเบ, เบเปเบฒเบ เบเบณ เปเบเบฑเบเบเปเบญเบเบเบฑเปเบเบเปเบฒเบเบปเบงเบเบฐเบเบธเปเบเปเบเบทเปเบญเปเบเบตเบ เปเปเบฒ เบงเบฝเบ
เปเบเบเบตเป project -> Settings -> CI / CD -> Pipeline triggers เปเบฅเบฐเบชเปเบฒเบ trigger-token เปเปเป.
token เบเบตเปเบชเบฒเบกเบฒเบเบเบทเบเปเบเบตเปเบกเบเบฑเบเบเบตเปเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบปเปเบงเปเบเบเบญเบเบเบปเบงเปเบเบชเปเบฒเบฅเบฑเบเบเบธเปเบกเปเบเบเบเบฒเบ.
เปเบเบเบตเปเบเบธเปเบก -> เบเบฒเบเบเบฑเปเบเบเปเบฒ -> CI / CD -> เบเบปเบงเปเบเปเบฅเบฐเปเบเบตเปเบกเบเบปเบงเปเบDEPLOY_TOKEN
เบเบฑเบ trigger-token เปเบเบกเบนเบเบเปเบฒ.
เปเบฅเปเบ GitLab
เบเบฒเบเบชเปเบงเบเบเบตเปเบญเบฐเบเบดเบเบฒเบเบเบฒเบเบเบณเบเบปเบเบเปเบฒเบชเบณเบฅเบฑเบเบเบฒเบเปเบฅเปเบเปเปเบฒเบงเบฝเบเปเบเบเบฒเบเบเบณเปเบเปเปเบเบเปเบเปเบเบปเบงเปเบฅเปเบเบเบญเบเบเปเบฒเบเปเบญเบ (เบชเบฐเปเบเบฒเบฐ) เปเบฅเบฐเบชเบฒเบเบฒเบฅเบฐเบเบฐ (เปเบเปเบเบเบฑเบ).
เบเบฑเบเปเบฅเปเบเบชเบฐเปเบเบฒเบฐ
เบเปเบญเบเปเบเปเบเบฑเบเปเบฅเปเบเบเบญเบเบเปเบญเบเปเบญเบเปเบเบฒเบฐเบงเปเบฒ, เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบกเบฑเบเบชเบฐเบเบงเบ, เปเบง, เปเบฅเบฐเบฅเบฒเบเบฒเบเบทเบ.
เบชเปเบฒเบฅเบฑเบเบเบฑเบเปเบฅเปเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเบฐเบเปเบฒ Linux VDS เบเบตเปเบกเบต 1 CPU, 2 GB RAM, 20 GB HDD. เบฅเบฒเบเบฒเบเบฑเบเบซเบฒเปเบกเปเบ ~3000โฝ เบเปเปเบเบต.
เบเบฑเบเปเบฅเปเบเบเบญเบเบเปเบญเบ
เบชเปเบฒเบฅเบฑเบเบเบฑเบเปเบฅเปเบเบเปเบญเบเปเบญเบปเบฒ VDS 4 CPU, 4 GB RAM, 50 GB SSD. เบฅเบฒเบเบฒ 11000โฝ เบเปเปเปเบเบตเบเปเบชเบเปเบ.
เบเปเบญเบเบกเบตเบเบฑเบเปเบปเบ 7 เปเบเบทเปเบญเบ. 5 เปเบ aruba เปเบฅเบฐ 2 เบชเบธเบ ihor.
เบเบฑเปเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบฑเบเปเบฅเปเบ. เปเบเบเบฑเบเบเบธเบเบฑเบเบเบงเบเปเบฎเบปเบฒเบเบฐ configure เบกเบฑเบ.
เบเบงเบเปเบฎเบปเบฒเปเบเบซเบฒเปเบเบทเปเบญเบเบเปเบฒเบ SSH เปเบฅเบฐเบเบดเบเบเบฑเปเบ java, git, maven, gnupg2.
เบเบฒเบเบเบดเบเบเบฑเปเบเบเบปเบงเปเบฅเปเบ gitlab
- เบชเปเบฒเบเบเบธเปเบกเปเบซเบกเป
runner
sudo groupadd runner
- เบชเปเบฒเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบชเปเบฒเบฅเบฑเบ maven cache เปเบฅเบฐเบเปเบฒเบเบปเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบเบเบธเปเบก
runner
เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเบกเบเบธเบเบเบตเปเบเปเบฒเบเปเบฒเบเบเปเปเบงเบฒเบเปเบเบเบเบตเปเบเบฐเปเบฅเปเบเบเบฑเบเปเบฅเปเบเบซเบผเบฒเบเปเบเบปเบเปเบเปเบเบทเปเบญเบเบเบฑเบเบเบฝเบง.mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache
- เบชเปเบฒเบเบเบนเปเปเบเป
gitlab-deployer
เปเบฅเบฐเปเบเบตเปเบกเปเบเบปเปเบฒเปเบเบเบธเปเบกrunner
useradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer
- เปเบเบตเปเบกเปเบชเปเปเบเบฅเป
/etc/ssh/sshd_config
เปเบเบงเบเปเปเปเบAllowUsers root@* [email protected]
- เบเบดเบเปเบเบตเบเปเป
sshd
systemctl restart sshd
- เบเบฒเบเบเบฑเปเบเบฅเบฐเบซเบฑเบเบเปเบฒเบเบชเปเบฒเบฅเบฑเบเบเบนเปเปเบเป
gitlab-deployer
(เบชเบฒเบกเบฒเบเบเปเบฒเบเบเบฒเบ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบกเบตเบเปเปเบเปเบฒเบเบฑเบเบชเปเบฒเบฅเบฑเบ localhost)passwd gitlab-deployer
- เบเบดเบเบเบฑเปเบ GitLab Runner (Linux x86-64)
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 sudo chmod +x /usr/local/bin/gitlab-runner ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner
- เปเบเบเบตเปเปเบงเบฑเบเปเบเบเป gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners เปเบฅเบฐเบเบฑเบเบฅเบญเบเปเบเปเบเบฑเบเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบ
เปเปเบฒเบเป
- เบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบเบเบฑเบเปเบฅเปเบ
gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml
เบเบฐเบเบงเบเบเบฒเบ
Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
REGISTRATION_TOKEN
Please enter the gitlab-ci description for this runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
Registering runner... succeeded runner=ZvKdjJhx
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
- เบเบงเบเปเบฎเบปเบฒเบเบงเบเปเบเบดเปเบเบงเปเบฒเบเบฑเบเปเบฅเปเบเปเบเปเบเบทเบเบฅเบปเบเบเบฐเบเบฝเบ. เปเบเบเบตเปเปเบงเบฑเบเปเบเบเป gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners activated for this project
เปเปเบฒเบเป
- เบเบทเปเบก เปเบเบเบเปเบฒเบเบซเบฒเบ เบเบฒเบเบเปเบฅเบดเบเบฒเบ
/etc/systemd/system/gitlab-deployer.service
[Unit] Description=GitLab Deploy Runner After=syslog.target network.target ConditionFileIsExecutable=/usr/local/bin/gitlab-runner [Service] StartLimitInterval=5 StartLimitBurst=10 ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer" Restart=always RestartSec=120 [Install] WantedBy=multi-user.target
- เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบเบเปเบฅเบดเบเบฒเบ.
systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service
- เบเบงเบเปเบฎเบปเบฒเบเบงเบเปเบเบดเปเบเบงเปเบฒเบเบฑเบเปเบฅเปเบเปเบฅเปเบ.
เบเบปเบงเบขเปเบฒเบ:
เบเบณเบฅเบฑเบเบชเปเบฒเบเบเบฐเปเบ GPG
-
เบเบฒเบเปเบเบทเปเบญเบเบเบฝเบงเบเบฑเบเบเบงเบเปเบฎเบปเบฒเปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบเบเปเบฒเบ ssh เบเบฒเบเปเบเปเบเบนเปเปเบเป
gitlab-deployer
(เบเบตเปโเปเบเบฑเบโเบชเบดเปเบโเบชเปเบฒโเบเบฑเบโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเบชเปเบฒเบโเบเบฐโเปเบ GPGโ)ssh [email protected]
-
เบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเบฅเบฐเบซเบฑเบเปเบเบเบเบฒเบเบเบญเบเบเปเบฒเบเบฒเบก. เบเปเบญเบเปเบเปเบเบทเปเปเบฅเบฐเบญเบตเปเบกเบงเบเบญเบเบเปเบญเบเปเบญเบ.
เปเบซเปเปเบเปเปเบเบงเปเบฒเบฅเบฐเบเบธเบฅเบฐเบซเบฑเบเบเปเบฒเบเบชเปเบฒเบฅเบฑเบเบเบต. เบชเบดเปเบเบเบฐเบเบดเบเบเบฐเบเบทเบเปเบเบฑเบเบเปเบงเบเบเบฐเปเบเบเบตเป.gpg --gen-key
-
เบเบฒเบเบเบงเบเบเบฒ
gpg --list-keys -a /home/gitlab-deployer/.gnupg/pubring.gpg ---------------------------------------- pub 4096R/00000000 2019-04-19 uid Petruha Petrov <[email protected]> sub 4096R/11111111 2019-04-19
-
เบเบณเบฅเบฑเบเบญเบฑเบเปเบซเบฅเบเบฅเบฐเบซเบฑเบเบชเบฒเบเบฒเบฅเบฐเบเบฐเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบชเปเปเบเบตเบเปเบงเบตเบซเบผเบฑเบ
gpg --keyserver keys.gnupg.net --send-key 00000000 gpg: sending key 00000000 to hkp server keys.gnupg.net
เบเบฒเบเบเบฑเปเบเบเปเบฒ Maven
- เปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบเปเบเบฑเบเบเบนเปเปเบเป
gitlab-deployer
su gitlab-deployer
- เบชเปเบฒเบเปเบเปเบฅเบเบฐเบเปเบฅเบต maven repository เปเบฅเบฐโเปเบเบทเปเบญเบกโเบเปเปโเบเบฑเบโเบเบฒเบโเบเบงเบฒเบกโเบเปเบฒ (เปเบฎเบฑเบโเปเบซเปโเบเปเปโเบเบดเบโเบเบฒเบโ)
เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเบกเบเบธเบเบเบตเปเบเปเบฒเบเปเบฒเบเบเปเปเบงเบฒเบเปเบเบเบเบตเปเบเบฐเปเบฅเปเบเบเบฑเบเปเบฅเปเบเบซเบผเบฒเบเปเบเบปเบเปเบเปเบเบทเปเบญเบเบเบฑเบเบเบฝเบง.mkdir -p ~/.m2/repository ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
- เบชเปเบฒเบเบฅเบฐเบซเบฑเบเบซเบผเบฑเบ
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
- เบชเปเบฒเบเปเบเบฅเป ~/.m2/settings-security.xml
<settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity>
- เบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเบฅเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบต Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
- เบชเปเบฒเบเปเบเบฅเป ~/.m2/settings.xml
<settings> <profiles> <profile> <id>env</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase> </properties> </profile> </profiles> <servers> <server> <id>sonatype</id> <username>SONATYPE_USERNAME</username> <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password> </server> </servers> </settings>
เบเปเบญเบเปเบ,
GPG_SECRET_KEY_PASSHRASE - เบฅเบฐเบซเบฑเบเบเปเบฒเบเบชเบณเบฅเบฑเบเบเบฐเปเบ GPG
SONATYPE_USERNAME โ เปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบเบเบฑเบเบเบต sonatype
เบเบตเปเบชเปเบฒเปเบฅเบฑเบเบเบฒเบเบเบดเบเบเบฑเปเบ runner, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฑเบเบเบฒเบ
เปเบเปเบเบเบฑเบ Runner
เบเบณเบฅเบฑเบเบชเปเบฒเบเบเบฐเปเบ GPG
-
เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบเปเบฒเบเบเปเบญเบเบชเปเบฒเบเบฅเบฐเบซเบฑเบ GPG. เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เบเบดเบเบเบฑเปเบ gnupg.
yum install -y gnupg
-
เบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเบฅเบฐเบซเบฑเบเปเบเบเบเบฒเบเบเบญเบเบเปเบฒเบเบฒเบก. เบเปเบญเบเปเบเปเบเบทเปเปเบฅเบฐเบญเบตเปเบกเบงเบเบญเบเบเปเบญเบเปเบญเบ. เปเบซเปเปเบเปเปเบเบงเปเบฒเบฅเบฐเบเบธเบฅเบฐเบซเบฑเบเบเปเบฒเบเบชเปเบฒเบฅเบฑเบเบเบต.
gpg --gen-key
-
เบเบฒเบเบชเบฐเปเบเบเบเปเปเบกเบนเบเปเบเบเบต
gpg --list-keys -a pub rsa3072 2019-04-24 [SC] [expires: 2021-04-23] 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 uid [ultimate] tttemp <[email protected]> sub rsa3072 2019-04-24 [E] [expires: none]
-
เบเบณเบฅเบฑเบเบญเบฑเบเปเบซเบฅเบเบฅเบฐเบซเบฑเบเบชเบฒเบเบฒเบฅเบฐเบเบฐเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบชเปเปเบเบตเบเปเบงเบตเบซเบผเบฑเบ
gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net
-
เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเบเบฐเปเบเบชเปเบงเบเบเบปเบง
gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 -----BEGIN PGP PRIVATE KEY BLOCK----- lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5 ... =2Wd2 -----END PGP PRIVATE KEY BLOCK-----
-
เปเบเบเบตเปเบเบฒเบเบเบฑเปเบเบเปเบฒเปเบเบเบเบฒเบ -> เบเบฒเบเบเบฑเปเบเบเปเบฒ -> CI / CD -> เบเบปเบงเปเบเปเบฅเบฐเบเบฑเบเบเบถเบเบฅเบฐเบซเบฑเบเบชเปเบงเบเบเบปเบงเปเบเบเบปเบงเปเบ.
GPG_SECRET_KEY
เบเบฒเบเบเบฑเปเบเบเปเบฒ Maven
- เบชเปเบฒเบเบฅเบฐเบซเบฑเบเบซเบผเบฑเบ
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
- เปเบเบเบตเปเบเบฒเบเบเบฑเปเบเบเปเบฒเปเบเบเบเบฒเบ -> เบเบฒเบเบเบฑเปเบเบเปเบฒ -> CI / CD -> เบเบปเบงเปเบเปเบฅเบฐเบเบฑเบเบเบถเบเปเบเบเบปเบงเปเบ
SETTINGS_SECURITY_XML
เบชเบฒเบเบเปเปเปเบเบเบตเป:<settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity>
- เบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเบฅเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบต Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
- เปเบเบเบตเปเบเบฒเบเบเบฑเปเบเบเปเบฒเปเบเบเบเบฒเบ -> เบเบฒเบเบเบฑเปเบเบเปเบฒ -> CI / CD -> เบเบปเบงเปเบเปเบฅเบฐเบเบฑเบเบเบถเบเปเบเบเบปเบงเปเบ
SETTINGS_XML
เบชเบฒเบเบเปเปเปเบเบเบตเป:<settings> <profiles> <profile> <id>env</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase> </properties> </profile> </profiles> <servers> <server> <id>sonatype</id> <username>sonatype_username</username> <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password> </server> </servers> </settings>
เบเปเบญเบเปเบ,
GPG_SECRET_KEY_PASSHRASE - เบฅเบฐเบซเบฑเบเบเปเบฒเบเบชเบณเบฅเบฑเบเบเบฐเปเบ GPG
SONATYPE_USERNAME โ เปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบเบเบฑเบเบเบต sonatype
เบเบณเปเบเปเบฎเบนเบ docker
-
เบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบ Dockerfile เบเปเบฒเบเบเบฒเบเบเปเบชเบปเบกเบเบงเบเปเบเบทเปเบญเปเบฎเบฑเบเบงเบฝเบเบเบฒเบเบเปเบฒเบเปเบเบฑเบ Java เปเบงเบตเบเบฑเบเบเบตเปเบเปเบญเบเบเบฒเบ. เบเปเบฒเบเบฅเบธเปเบกเบเบตเปเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบชเปเบฒเบฅเบฑเบ alpine.
FROM java:8u111-jdk-alpine RUN apk add gnupg maven git --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && mkdir ~/.m2/
-
เบเบฒเบเบเบฐเบเบญเบเบเบนเปเบเบญเบเปเบเบเปเบเบตเบชเปเบฒเบฅเบฑเบเปเบเบเบเบฒเบเบเบญเบเบเปเบฒเบ
docker build -t registry.gitlab.com/group/deploy .
-
เบเบงเบเปเบฎเบปเบฒเบเบดเบชเบนเบเบขเบทเบเบขเบฑเบเปเบฅเบฐเปเบซเบผเบเบเบฒเบเบฐเบเบฐเปเบเบปเปเบฒเปเบเปเบเบเบฐเบเบฝเบ.
docker login -u USER -p PASSWORD registry.gitlab.com docker push registry.gitlab.com/group/deploy
GitLab CI
เบเบณเปเบเปเปเบเบเบเบฒเบ
เปเบเบตเปเบกเปเบเบฅเป .gitlab-ci.yml เปเบชเปเบฎเบฒเบเบเบญเบเปเบเบเบเบฒเบ deploy
เบชเบฐเบเบฃเบดเบเบเบณเบชเบฐเปเปเบตเบชเบญเบเปเปเบฒเบงเบฝเบเบเบฒเบเบเบณเปเบเปเบชเบฐเปเบเบฒเบฐเปเบเบดเปเบเบเบฑเบเปเบฅเบฐเบเบฑเบ. Runner เบชเบฐเปเบเบฒเบฐเบซเบผเบท Shared Runner เบเบฒเบกเบฅเปเบฒเบเบฑเบ.
.gitlab-ci.yml
stages:
- deploy
Specific Runner:
extends: .java_deploy_template
# ะะฐะดะฐัะฐ ะฑัะดะตั ะฒัะฟะพะปะฝััััั ะฝะฐ ะฒะฐัะตะผ shell-ัะฐะฝะฝะตัะต
tags:
- deploy
Shared Runner:
extends: .java_deploy_template
# ะะฐะดะฐัะฐ ะฑัะดะตั ะฒัะฟะพะปะฝััััั ะฝะฐ ะฟัะฑะปะธัะฝะพะผ docker-ัะฐะฝะฝะตัะต
tags:
- docker
# ะะฑัะฐะท ะธะท ัะฐะทะดะตะปะฐ GitLab Runner -> Shared Runner -> Docker
image: registry.gitlab.com/group/deploy-project:latest
before_script:
# ะะผะฟะพััะธััะตะผ GPG ะบะปัั
- printf "${GPG_SECRET_KEY}" | gpg --batch --import
# ะกะพั
ัะฐะฝัะตะผ maven ะบะพะฝัะธะณััะฐัะธั
- printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
- printf "${SETTINGS_XML}" > ~/.m2/settings.xml
.java_deploy_template:
stage: deploy
# ะะฐะดะฐัะฐ ััะฐะฑะพัะฐะตั ะฟะพ ััะธะณะณะตัั, ะตัะปะธ ะฟะตัะตะดะฐะฝะฐ ะฟะตัะตะผะตะฝะฝะฐั DEPLOY ัะพ ะทะฝะฐัะตะฝะธะตะผ java
only:
variables:
- $DEPLOY == "java"
variables:
# ะพัะบะปััะฐะตะผ ะบะปะพะฝะธัะพะฒะฐะฝะธะต ัะตะบััะตะณะพ ะฟัะพะตะบัะฐ
GIT_STRATEGY: none
script:
# ะัะตะดะพััะฐะฒะปัะตะผ ะฒะพะทะผะพะถะฝะพััั ั
ัะฐะฝะตะฝะธั ะฟะฐัะพะปั ะฒ ะฝะตะทะฐัะธััะพะฒะฐะฝะฝะพะผ ะฒะธะดะต
- git config --global credential.helper store
# ะกะพั
ัะฐะฝัะตะผ ะฒัะตะผะตะฝะฝัะต ะบัะตะดั ะฟะพะปัะทะพะฒะฐัะตะปั gitlab-ci-token
# ะขะพะบะตะฝ ัะฐะฑะพัะฐะตั ะดะปั ะฒัะตั
ะฟัะฑะปะธัะฝัั
ะฟัะพะตะบัะพะฒ gitlab.com ะธ ะดะปั ะฟัะพะตะบัะพะฒ ะณััะฟะฟั
- echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
# ะะพะปะฝะพัััั ัะธััะธะผ ัะตะบัััั ะดะธัะตะบัะพัะธั
- rm -rf .* *
# ะะปะพะฝะธััะตะผ ะฟัะพะตะบั ะบะพัะพััะน, ะฑัะดะตะผ ะดะตะฟะปะพะธัั ะฒ Sonatype Nexus
- git clone ${DEPLOY_CI_REPOSITORY_URL} .
# ะะตัะตะบะปััะฐะตะผัั ะฝะฐ ะฝัะถะฝัะน ะบะพะผะผะธั
- git checkout ${DEPLOY_CI_COMMIT_SHA} -f
# ะัะปะธ ั
ะพัั ะพะดะธะฝ pom.xml ัะพะดะตัะถะธั ะฟะฐัะฐะผะตัั autoReleaseAfterClose ะฒะฐะปะธะผ ัะฑะพัะบั.
# ะ ะฟัะพัะธะฒะฝะพะผ ัะปััะฐะต ะตััั ัะธัะบ ะทะฐะปะธัั ััััะต ะฐััะตัะฐะบัั ะฒ maven central
- >
for pom in $(find . -name pom.xml); do
if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
exit 1;
fi;
done
# ะัะปะธ ะฟะฐัะฐะผะตัั DEPLOY_CI_COMMIT_TAG ะฟัััะพะน, ัะพ ะฟัะธะฝัะดะธัะตะปัะฝะพ ััะฐะฒะธะผ SNAPSHOT-ะฒะตััะธั
- >
if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
else
VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
if [[ "${VERSION}" == *-SNAPSHOT ]]; then
mvn versions:set -DnewVersion=${VERSION}
else
mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
fi
fi
# ะะฐะฟััะบะฐะตะผ ะทะฐะดะฐัั ะฝะฐ ัะฑะพัะบั ะธ ะดะตะฟะปะพะน ะฐััะตัะฐะบัะพะฒ
- mvn clean deploy -DskipTests=true
เปเบเบเบเบฒเบ Java
เปเบเปเบเบเบเบฒเบ java เบเบตเปเบเบฒเบเบงเปเบฒเบเบฐเบเบทเบเบญเบฑเบเปเบซเบฅเบเปเบเบเบฑเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบเบชเบฒเบเบฒเบฅเบฐเบเบฐ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบตเปเบก 2 เบเบฑเปเบเบเบญเบเปเบเบทเปเบญเบเบฒเบงเปเบซเบฅเบเปเบงเบตเบเบฑเบเบเปเบญเบเปเบฅเบฐ Snapshot.
.gitlab-ci.yml
stages:
- build
- test
- verify
- deploy
<...>
Release:
extends: .trigger_deploy
# ะะฐะฟััะบะฐัั ะทะฐะดะฐัั ัะพะปัะบะพ ะฟo ัะตะณั.
only:
- tags
Snapshot:
extends: .trigger_deploy
# ะะฐะฟััะบะฐะตะผ ะทะฐะดะฐัั ะฝะฐ ะฟัะฑะปะธะบะฐัะธั SNAPSHOT ะฒะตััะธะธ ะฒัััะฝัั
when: manual
# ะะต ะทะฐะฟััะบะฐัั ะทะฐะดะฐัั, ะตัะปะธ ะฟัะพััะฐะฒะปะตะฝ ัะตะณ.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# ะัะบะปััะฐะตะผ ะบะปะพะฝะธัะพะฒะฐะฝะธะต ัะตะบััะตะณะพ ะฟัะพะตะบัะฐ
GIT_STRATEGY: none
# ะกััะปะบะฐ ะฝะฐ ััะธะณะณะตั deploy-ะทะฐะดะฐัะธ
URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
# ะะตัะตะผะตะฝะฝัะต deploy-ะทะฐะดะฐัะธ
POST_DATA: "
token=${DEPLOY_TOKEN}&
ref=master&
variables[DEPLOY]=${DEPLOY}&
variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
"
script:
# ะะต ะธัะฟะพะปัะทัั cURL, ัะฐะบ ะบะฐะบ ั ัะปะฐะณะฐะผะธ --fail --show-error
# ะพะฝ ะฝะต ะฒัะฒะพะดะธั ัะตะปะพ ะพัะฒะตัะฐ, ะตัะปะธ HTTP ะบะพะด 400 ะธ ะฑะพะปะตะต
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}
เปเบเบเบฒเบเปเบเปเปเบเบเบตเป, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบเบเบทเปเบกเบญเบตเบเปเบฅเบฑเบเบเปเบญเบเปเบฅเบฐเบเบฑเบเบชเบดเบเปเบเปเบเปเบซเบเบถเปเบ CI เปเบกเปเปเบเบเบชเปเบฒเบฅเบฑเบเปเบเบเบเบฒเบ java.
เบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบก
เบเปเบญเบเบชเปเบฒเบเปเบเบเบเบฒเบเปเบเบเบเปเบฒเบเบซเบฒเบ
common.yml
stages:
- build
- test
- verify
- deploy
variables:
SONAR_ARGS: "
-Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA}
-Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME}
"
.build_java_project:
stage: build
tags:
- touchbit-shell
variables:
SKIP_TEST: "false"
script:
- mvn clean
- mvn package -DskipTests=${SKIP_TEST}
artifacts:
when: always
expire_in: 30 day
paths:
- "*/target/reports"
.build_sphinx_doc:
stage: build
tags:
- touchbit-shell
variables:
DOCKERFILE: .indirect/docs/Dockerfile
script:
- docker build --no-cache -t ${CI_PROJECT_NAME}/doc -f ${DOCKERFILE} .
.junit_module_test_run:
stage: test
tags:
- touchbit-shell
variables:
MODULE: ""
script:
- cd ${MODULE}
- mvn test
artifacts:
when: always
expire_in: 30 day
paths:
- "*/target/reports"
.junit_test_run:
stage: test
tags:
- touchbit-shell
script:
- mvn test
artifacts:
when: always
expire_in: 30 day
paths:
- "*/target/reports"
.sonar_review:
stage: verify
tags:
- touchbit-shell
dependencies: []
script:
- >
if [ "$CI_BUILD_REF_NAME" == "master" ]; then
mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
else
mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
fi
.trigger_deploy:
stage: deploy
tags:
- touchbit-shell
variables:
URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
POST_DATA: "
token=${DEPLOY_TOKEN}&
ref=master&
variables[DEPLOY]=${DEPLOY}&
variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
"
script:
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}
.trigger_release_deploy:
extends: .trigger_deploy
only:
- tags
.trigger_snapshot_deploy:
extends: .trigger_deploy
when: manual
except:
- tags
เบเบฑเปเบเบเบฑเปเบ, เปเบเปเบเบเบเบฒเบ java เบเปเบงเบเบเบปเบเปเบญเบ, .gitlab-ci.yml เบกเบตเบฅเบฑเบเบชเบฐเบเบฐเบซเบเบฒเปเบซเบเปเบเบซเบผเบฒเบเปเบฅเบฐเบเปเป verbose.
.gitlab-ci.yml
include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml
Shields4J:
extends: .build_java_project
Sphinx doc:
extends: .build_sphinx_doc
variables:
DOCKERFILE: .docs/Dockerfile
Sonar review:
extends: .sonar_review
dependencies:
- Shields4J
Release:
extends: .trigger_release_deploy
Snapshot:
extends: .trigger_snapshot_deploy
เบเบฒเบเบเบฑเปเบเบเปเบฒ Pom.xml
เบซเบปเบงเบเปเปเบเบตเปเปเบเปเบเบทเบเบญเบฐเบเบดเบเบฒเบเบขเปเบฒเบเบฅเบฐเบญเบฝเบ. nexus-staging-maven-plugin
เบเปเบฒเบเปเบฒเบเบเปเปเบเปเบญเบเบเบฒเบเบซเบผเบทเบเปเปเบชเบฒเบกเบฒเบเปเบเป org.sonatype.oss:oss-parent เปเบเบฑเบเบเปเปเปเบกเปเบชเปเบฒเบฅเบฑเบเปเบเบเบเบฒเบเบเบญเบเบเปเบฒเบ.
maven-install-plugin
เบเบดเบเบเบฑเปเบเปเบกเบเบนเบเปเบเบปเปเบฒเปเบเปเบ repository เบเปเบญเบเบเบดเปเบ.
เบกเบตเบเบฐเปเบซเบเบเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบขเบฑเปเบเบขเบทเบเบเปเบญเบเบเบดเปเบเบเบญเบเบเบฒเบเปเบเปเปเบเปเบเปเบเบเบเบฒเบเบญเบทเปเบเป, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบ checksum.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-project</id>
<!-- ะัะปะธ ั ะฒะฐั ะผะฝะพะณะพะผะพะดัะปัะฝัะน ะฟัะพะตะบั ั ะดะตะฟะปะพะตะผ ัะพะดะธัะตะปััะบะพะณะพ ะฟะพะผะธะบะฐ -->
<phase>install</phase>
<!-- ะฏะฒะฝะพ ัะบะฐะทัะฒะฐะตะผ ัะฐะนะปั ะดะปั ะปะพะบะฐะปัะฝะพะน ัััะฐะฝะพะฒะบะธ -->
<configuration>
<file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
<pomFile>dependency-reduced-pom.xml</pomFile>
<!-- ะัะธะฝัะดะธัะตะปัะฝะพะต ะพะฑะฝะพะฒะปะตะฝะธะต ะผะตัะฐะดะฐะฝะฝัั
ะฟัะพะตะบัะฐ -->
<updateReleaseInfo>true</updateReleaseInfo>
<!-- ะะพะฝััะพะปัะฝัะต ััะผะผั ะดะปั ะฟัะพะฒะตัะบะธ ัะตะปะพััะฝะพััะธ -->
<createChecksum>true</createChecksum>
</configuration>
</execution>
</executions>
</plugin>
maven-javadoc-plugin
เบเบฒเบเบชเปเบฒเบ javadoc เบชเปเบฒเบฅเบฑเบเปเบเบเบเบฒเบ.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<!-- ะะตะฝะตัะฐัะธั javadoc ะดะพะปะถะฝะฐ ะฑััั ะฟะพัะปะต ัะฐะทั ะณะตะฝะตัะฐัะธะธ ัะตััััะพะฒ -->
<phase>prepare-package</phase>
<configuration>
<!-- ะัะตะฝั ะฟะพะผะพะณะฐะตั ะฒ ะฟัะฑะปะธัะฝัั
ะฟัะพะตะบัะฐั
-->
<failOnError>true</failOnError>
<failOnWarnings>true</failOnWarnings>
<!-- ะฃะฑะธัะฐะตั ะพัะธะฑะบั ะฟะพะธัะบะฐ ะดะพะบัะผะตะฝัะฐัะธะธ ะฒ target ะดะธัะตะบัะพัะธะธ -->
<detectOfflineLinks>false</detectOfflineLinks>
</configuration>
</execution>
</executions>
</plugin>
เบเปเบฒเบเปเบฒเบเบกเบตเปเบกเบเบนเบเบเบตเปเบเปเปเบกเบต java (เบเบปเบงเบขเปเบฒเบเบเบฝเบเปเบเปเบเบฑเบเบเบฐเบเบฒเบเบญเบ)
เบซเบผเบทเบเปเบฒเบเบเปเปเบเปเบญเบเบเบฒเบเบชเปเบฒเบ javadoc เปเบเบซเบผเบฑเบเบเบฒเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบงเบ maven-jar-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>empty-javadoc-jar</id>
<phase>generate-resources</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>javadoc</classifier>
<classesDirectory>${basedir}/javadoc</classesDirectory>
</configuration>
</execution>
</executions>
</plugin>
maven-gpg-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<!-- ะกะฑะพัะบะฐ ะฑัะดะตั ะฟะฐะดะฐัั, ะตัะปะธ ะพััััััะฒัะตั GPG ะบะปัั -->
<!-- ะะพะดะฟะธััะฒะฐะตะผ ะฐััะตัะฐะบัั ัะพะปัะบะพ ะฝะฐ ัะฐะทะต deploy -->
<phase>deploy</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
nexus-staging-maven-plugin
เบเบฒเบเบเบฑเปเบเบเปเบฒ:
<project>
<!-- ... -->
<build>
<plugins>
<!-- ... -->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<serverId>sonatype</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<!-- ะะฑะฝะพะฒะปัะตะผ ะผะตัะฐะดะฐะฝะฝัะต, ััะพะฑั ะฟะพะผะตัะธัั ะฐััะตัะฐะบั ะบะฐะบ release -->
<!-- ะะต ะฒะปะธัะตั ะฝะฐ snapshot ะฒะตััะธะธ -->
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<!-- ะัะบะปััะฐะตะผ ะฟะปะฐะณะธะฝ -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<distributionManagement>
<snapshotRepository>
<id>sonatype</id>
<name>Nexus Snapshot Repository</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>sonatype</id>
<name>Nexus Release Repository</name>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
</project>
เบเปเบฒเบเปเบฒเบเบกเบตเปเบเบเบเบฒเบเบซเบผเบฒเบเปเบกเบเบนเบเปเบฅเบฐเบเปเบฒเบเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเบญเบฑเบเปเบซเบฅเบเปเบกเบเบนเบเบชเบฐเปเบเบฒเบฐเปเบชเปเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบตเปเบก. nexus-staging-maven-plugin
เบเบฑเบเบเบธเบ skipNexusStagingDeployMojo
<build>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<configuration>
<skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
</configuration>
</plugin>
</plugins>
</build>
เบซเบผเบฑเบโเบเบฒเบโเบเบฒเบโเบเบฒเบงโเปเบซเบผเบโ, เบฎเบนเบโเบเบฒเบ / เบเบฒเบโเบเปเบญเบโเบชเบฐโเบเบฑเบโเบกเบตโเบขเบนเปโเปเบโ
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- ะะต ะฝะฐะดะพ ัะบะฐะทัะฒะฐัั ัะปะฐะณะธ snapshot/release ะดะปั ัะตะฟะพะทะธัะพัะธั -->
</repository>
</repositories>
pluses เบซเบผเบฒเบ
- เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบตเปเบญเบธเบเบปเบกเบชเบปเบกเบเบนเบเบซเบผเบฒเบเบเบญเบเปเบเบปเปเบฒเบซเบกเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบ repository nexus (
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin
). - เบเบงเบเบชเบญเบเบเบฒเบเบเปเบญเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเบฑเบเปเบซเบฅเบเปเบเบเบฑเบ maven central
เบเบปเบ
เปเบเบตเบเปเบเปเบชเบฐเบเบฑเบ SNAPSHOT
เปเบกเบทเปเบญเบชเปเบฒเบเปเบเบเบเบฒเบ, เบกเบฑเบเปเบเบฑเบเปเบเปเบเปเบเบตเปเบเบฐเปเบเบตเบเบซเบเปเบฒเบงเบฝเบเบเปเบงเบเบเบปเบเปเบญเบเปเบเบทเปเบญเบเบฒเบงเปเบซเบฅเบเปเบงเบตเบเบฑเบ SNAPSHOT เปเบเบซเบฒเบเบฒเบเปเบเบทเปเบญเบกเบเปเป
เปเบกเบทเปเบญเบงเบฝเบเบเบฒเบเบเบตเปเบเบทเบเปเบเบตเบเปเบเป, เบงเบฝเบเบเบฒเบเบเบตเปเบชเบญเบเบเปเบญเบเบเบฑเบเปเบเปเบเบเบเบฒเบ deploy เบเบฐเบเบทเบเบเบฐเบเบธเปเบ (
เปเบกเปเบเปเบญเบเบเบทเบเบเบฑเบ
Running with gitlab-runner 11.10.0 (3001a600)
on Deploy runner JSKWyxUw
Using Shell executor...
Running on ih1174328.vds.myihor.ru...
Skipping Git repository setup
Skipping Git checkout
Skipping Git submodules setup
$ rm -rf .* *
$ git config --global credential.helper store
$ echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
$ git clone ${DEPLOY_CI_REPOSITORY_URL} .
Cloning into 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Note: checking out '850f86aa317194395c5387790da1350e437125a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # collapsed multi-line command
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # collapsed multi-line command
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO] ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Shields4J client [jar]
[INFO] TestNG listener [jar]
[INFO]
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0 [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Processing change of org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Processing org.touchbit.shields4j:shields4j-parent
[INFO] Updating project org.touchbit.shields4j:shields4j-parent
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]
[INFO] Processing org.touchbit.shields4j:client
[INFO] Updating parent org.touchbit.shields4j:shields4j-parent
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] Updating dependency org.touchbit.shields4j:test-core
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]
[INFO] Processing org.touchbit.shields4j:test-core
[INFO] Updating parent org.touchbit.shields4j:shields4j-parent
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]
[INFO] Processing org.touchbit.shields4j:testng
[INFO] Updating parent org.touchbit.shields4j:shields4j-parent
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] Updating dependency org.touchbit.shields4j:client
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] Updating dependency org.touchbit.shields4j:test-core
[INFO] from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 0.992 s]
[INFO] test-core .......................................... SKIPPED
[INFO] Shields4J client ................................... SKIPPED
[INFO] TestNG listener 1.0.0 .............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.483 s
[INFO] Finished at: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO] ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Shields4J client [jar]
[INFO] TestNG listener [jar]
[INFO]
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0-SNAPSHOT [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO] * Bulk deploy of locally gathered snapshot artifacts finished.
[INFO] Remote deploy finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUCCESS [ 2.375 s]
[INFO] test-core .......................................... SUCCESS [ 3.929 s]
[INFO] Shields4J client ................................... SUCCESS [ 3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... SUCCESS [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.629 s
[INFO] Finished at: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------
เบเบฑเปเบเบเบฑเปเบ, เบชเบฐเบเบฑเบเปเบเปเบเบทเบเปเบซเบฅเบเปเบเบปเปเบฒเปเบเปเบ Nexus
เบชเบฐเบเบฑเบ snapshot เบเบฑเบเบซเบกเบปเบเบชเบฒเบกเบฒเบเบเบทเบเบฅเบถเบเบญเบญเบเบเบฒเบ repository เบขเบนเปเปเบเปเบงเบฑเบเปเบเบเป
เบเบณเบฅเบฑเบเปเบเบตเบเปเบเปเบชเบฐเบเบฑเบ
เปเบกเบทเปเบญเปเบเบฑเบเบเบทเบเบเบดเบเบเบฑเปเบ, เบงเบฝเบเบเบฒเบเบเบตเปเบชเบญเบเบเปเบญเบเบเบฑเบเปเบเปเบเบเบเบฒเบ deploy เบเบฐเบเบทเบเบเบฐเบเบธเปเบเปเบเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบเบทเปเบญเบเบฒเบงเปเบซเบฅเบเปเบงเบตเบเบฑเบเบเปเบญเบเปเบเบซเบฒ nexus (
เบชเปเบงเบเบเบตเปเบเบตเบเบตเปเบชเบธเบเปเบกเปเบเบงเปเบฒเบเบฒเบเบเปเบญเบเบเบตเปเปเบเปเบเบดเบเบเบฐเบเบทเบเบเบฐเบเบธเปเบเปเบเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบ nexus.
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO] * Created staging repository with ID "orgtouchbit-1037".
[INFO] * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Uploading locally staged artifacts to profile org.touchbit
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 9.603 s]
[INFO] test-core .......................................... SUCCESS [ 3.419 s]
[INFO] Shields4J client ................................... SUCCESS [ 9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------
เปเบฅเบฐเบเปเบฒเบกเบตเบเบฒเบเบขเปเบฒเบเบเบดเบเบเบฒเบ, เบงเบฝเบเบเบฒเบเบเบฐเบฅเบปเปเบกเปเบซเบฅเบงเปเบเปเบเบญเบ
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO] * Created staging repository with ID "orgtouchbit-1038".
[INFO] * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Uploading locally staged artifacts to profile org.touchbit
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "orgtouchbit-1038".
Waiting for operation to complete...
.......
[ERROR] Rule failure while trying to close staging repository with ID "orgtouchbit-1039".
[ERROR]
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR]
[ERROR] Repository "orgtouchbit-1039" failures
[ERROR] Rule "signature-staging" failures
[ERROR] * No public key: Key with id: (1f42b618d1cbe1b5) was not able to be located on <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 4.073 s]
[INFO] test-core .......................................... SUCCESS [ 2.788 s]
[INFO] Shields4J client ................................... SUCCESS [ 3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
เบเบฑเปเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฑเบเปเบซเบผเบทเบญเบเบฝเบเปเบเปเบซเบเบถเปเบเบเบฒเบเปเบฅเบทเบญเบ. เบเบฑเบเบฅเบถเบเปเบงเบตเบเบฑเบเบเบตเป เบซเบผเบทเปเบเบตเบเปเบเปเบกเบฑเบ.
เบซเบผเบฑเบโเบเบฒเบโเบเบฒเบโเบเปเบญเบโเบญเบญเบโเบกเบฒโ, เบซเบผเบฑเบโเบเบฒเบโเบเบตเปโเปเบเปโเปเบงโเบฅเบฒโเบเบฒเบโเบเบญเบโเบเบญเบกโเบเบฐโเบขเบนเปโเปเบโ
เบเบญเบเบซเบปเบงเบเปเป
เบกเบฑเบเปเบกเปเบเบเบฒเบเบเบปเปเบเบเบปเบเบชเปเบฒเบฅเบฑเบเบเปเบญเบเบเบตเป maven indexes repositories เบชเบฒเบเบฒเบฅเบฐเบเบฐเบญเบทเปเบเป.
เบเปเบญเบเบเปเบญเบเปเบเบตเปเบก robots.txt เปเบเบฒเบฐเบงเปเบฒเบกเบฑเบเบเบฑเบเบชเบฐเบเบตเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบเปเบเบปเปเบฒเบเบญเบเบเปเบญเบ.
เบชเบฐเบซเบฅเบธเบ
เบชเบดเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบกเบต
- เปเบเบเบเบฒเบเบเบดเบเบเบฑเปเบเปเบเบเบเปเบฒเบเบซเบฒเบเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฐเบเบดเบเบฑเบเบงเบฝเบเบเบฒเบ CI เบซเบผเบฒเบเบขเปเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเบฑเบเปเบซเบฅเบเบชเบดเปเบเบเบฐเบเบดเบเปเบชเปเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบเบชเบฒเบเบฒเบฅเบฐเบเบฐเบชเปเบฒเบฅเบฑเบเบเบฒเบชเบฒเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเปเบฒเบเป.
- เปเบเบเบเบฒเบ Deploy เปเบกเปเบเปเบเบเบเปเบฝเบงเบเบฒเบเบเบฒเบเปเบเบเปเบเบเบเบฒเบเบเบฒเบเบเบญเบ เปเบฅเบฐเบชเบฒเบกเบฒเบเบเปเบฝเบเปเบเบเปเบเปเปเบเบเบเบนเปเปเบเปเบเบตเปเบกเบตเบเบปเบเบเบฒเบเปเบเบปเปเบฒเบเบญเบ เปเบฅเบฐเบเบนเปเบฎเบฑเบเบชเบฒเปเบเบปเปเบฒเบเบฑเปเบ.
- Runner เบชเบฐเปเบเบฒเบฐเปเบเบเบเปเบฒเบเบซเบฒเบเบเบตเปเบกเบต cache "เบฎเปเบญเบ" เปเบเบทเปเบญเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฝเบเปเบเปเบเบฐเบเบดเบเบฑเบเบซเบเปเบฒเบงเบฝเบ.
- เบเบฒเบเปเบเบตเบเปเบเปเบชเบฐเปเบเบฑเบเบเบฑเบญเบ/เบเบฒเบเบเปเบญเบเปเบงเบตเบเบฑเบเบขเบนเปเปเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบเบชเบฒเบเบฒเบฅเบฐเบเบฐ.
- เบเบงเบเปเบเบดเปเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบญเบเบชเบฐเบเบฑเบเบเปเบญเบเบชเปเบฒเบฅเบฑเบเบเบงเบฒเบกเบเปเบญเบกเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบดเบกเปเบเบตเบเปเบเปเปเบ maven central.
- เบเบฒเบเบเปเบญเบเบเบฑเบเบเบฒเบเบเบดเบกเปเบเบตเบเปเบเปเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบญเบ "เบงเบฑเบเบเบธเบเบดเบ" เบชเบฐเบเบฑเบเปเบ maven central.
- เบชเปเบฒเบโเปเบฅเบฐโเปเบเบตเบโเปเบเปโเบชเบฐโเบเบฑเบ snapshot โเบเปเบฝเบงโเบเบฑเบโเบเบฒเบโเบเบฅเบดเบโเปเบชเปโโโ.
- เบเบฑเบเปเบเบฑเบเบกเปเบฝเบเบญเบฑเบเบเบฝเบงเบชเบณเบฅเบฑเบเบเบฒเบเปเบเปเบฎเบฑเบเบเบฒเบเบชเบฐเปเบเบฑเบเบเบฑเบญเบ/เบฅเบธเปเบเบญเบญเบ.
- เบเปเปเบเบปเปเบงเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเปเบชเปเบฒเบ / เบเบฒเบเบเบปเบเบชเบญเบ / เปเบเบตเบเปเบเปเปเบเบเบเบฒเบ java.
เบเบฒเบเบเบฑเปเบเบเปเบฒ GitLab CI เบเปเปเปเบกเปเบเบซเบปเบงเบเปเปเบเบตเปเบชเบฑเบเบชเบปเบเบเปเบญเบเบงเปเบฒเบกเบฑเบเปเบเบดเปเบเบเบทเบงเปเบฒเบขเบนเป glance เบเปเบฒเบญเบดเบ. เบกเบฑเบเบเบฝเบเบเปเบเบตเปเบเบฐเบเบฑเปเบ CI เบเบปเบเบเบทเปเบเบเบฒเบ turnkey เบชเบญเบเบชเบฒเบกเปเบเบทเปเบญ, เปเบฅเบฐเบเบญเบเบเบตเปเปเบเบปเปเบฒเบขเบนเปเปเบเบเบฒเบเบเบฑเบเบชเบกเบฑเบเปเบฅเปเบเปเบเปเบฅเบทเปเบญเบเบเบตเป. เบเบดเปเบเปเบเบเบงเปเบฒเบเบฑเปเบ, เปเบญเบเบฐเบชเบฒเบ GitLab เปเบกเปเบเบเปเปเบฒเบเปเบญเบเบซเบผเบฒเบ. เบขเปเบฒเบขเปเบฒเบเบเบตเปเบเบฐเปเบญเบปเบฒเบเบฒเบเบเปเบฒเบงเบเปเบฒเบญเบดเบ. เบซเบปเบเบเบฒเบเบเบฒเบเบปเบเบขเบนเปเปเบเปเบเบฑเปเบเปเบเบเบญเบเบเบปเบเบเปเบฒเบ (เบเปเบญเบเบเปเปเบเบทเปเบงเปเบฒเปเบเปเบงเบปเปเบฒ :)
เบเปเบญเบเบเบฐเบเบตเปเบเบเบตเปเบเบฐเปเบเปเบฎเบฑเบเบเบฒเบเบเบดเบเบปเบก.
เปเบเบเบปเบเบเบงเบฒเบกเบเปเปเปเบเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบชเบปเบเบเบฐเบเบฒเบเปเบฝเบงเบเบฑเบเบงเบดเบเบตเบเบฒเบเบเปเบฒเบซเบเบปเบเบเปเบฒ GitLab CI เปเบเบทเปเบญเบเปเบฒเปเบเบตเบเบงเบฝเบเบเบฒเบเบเบตเปเบกเบตเบเบฒเบเบเบปเบเบชเบญเบเบเบฒเบเปเบเบทเปเบญเบกเปเบเบเบเบตเปเบกเบตเบเบฒเบเปเบเปเบเบเบฑเบ (เบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบฒเบเปเบเปเบเบฒเบเบเบปเบเบชเบญเบเปเบเบเปเบเป docker-compose) เบเปเบฒเบเปเบฒเบเบกเบตเบเบฝเบเปเบเปเบซเบเบถเปเบ shell runner.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com