แแก แกแขแแขแแ แแแแแฃแแแแแแแ Java แแแแแแแแแ แแแแกแแแแก, แ แแแแแแกแแช แแฅแแ แกแแญแแ แแแแ แกแฌแ แแคแแ แแแแแแฅแแแงแแแ แแแแแแแแ แแ แแแฃแฅแขแแแ sonatype แแ/แแ maven แชแแแขแ แแแฃแ แกแแชแแแแแจแ GitLab-แแก แแแแแงแแแแแแ. แแ แกแขแแขแแแจแ แแแกแแฃแแ แแ gitlab-runner, gitlab-ci แแ maven-plugin-แแก แแแงแแแแแแแ แแ แแ แแแแแแแก แแแแแกแแญแ แแแแ.
แฌแแแแแแ แแแแแ:
- mvn แแ GPG แแแกแแฆแแแแแแก แฃแกแแคแ แแฎแ แจแแแแฎแแ.
- แกแแฏแแ แ CI แแแแชแแแแแแก แฃแกแแคแ แแฎแ แจแแกแ แฃแแแแ.
- แแ แขแแคแแฅแขแแแแก แแขแแแ แแแ (แแแแแชแแแ/แกแแแแจแแขแ) แกแแฏแแ แ แกแแชแแแแแจแ.
- แแแแแจแแแแแก แแแ แกแแแแแก แแแขแแแแขแฃแ แ แจแแแแฌแแแแ maven Central-แจแ แแแแแกแแฅแแแงแแแแแแ.
- แแแแแแ แแแแแฌแงแแแขแ แแ แแแแแ แแ แแแฅแขแแกแแแแก แแ แขแแคแแฅแขแแแแก แกแแชแแแจแ แแขแแแ แแแแกแแแแก.
- แกแแแแ แขแแแ แแ แแแแแงแแแแแแก แกแแแแ แขแแแ.
แแแคแแ แแแชแแแก
แแแแแแ แแแคแแ แแแชแแ GitLab-แจแ แแแแแแแแแแก แแ แแแฅแขแแก แแแงแแแแแ GitLab Runner GitLab CI pom.xml แแแแคแแแฃแ แแชแแ แจแแแแแ แแแกแแแแ
แแแแแแ แแแคแแ แแแชแแ
- Sonatype OSS แกแแชแแแแก แฐแแกแขแแแแแก แกแแ แแแกแแก แแแจแแแแแแ Maven Central-แจแ แแ แขแแคแแฅแขแแแแก แแแแแฅแแแงแแแแแก แแแฅแแแแแแแก แแแขแแแฃแ แ แแฆแฌแแ แ แฃแแแ แแฆแฌแแ แแแแ
แแก แแ แขแแแแ แแแแฎแแแ แแแแแแแฃแแแแแแแฅแกแ , แแแแขแแ แแ แกแขแแขแแแก แกแฌแแ แแแแแแแแจแ แแแแแแ แแแ. - แฌแแแแกแฌแแ แฉแแฌแแ แ แแแกแแแแ แแแ
แกแแแแขแแแ JIRA แแ แแแแฌแงแแ แแแแแแ แกแแชแแแแก แแแกแแฎแกแแแแแ (แแแแแขแแแแแ แแแคแแ แแแชแแแกแแแแก แฌแแแแแแฎแแ แแแแงแแคแแแแแแจแแฅแแแแแ Sonatype JIRA แแแแแแ ). แกแแชแแแแก แแแฎแกแแแก แจแแแแแ, JIRA แจแแกแแแ/แแแ แแแแก แฌแงแแแแ (แจแแแแแแแจแ Sonatype แแแแแ แแจแ) แแแแแงแแแแแฃแแ แแฅแแแแ แแ แขแแคแแฅแขแแแแก แแกแแขแแแ แแแ Sonatype Nexus-แจแ. - แจแแแแแแ, GPG แแแกแแฆแแแแก แแแแแ แแ แแแแก แแ แแชแแกแ แซแแแแแ แแจแ แแแแ แแ แแก แแฆแฌแแ แแแ. แแฎแแแแ แกแแฅแชแแ แแแแแขแแแแแ แแแขแแแแแแกแแแแก
GnuPG-แแก แแแแคแแแฃแ แแชแแ แแ แขแแคแแฅแขแแแแก แฎแแแแแฌแแ แแกแแแแก - แแฃ แแฅแแแ แแงแแแแแ Linux แแแแกแแแก GPG แแแกแแฆแแแแก แจแแกแแฅแแแแแแ (gnupg/gnupg2), แแแจแแ แฃแแแ แแแแแแกแขแแแแ แแ
rng- แแแกแขแ แฃแแแแขแแแ แแแขแ แแแแแก แจแแกแแฅแแแแแแ. แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ, แแแกแแฆแแแแก แจแแฅแแแแก แจแแแซแแแแ แซแแแแแ แแแแ แแ แ แแแกแญแแ แแแก. - แจแแแแฎแแแก แกแแ แแแกแแแ แกแแแแแแแแแแ GPG แแแแแแจแแแ
http://keys.gnupg.net http://pool.sks-keyservers.net http://keyserver.ubuntu.com
GitLab-แจแ แแแแแแแแแแก แแ แแแฅแขแแก แแแงแแแแแ
- แฃแแแ แแแแแก แงแแแแแกแ, แแฅแแแ แฃแแแ แจแแฅแแแแ แแ แแแแแแแคแแแฃแ แแ แแ แแ แแแฅแขแ, แ แแแแแจแแช แแแแกแแแแแ แจแแแแแฎแแแ แแ แขแแคแแฅแขแแแแก แแแแแแแแแแกแแแแก. แแ แแฃแฌแแแ แฉแแแก แแ แแแฅแขแก แแแ แขแแแแ แแ แแแฃแ แแฃแแแแแแ -
แแแแแแแแกแแก - แกแแชแแแแก แจแแฅแแแแก แจแแแแแ, แแฅแแแ แฃแแแ แจแแแฆแฃแแแ แฌแแแแแ แกแแชแแแแก แจแแกแแชแแแแแแ.
แแแแแแแ แแ แแแฅแขแแ -> แแแ แแแแขแ แแแ -> แกแแชแแแ -> แแแชแฃแแ แคแแแแแแแแ. แฉแแแ แแจแแแ แงแแแแ แฌแแกแก แแ แแแแแขแแแ แแ แ แฌแแกแก Wildcard *-แแ, แฃแคแแแแแ แแแแงแแแแก แแ แจแแ แฌแงแแ แแฎแแแแ แแ แแแแฎแแแ แแแแแแแกแแแแก, แ แแแแแแกแแช แแฅแแ Maintainers แ แแแ. แแก แฌแแกแ แแแฃแจแแแแแก แ แแแแ แช แแ แแ แแแฅแขแแก, แแกแแแ แแ แฏแแฃแคแแก แงแแแแ แแแแฎแแแ แแแแแกแแแแก, แ แแแแแกแแช แแแฃแแแแแก แแก แแ แแแฅแขแ.
- แแฃ แแ แกแแแแแก แ แแแแแแแแ แจแแแกแ แฃแแแแแแ, แแแจแแ แกแแฃแแแแแกแ แแแแแกแแแแแ แแฅแแแแ แแ แแแชแแแจแ แแ แแแฅแขแแ แฌแแแแแแก แจแแแฆแฃแแแ.
แแแแแแแ แแ แแแฅแขแแ -> แแแ แแแแขแ แแแ -> แแแแแแ -> แฎแแแแแแแแ, แแ แแแฅแขแแก แคแฃแแฅแชแแแแ, แแแแแ แแแแแ แแ แแแแงแแแแ แแ แแแฅแขแแก แฎแแแแแแแแ แแแ แแแ.
แแ แแแฅแแก แแ แแแฅแขแ แกแแฏแแ แ แฌแแแแแแจแ, แ แแแแแ แแแงแแแแ แฉแแแก GitLab Runner-แก แแ แแฎแแแแ แแ แแแฅแแก แฌแแแแแ แกแแชแแแแก แจแแชแแแแแ. แแกแ, แ แแแแฃแ แแ แแ แจแแแแก แฉแแแก แแแขแแ แแกแแแจแ แแแ แแแ แแแคแแ แแแชแแแก แฉแแแแแแ แกแแฏแแ แ แแแแกแแแแแแก แแฃแ แแแแแแจแ. - แกแแชแแแแก แจแแชแแแแก แฌแแกแแแแก แแแแแแชแ แแแ
แแแแแแแ แแ แแแฅแขแแ -> Settings -> Repository -> Push Rules แแ แแแแงแแแแ Committer-แแก แจแแแฆแฃแแแ, แจแแแแแฌแแแ แแ แแก แแฃ แแ แ แแแขแแ แ GitLab แแแแฎแแแ แแแแแก แแ แแจแแแ. แแ แแกแแแ แแแ แฉแแแ แแแงแแแแแแกแฎแแแแแฌแแ แแก แแแแแแแฃแแแแ แแ แแแแงแแแแ Reject unsigned commits flag. - แจแแแแแแ, แแฅแแแ แฃแแแ แแแแแแแคแแแฃแ แแ แแ แขแ แแแแ แ แแแแชแแแแแแก แจแแกแแกแ แฃแแแแแแ
แแแแแแแ แแ แแแฅแขแแ -> แแแ แแแแขแ แแแ -> CI / CD -> แแแแกแแแแแแก แขแ แแแแ แแแ แแ แจแแฅแแแแแ แแฎแแแ แขแ แแแแ แ-แขแแแแแ
แแก แแแจแแแ แจแแแซแแแแ แแแฃแงแแแแแแแแ แแแแแแขแแก แชแแแแแแแแก แแแแแ แแแแคแแแฃแ แแชแแแก แแ แแแฅแขแแแแก แฏแแฃแคแแกแแแแก.
แแแแแแแ แฏแแฃแคแจแ -> แแแ แแแแขแ แแแ -> CI / CD -> แชแแแแแแแ แแ แแแแแแขแแ แชแแแแแDEPLOY_TOKEN
แขแ แแแแ -แขแแแแแแ แแแแจแแแแแแแแจแ.
GitLab Runner
แแก แแแแงแแคแแแแแ แแฆแฌแแ แก แแแแคแแแฃแ แแชแแแก แแแจแแแแฃแแ แแแแชแแแแแแก แแแแแแแแแแกแแก แแจแแแแแฃแ แ (แกแแแชแแคแแแฃแ แ) แแ แกแแฏแแ แ (แแแแแแ แแแฃแแ) runner-แแก แแแแแงแแแแแแ.
แกแแแชแแคแแแฃแ แ แแแ แแแแแแ
แแ แแแงแแแแ แกแแแฃแแแ แแแ แแแแแแก, แ แแแแแ, แแแ แแแ แ แแแจแ, แแก แแ แแก แแแกแแฎแแ แฎแแแแแ, แกแฌแ แแคแ แแ แแแคแ.
runner-แแกแแแแก แแแ แฉแแแ Linux VDS-แก 1 CPU, 2 GB แแแแ แแขแแฃแแ, 20 GB HDD. แแแแแจแแแแแก แคแแกแ ~ 3000โฝ แฌแแแแฌแแแจแ.
แฉแแแ แแแ แแแแแแ
แแแ แแแแแแแกแแแแก แแแแฆแ VDS 4 CPU, 4 GB RAM, 50 GB SSD. แฆแแ แแ ~ 11000โฝ แแ แแ แแกแแ แแก แแแแแแแ.
แกแฃแ 7 แแแแฅแแแ แแแฅแแก. 5 แแ แฃแแแแ แแ 2 แแฐแแ แแ.
แแกแ แ แแ, แฉแแแ แแแงแแแก แแแ แแแแแแ. แแฎแแ แฉแแแ แแแแแงแแแแแ แแแก.
แฉแแแ แแแแแแแแ แ แแแแฅแแแแจแ SSH-แแก แกแแจแฃแแแแแแ แแ แแแงแแแแแ java, git, maven, gnupg2.
gitlab runner-แแก แแแงแแแแแ
- แจแแฅแแแแแ แแฎแแแ แฏแแฃแคแ
runner
sudo groupadd runner
- แจแแฅแแแแแ แแแ แแฅแขแแ แแ maven แฅแแจแแกแแแแก แแ แแแแแแญแแ แฏแแฃแคแแก แฃแคแแแแแแ
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 แแแแฅแขแแฃแ แแแฃแแ แแ แแ แแแฅแขแแกแแแแก
แแแ แแแ
- แแแแแขแแแ แชแแแแ แแแแกแแฎแฃแ แแแ
/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 แแแ แแฅแขแแ แแ แกแแชแแแ แแ แแแแแแแจแแ แแ แฅแแจแแแ (แแ แจแแชแแแ)
แแก แแแแแฏแ แจแแแซแแแแ แแแแแขแแแแ, แแฃ แแ แแแแ แแแ แ แแแแแแแแ แแแ แแแแแแแก แแแจแแแแแก แแแแแ แแแแฅแแแแแ.mkdir -p ~/.m2/repository ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
- แจแแฅแแแแแ แซแแ แแแแแ แแแกแแฆแแแ
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
- แจแแฅแแแแแ แคแแแแ ~/.m2/settings-security.xml
<settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity>
- แแแ แแแแก แแแจแแคแแ แ Sonatype แแแแแ แแจแแแแ
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
- แจแแฅแแแแแ แคแแแแ ~/.m2/settings.xml
<settings> <profiles> <profile> <id>env</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase> </properties> </profile> </profiles> <servers> <server> <id>sonatype</id> <username>SONATYPE_USERNAME</username> <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password> </server> </servers> </settings>
แกแแ,
GPG_SECRET_KEY_PASSPHRASE - GPG แแแกแแฆแแแแก แแแ แแแ
SONATYPE_USERNAME โ sonatype แแแแแ แแจแแก แจแแกแแแ
แแก แแแแกแ แฃแแแแก 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_PASSPHRASE - GPG แแแกแแฆแแแแก แแแ แแแ
SONATYPE_USERNAME โ sonatype แแแแแ แแจแแก แจแแกแแแ
แแแแแแแแกแแ แแแแแ แแก แกแฃแ แแแ
-
แฉแแแ แแฅแแแแ แกแแแแแแ แแแ แขแแ Dockerfile-แก แแแแแแแแแแแก แแแกแแจแแแแแ Java-แก แกแแกแฃแ แแแแ แแแ แกแแแ. แฅแแแแแ แแแชแแแฃแแแ แแแแแแแแ แแแแฃแ แแกแแแแก.
FROM java:8u111-jdk-alpine RUN apk add gnupg maven git --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && mkdir ~/.m2/
-
แแแแขแแแแแ แแก แแฌแงแแแ แแฅแแแแ แแ แแแฅแขแแกแแแแก
docker build -t registry.gitlab.com/group/deploy .
-
แฉแแแ แแแแแฌแแแแ แแแแแแขแแคแแแแชแแแก แแ แแขแแแ แแแแ แแแแขแแแแแ แก แ แแแกแขแ แจแ.
docker login -u USER -p PASSWORD registry.gitlab.com docker push registry.gitlab.com/group/deploy
GitLab CI
แแแแแแแแกแแ แแ แแแฅแขแ
แแแแแแขแแ แคแแแแ .gitlab-ci.yml แแแแแแแแแแก แแ แแแฅแขแแก แซแแ แจแ
แกแแ แแแขแ แฌแแ แแแแแแแแก แแ แฃแ แแแแ แแแแแแแ แแชแฎแแ แแแแแแแแแแก แแแแชแแแแก. แแแแแ แแขแฃแแ 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 แแ แแแฅแขแแแจแ, แ แแแแแแแช แฃแแแ แแแขแแแ แแแก แกแแฏแแ แ แกแแชแแแแแจแ, แแฅแแแ แฃแแแ แแแแแแขแแ 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 แแ แแแฅแขแแแแกแแแแก.
แแแฌแแ แแแแแแ
แชแแแแ แแ แแแฅแขแ แจแแแฅแแแแ
แกแแแ แแ.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 แแแแแแงแฃแ แแแ แซแแแแแ แแแแแแฅแขแฃแ แ แแ แแ แ แกแแขแงแแแแ แ
.gitlab-ci.yml
include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml
Shields4J:
extends: .build_java_project
Sphinx doc:
extends: .build_sphinx_doc
variables:
DOCKERFILE: .docs/Dockerfile
Sonar review:
extends: .sonar_review
dependencies:
- Shields4J
Release:
extends: .trigger_release_deploy
Snapshot:
extends: .trigger_snapshot_deploy
pom.xml แแแแคแแแฃแ แแชแแ
แแก แแแแ แแแขแแแฃแ แแ แแ แแก แแฆแฌแแ แแแ. nexus-staging-maven-plugin
แแฃ แแ แแกแฃแ แ แแ แแ แจแแแแซแแแแ แแแแแแงแแแแ org.sonatype.oss:oss-parent, แ แแแแ แช แแจแแแแแ แแฅแแแแ แแ แแแฅแขแแกแแแแก.
maven-install-plugin
แแแแกแขแแแแ แแแก แแแแฃแแแแก แแแแแแแแ แแ แกแแชแแแจแ.
แซแแแแแ แกแแกแแ แแแแแแ แกแฎแแ แแ แแแฅแขแแแจแ แแแแแฌแงแแแขแแแแแแแแก แแแแแแแแ แแแ แแแแแแแฌแแแแแกแแแแก, แแกแแแ แกแแแแแขแ แแแ แฏแแแแกแแแแก.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-project</id>
<!-- ะัะปะธ ั ะฒะฐั ะผะฝะพะณะพะผะพะดัะปัะฝัะน ะฟัะพะตะบั ั ะดะตะฟะปะพะตะผ ัะพะดะธัะตะปััะบะพะณะพ ะฟะพะผะธะบะฐ -->
<phase>install</phase>
<!-- ะฏะฒะฝะพ ัะบะฐะทัะฒะฐะตะผ ัะฐะนะปั ะดะปั ะปะพะบะฐะปัะฝะพะน ัััะฐะฝะพะฒะบะธ -->
<configuration>
<file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
<pomFile>dependency-reduced-pom.xml</pomFile>
<!-- ะัะธะฝัะดะธัะตะปัะฝะพะต ะพะฑะฝะพะฒะปะตะฝะธะต ะผะตัะฐะดะฐะฝะฝัั
ะฟัะพะตะบัะฐ -->
<updateReleaseInfo>true</updateReleaseInfo>
<!-- ะะพะฝััะพะปัะฝัะต ััะผะผั ะดะปั ะฟัะพะฒะตัะบะธ ัะตะปะพััะฝะพััะธ -->
<createChecksum>true</createChecksum>
</configuration>
</execution>
</executions>
</plugin>
maven-javadoc-แแแแแแแ
javadoc-แแก แแแแแ แแ แแแ แแ แแแฅแขแแกแแแแก.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<!-- ะะตะฝะตัะฐัะธั javadoc ะดะพะปะถะฝะฐ ะฑััั ะฟะพัะปะต ัะฐะทั ะณะตะฝะตัะฐัะธะธ ัะตััััะพะฒ -->
<phase>prepare-package</phase>
<configuration>
<!-- ะัะตะฝั ะฟะพะผะพะณะฐะตั ะฒ ะฟัะฑะปะธัะฝัั
ะฟัะพะตะบัะฐั
-->
<failOnError>true</failOnError>
<failOnWarnings>true</failOnWarnings>
<!-- ะฃะฑะธัะฐะตั ะพัะธะฑะบั ะฟะพะธัะบะฐ ะดะพะบัะผะตะฝัะฐัะธะธ ะฒ target ะดะธัะตะบัะพัะธะธ -->
<detectOfflineLinks>false</detectOfflineLinks>
</configuration>
</execution>
</executions>
</plugin>
แแฃ แแฅแแแ แแแฅแแ แแแแฃแแ, แ แแแแแแช แแ แจแแแชแแแก แฏแแแแก (แแแแแแแแแ แแฎแแแแ แ แแกแฃแ แกแแแก)
แแ แแ แแแชแแแจแ แแ แแแแแ แฏแแแแแแแแก แแแแแ แแ แแแ, แแแ แ แแแแฎแแแ แ 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>
แแแขแ แแแแฃแกแ
- แแแแแแแแก แซแแแแแ แแแแแแ แ แกแแ nexus แกแแชแแแแแ แแฃแจแแแแแกแแแแก (
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin
). - แแแขแแแแขแฃแ แ แแแแแจแแแแแก แจแแแแฌแแแแ แฉแแแแขแแแ แแแแก แจแแกแแซแแแแแแแแกแแแแก Maven Central-แจแ
แจแแแแแ
SNAPSHOT แแแ แกแแแก แแแแแฅแแแงแแแแ
แแ แแแฅแขแแก แจแแฅแแแแกแแก แจแแกแแซแแแแแแแ แแแแแแแแแก แฎแแแแ แแแฌแงแแแ SNAPSHOT แแแ แกแแแก nexus-แจแ แฉแแแแกแแขแแแ แแแ
แ แแแแกแแช แแก แแแแชแแแ แแแแฅแแแแแแแ, แจแแกแแแแแแกแ แแแแแแแแ แแแแฅแแแแแแแ แแแแแแแแแแก แแ แแแฅแขแจแ (
แแแญแ แแแ แแฃแ แแแแ
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 แแแ แกแแ แแขแแแ แแแแ
แงแแแแ แกแแแคแจแแขแแก แแแ แกแแ แจแแแซแแแแ แฌแแแจแแแแก แกแแแขแแก แกแแชแแแแแแ
แแแแแจแแแแแก แแแ แกแแแก แแแแแฅแแแงแแแแ
แ แแแแกแแช แขแแแ แแแงแแแแแฃแแแ, แแแแแแแแแแก แแ แแแฅแขแจแ แจแแกแแแแแแกแ แแแแแแแแ แแแขแแแแขแฃแ แแ แแแแฅแแแแแแแ แแแแแจแแแแแก แแแ แกแแแก แแขแแแ แแแแกแแแแก 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 แแแแแฅแกแแแก แกแฎแแ แกแแฏแแ แ แกแแชแแแแแก.
แแแแแฌแแ robots.txt แแขแแแ แแแ, แ แแแแแ แแแ แแแแฎแแแแ แฉแแแ แซแแแแ แกแแชแแแ.
แแแกแแแแ
แ แแช แแแแฅแแก
- แชแแแแ แแแแแแแแแแก แแ แแแฅแขแ, แ แแแแแจแแช แจแแแแซแแแแ แแแแแฎแแ แชแแแแแ แ แแแแแแแแ CI แแแแแแแแ แแ แขแแคแแฅแขแแแแก แแขแแแ แแแแกแแแแก แกแแฏแแ แ แกแแชแแแแแจแ แแแแแแแแ แแแแก แกแฎแแแแแกแฎแแ แแแแแแกแแแแก.
- แแแแแแแแแแก แแ แแแฅแขแ แแแแแแ แแแฃแแแ แแแ แ แฉแแ แแแแกแแแ แแ แจแแแซแแแแ แจแแแชแแแแแก แแฎแแแแ แแคแแแแแแแก แแ แจแแแกแ แฃแแแแแแก แ แแแแแแก แแฅแแแ แแแแฎแแแ แแแแแแแก แแแแ .
- แชแแแแ แกแแแชแแคแแฃแ แ Runner โแชแฎแแแโ แฅแแจแแ แแฎแแแแ แแแแชแแแแแแก แแแแแแแแแแก แแแแแแ.
- แกแแแแจแแขแแก/แแแแแจแแแแแก แแแ แกแแแแแก แแแแแฅแแแงแแแแ แกแแฏแแ แ แกแแชแแแจแ.
- แแแแแจแแแแแก แแแ แกแแแก แแแขแแแแขแฃแ แ แจแแแแฌแแแแ Maven Central-แจแ แแแแแกแแฅแแแงแแแแแแ แแแแแงแแคแแแกแแแแก.
- แแแชแแ Maven Central-แจแ โแแแแแแฃแแโ แแแ แกแแแแแก แแแขแแแแขแฃแ แ แแแแแฅแแแงแแแแแกแแแ.
- แจแแฅแแแแแ แแ แแแแแแฅแแแงแแแ แกแแแแจแแขแแก แแแ แกแแแแ "แแแฌแแแแฃแแแแแ".
- แแ แแแแแ แกแแชแแแ แกแแแแจแแขแแก/แแแแแจแแแแแก แแแ แกแแแแแก แแแกแแฆแแแแ.
- แแแแแแ แแแแกแแแแแ Java-แแ แแแฅแขแแก แแจแแแแแแแแแก / แขแแกแขแแ แแแแก / แแแแแฅแแแงแแแแแกแแแแก.
GitLab CI-แแก แแแงแแแแแ แแ แช แแกแ แ แแฃแแ แแแแแ, แ แแแแ แช แแ แแ แจแแฎแแแแแ แฉแแแก. แกแแแแแ แแกแแ แ แแแแแแฏแแ แแ แแแแงแแแแ CI แแแแแ แแฃแ แแแแก แกแแคแฃแซแแแแแ แแ แแฎแแ แแฅแแแ แจแแ แก แฎแแ แ แแ แกแแแแแฎแจแ แแแงแแแ แฃแแแกแแแ. แฃแคแ แ แแแขแแช, GitLab แแแแฃแแแแขแแชแแ แซแแแแแ แแแแแแขแแ. แแฃ แจแแแแจแแแแแแแ แแแ แแแแ แแแแแฏแแก แแแแแแแแแก. แแแ แแแกแแแ แฃแแแก แแแแแฏแแแแก แฅแแแจ แฉแแแแแ (แแ แแแฎแกแแแก แแแ แแฅแแ :)
แกแแแแแแแแแแ แแแแแฆแแ แแแแแฎแแแฃแ แแแแก.
แจแแแแแ แกแขแแขแแแจแ แแ แแแกแแฃแแ แแ แแแแแ, แแฃ แ แแแแ แฃแแแ แแแแแแแคแแแฃแ แแ แแ GitLab CI, แ แแแ แแแแชแแแแแ แจแแแกแ แฃแแแก แแแขแแแ แแชแแแก แขแแกแขแแแแ แแแแแฃแ แแแขแฃแแแ (แแแแแกแแชแแแแ แกแแ แแแกแแแแก แแแจแแแแ docker-compose-แแก แแแแแงแแแแแแ), แแฃ แแฎแแแแ แแ แแ แญแฃแ แแ แแแฅแแ.
แฌแงแแ แ: www.habr.com