α’ααααααααααααΌαααΆαααααα»ααα»ααααααΆααα’αααα’αα·αααααα java αααααααΌαααΆααααααααΆαααα·ααααααααα½ααααααΆαααΆαααα αααα ααΆαα sonatype αα·α/α¬ maven ααααΆαααααααΆααααααααΎ GitLab α αα αααα»αα’αααααααα αααα»αααΉααα·ααΆαα’αααΈααΆαααα‘αΎα gitlab-runner, gitlab-ci αα·α maven-plugin ααΎααααΈαααααααΆααααα αΆαααα
αααααΌαααΆαααΆαα»αα
- ααΆααααα»αααα mvn αα·α GPG αααααααααα»ααααα·ααΆαα
- ααΆααΆααΆαα’αα»ααααααΆααα·α αα CI ααΆααΆαααα
- αααα»ααααα ααααααα»αα»ααΆα (ααΆαα ααααααΆα/ααΌααα) αα ααααΆααααΆααΆαααα
- ααΆααααα½ααα·αα·ααααααααααααααααααα·ααααααα ααααααΆααααααΆααααΆαααααα»αααααααΆααα αααα»α maven Central α
- αααααααααΆαααΌαα αααααΆααααΆααααα»αααααα»αα»ααΆααα αααα»αααααΆαααααααΆααααααααααΆα αααΎαα
- ααΆαααΆαααα αα·αααΆαααΆααααα½αααααΆαααααΎααααΆααα
ααΆαα·ααΆ
ααααααΆαααΌαα ααΆαααα‘αΎαααααααααΆαααααααΆααα αααα»α GitLab α’αααααα GitLab GitLab αααΈα’αΆα ααΆαααααααα ααΆαααααααα pom.xml αααααα ααα ααααΈααααα·ααααΆα
ααααααΆαααΌαα
- ααΆααα·αααααΆαααα’α·αααααααααΆααααααΆααααΆααααααααΆαααααα»αα»ααΆααα
Maven Central ααΆααααααααΆαααααααα αα Sonatype OSS ααααΌαααΆααα·αααααΆαα½α
α αΎααα
αααα»α
α’αααααβααα α’αααβααααΎGoogolplex ααΌα αααααααα»αααΉαααααα α’αααααααααα αααααααααααααΉαααααΌαα - α
α»ααααααααΆαα»ααααααΆαα
Sonatype JIRA α αΎαααΎααααα»αααααΎααααΈααΎαααααΆαα (α’αΆαααααααααααΆααααααααΆααααα’α·ααααααααααααΎααααα»ααα Sonatype JIRA ) αααααΆααααΈααΎαααααΆαα ααΌα αΌα/ααΆααααααααΆαα JIRA (ααα αααα α ααΆααααΈ Sonatype) ααΉαααααΌαααΆαααααΎααΎααααΈαααα»αααααα»αα»ααΆααα ααΆαα Sonatype nexus α - ααΎαααΈααα ααααΎαααΆαααααΆααααααΎαααΌααα GPG ααααΌαααΆααα·αααααΆαααΆααααα½αα ααΌαααΎαααααααααααΆααααααααΆααααα’α·αααααααα
ααααααα ααΆαααααααα GnuPG ααΎααααΈα α»αα αααααααΆααΎααααα»αα»ααΆα - ααααα·αααΎα’αααααααΎαα»αααΌαααΈαα»α
ααΎααααΈαααααΎαααΌααα GPG (gnupg/gnupg2) αααα’αααααααΌαααα‘αΎα
rng- α§ααααα ααΎααααΈαααααΎα entropy α ααΎαα·αααΌα αααααα ααΆααααααΎαααΌαααα’αΆα α αααΆααααααΌαααΆααα - ααααΆαααααααα»α ααΆααΆααα ααααΆααα
α»α
GPG
http://keys.gnupg.net http://pool.sks-keyservers.net http://keyserver.ubuntu.com
ααΆαααα‘αΎαααααααααΆαααααααΆααα αααα»α GitLab
- ααααΌαα’αααααααΌααααααΎα αα·αααααααα
ααΆαααααααααααααααααααααααααα αΌααααααααΉαααααΌααααααΆαα»ααααααΆααααΆαααααααΆαααααα»αα»ααΆαα αααα»αααΆαα α
αααααααααααααα»ααααΆαααΆαααα αα·ααα·ααααα»αααααΆα -
ααΆαααααααΆα - αααααΆααααΈαααααΎαααααΆαα α’αααααααΌαααΆααααααα·αααΆαα
αΌαααααΎ ααΎααααΈααααΆααααααΌαααααΆααα
α αΌααα ααΆαααααααα -> ααΆαααααα -> ααααΆαα -> ααΆααΆααΆαααΆαα ααΎααα»αα αααΆααααΆααα’αα α αΎαααααααα αααΆαααααα½αααΆαα½α Wildcard * αααααΆααα·αααα·αα»α αα·ααααα αΌαα αΌαααααΆαααααΆααααα’αααααααΎααααΆαααααααΆααα½ααΆααΈααΆα’αααααααΆαααα»αααααα α αααΆαααααααΉαααααΎαααΆααααααΆααα’αααααααΎααααΆααααΆααα’ααααααααααααα αα·ααααα»αααααααααααααααΆαααααα·αααα·α
- ααααα·αααΎααΆαα’αααααααΆαα
αααΎαααΆααααα αααααααααΆαααααα’αααα»αααΊααααΌααααααααΆαα
αΌααα
ααΆααααααααααΆαααααΆαααα
α αΌααα ααΆαααααααα -> ααΆαααααα -> ααΌαα -> ααΆαααΎαααΎα αααααααα·ααααααααα ααΆαα’αα»ααααΆα α αΎααααααααααααΆαααΎαααΎααααααααα α―ααα.
αααα»αααΆααααααααααα’αΆα α αΌαααααΎαααΆαααΆαααΆααΆααΆααα αααααΆααααα»αααααΎ GitLab Runner ααααΆαααααα½ααααααααα»α α αΎαααΆααααααα»ααααααα’αΆα α αΌαααααΎααΎααααΈααααΆααααααΌαααααΆααα ααΆααα·ααα ααΆαα·ααααααΆαααααααααααααααααα»ααααα»αααΆααααα αΆαααααααΆαα―ααααα αααα»ααααααα ααα»ααααααααα αΌααααααααΆααΆαααααα - ααΉααααααΉαα
αααΆαααααααΆααααΆαααααΆααααααΌαααααΆαα
α αΌααα ααΆαααααααα -> ααΆαααααα -> ααααΆαα -> Push Rules α αΎαααααα Committer restriction αα·αα·αααααΎαααΆααΎα’ααααα·ααααααΊααΆαααα’αααααααΎααααΆαα GitLab αααα¬ααα αααα»αααααΌααααααα’αα»ααΆαααα±αααααααααααααααΆα α»αα αααααααΆ α αΎααααααααα Reject unsigned commitsα - αααααΆααααα’αααααααΌαααααααα
ααΆαααααααααααααΉαααΎααααΈααααΎαααΆαααΆααα·α
αα
α αΌααα ααΆαααααααα -> ααΆαααααα -> CI / CD -> Pipeline triggers α αΎααααααΎααααααΆ trigger-token ααααΈ
αααααΆαααααΆαααααα’αΆα ααααΌαααΆαααααααααααΆαααα αααα»αααΆαααααααα ααΆααααααααααΌαα ααα’ααααααααΆαααααα»αααααααα
α αΌααα ααΆαααααα»α -> ααΆαααααα -> CI / CD -> Variables α αΎαααααααα’ααααα½ααDEPLOY_TOKEN
ααΆαα½αααΉαααααααααααΆαααα
α’αααααα GitLab
αααααααααα·αααααΆα’αααΈααΆαααααααα ααΆαααααααααααααΆααααααΎαααΆαααΆααα·α αα ααΎααΆαααΆαααααααΆααααααααΎαααααα·ααΈαααααααΆαααααα½αααααα’ααα (ααΆααααΆαα) αα·αααΆααΆααα (α ααααααα)α
α’αααααααααααΆααααΆααααΆαα
αααα»αβααααΎβαααΆαααΈαβαααβααααΆααβαααα½αβαααααβααΆβααααΌαβααΆβααΆαβαααα½α ααΏα αααα
αααααΆααα’αααααααααα»αααΌαααααΆα Linux VDS αααααΆα CPU 1, RAM 2 GB, HDD 20 GB α αααααα
αα ~ 3000β½ αααα»ααα½αααααΆαα
α’αααααααααααααα»α
αααααΆααα’αααααααααα»ααα VDS 4 CPU, RAM 4 GB, 50 GB SSD α ααΆααΆαααααα ~ 11000β½ α αΎααα·αααααααααααΆαααΆα
αααα»αααΆααααΆαααΈαααα»α α§ ααααΏαα 7 αα
ααΎ aruba αα·α 5 αα
ααΎ ihor α
ααΌα
ααααααΎαααΆαα’αααααααααααΆααα α₯α‘αΌααααααΎαααΉααααα
αααΆα
ααΎαα
αΌααα
ααΆαααααΆαααΈαααΆαααα SSH α αΎαααα‘αΎα java, git, maven, gnupg2 α
ααΆαααα‘αΎααααααα·ααΈααα gitlab
- αααααΎααααα»αααααΈα
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_PASSHRASE - ααΆααααααααΆαααα 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 -> Variables α αΎααααααΆαα»αααα―ααααααα»αα’ααα
GPG_SECRET_KEY
ααΆαααα‘αΎα Maven
- αααααΎααααα
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
- α
αΌααα
ααΆααααΆαααααααααααα -> ααΆαααααα -> CI / CD -> Variables α αΎααααααΆαα»ααααα»αα’ααααα½αα
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 -> Variables α αΎααααααΆαα»ααααα»αα’ααααα½αα
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 α ααΆαααααααααααΆα§ααΆα ααααααααΆααααααα’αΆαααααα
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 αααΈα’αΆα
ααΆαααααααΆααααααα
ααααααα―αααΆα .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
αααααα Java
αα αααα»ααααααα java αααααααΌαααΆαααααααααααΆααααΌαααΆααααα αααα ααΆααααααΆααααΆααΆααα α’αααααααΌααααααα 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 αα½αβαααααΆααβαααααα 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 ααΎααα ααΆαααααααααΌα α ααα’αα αα·ααα·αααΆαααΆαααααααΈ
.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
ααΆααααααΎα 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 α αααΎαααα
- αααααΈααααα
αααααααΌαααααααααΆααααααΎααΆαααΆαα½αααααΆααααααΆαααααα (
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin
). - ααΆαα ααααααΆααααααααααααααααα·αα·αα·αααααΎαααααααΆαααΆααααα αααα»α maven central
αααααα
ααΆαααααα»ααααααα SNAPSHOT
αα αααααΆαααααααααα ααΆα’αΆα α αΆααααααΎαααΆααα·α αα αααααααΎααααΈααΆααααααα SNAPSHOT αα ααααΆαα
αα
αααααααα·α
αα
ααΆααααααααΌαααΆαα
αΆααααααΎα αα·α
αα
ααΆααααααααΌαααααΆαα
αααα»αααααααααΆαααααααΆαααααΌαααΆαααα (
αααααα ααα»αααααΆαα αααΉα
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 ααΆα αααΎααααααΆααααΆααααα ααααααα»αα»ααΆααα ααΆααααααΆααααΆααΆααααααααΆααααΆααΆα’αα·ααααααααααααα
- ααααααααΆαααααααΆαααΊααΆα ααααα‘ααααΈααΆαααααααααααααΈααΆααααα α αΎαα’αΆα ααααΆααααααΌαααΆααααα’αααααααΎααααΆαααααααΆααα½ααΆααΈααα αΆαα αα·αα’αααααααΆαααα»αααααα
- αααααα·ααΈαααααΆααααΆααααΆα ααααα‘αααααααΆαααααΆαααααααΆαα "αααα " ααΎααααΈααααΎαααΆαααααΆααα·α αα ααα»αααααα
- ααΆαααααα»αααααααΆαααΌααα/ααααα ααααααΆααα αααα»αααααΆααααΆααΆαααα
- αα·αα·ααααααααααααααααααα·ααααααα ααααααΆααααααΆααααΆαααααααααα½ααααααΆααααΆαααααα»αααααααΆααα αααα»α maven central α
- ααΆαααΆαααΆααααααΆααααΉαααΆαααααα»ααααααααααααααααααα·αααααα "αα " αα αααα»α maven central α
- αααααΎα αα·ααααααααΆαααααααΌααα "αα ααΎααΆαα α»α " α
- ααααΆαααααα½ααααααΆααααΆαααα½αααΆαααΌααα/ααααα ααααααΆαα
- ααααααααα αΌααααααααΌαα αααααΆααααΆαααα/ααΆααααα/ααααα»ααααααααα java α
ααΆαααα‘αΎα GitLab CI ααΊαα·ααααα»αααααΆαααΌα αααααΆαααααΌα αααααΆα αΆααααΌα ααΆαα glance ααααΌαα ααΆαααααααααΆααα αΎααααα»αααΆαααα‘αΎα CI αα ααΎααΌαααααΆα turnkey ααΈαααΈαα α αΎαα₯α‘αΌααααα’ααααα ααααΆαααΈα’ααααααααααα α·ααααα αααα»ααααα αΆαααα ααΎαααΈααααα ααα α―αααΆα GitLab ααΊαα·αααΆαα αααΎαααα αα»αααααΆα αααα»αααΆααααααα αΆαααααΌαα ααααΌαβααα βαααααβααα αΆαβα’αααβααΎα (αααα»αβαα·αβα αΆαβααΆβα’αααβααΆβαα·ααΆαβαα :)
αααα»αααΉαααΈαααΆαα ααααααα·αααααα’α
αα αααα»αα’ααααααααααΆαα αααα»αααΉααααα αΆαα’αααααΈααααααα‘αΎα GitLab CI ααΎααααΈααααΎαααΆααα·α αα ααΆαααΆααααααααΆα ααααααααααααααααΆαααααα½ααααααα (ααααΎαααΆαααααΆααααααΆαααααααΆαα½α docker-compose) ααααα·αααΎα’αααααΆαα’ααααααααααααα½αα
ααααα: www.habr.com