ProHoster > Blog > Bestjoer > GitLab CI ynstelle om in java-projekt te uploaden nei maven sintraal
GitLab CI ynstelle om in java-projekt te uploaden nei maven sintraal
Dit artikel is bedoeld foar Java-ûntwikkelders dy't de needsaak hawwe om har produkten fluch te publisearjen yn sonatype en / of maven sintrale repositories mei GitLab. Yn dit artikel sil ik prate oer it ynstellen fan gitlab-runner, gitlab-ci en maven-plugin om dit probleem op te lossen.
Betingsten:
Feilige opslach fan mvn- en GPG-kaaien.
Feilige útfiering fan iepenbiere CI taken.
Artefakten uploade (release / momintopname) nei iepenbiere repositories.
Automatysk kontrolearjen fan release ferzjes foar publikaasje yn maven sintraal.
In algemiene oplossing foar it uploaden fan artefakten nei in repository foar meardere projekten.
In detaillearre beskriuwing fan it meganisme foar it publisearjen fan artefakten yn Maven Central fia Sonatype OSS Repository Hosting Service is al beskreaun yn dit artikel brûker Googolplex, dus ik sil ferwize nei dit artikel op 'e goede plakken.
Pre-registrearje foar Sonatype JIRA en iepenje in kaartsje om it repository te iepenjen (lês de seksje foar mear details Meitsje in kaartsje op Sonatype JIRA). Nei it iepenjen fan it repository sil it oanmeld-/wachtwurdpaar fan JIRA (hjirnei oantsjutten as it Sonatype-akkount) brûkt wurde om artefakten te uploaden nei Sonatype nexus.
As jo de Linux-konsole brûke om in GPG-kaai te generearjen (gnupg/gnupg2), dan moatte jo ynstallearje rng-tools om entropy te generearjen. Oars kin it generearjen fan kaaien in heul lang duorje.
Earst moatte jo in projekt oanmeitsje en konfigurearje wêryn de pipeline sil wurde opslein foar it ynsetten fan artefakten. Ik neamde myn projekt ienfâldich en sûnder komplisearre - deploy
Nei it meitsjen fan it repository moatte jo tagong beheine om it repository te feroarjen.
Gean nei projekt -> Ynstellings -> Repository -> Beskerme tûken. Wy wiskje alle regels en foegje ien regel ta mei Wildcard * mei it rjocht om allinich te drukken en te fusearjen foar brûkers mei de rol fan 'e Maintainers. Dizze regel sil wurkje foar alle brûkers fan sawol dit projekt as de groep dêr't dit projekt ta heart.
As d'r ferskate ûnderhâlders binne, dan soe de bêste oplossing wêze om yn prinsipe tagong ta it projekt te beheinen.
Gean nei projekt -> Ynstellings -> Algemien -> Sichtberens, projektfunksjes, tagongsrjochten en set Projektsichtberens yn op private.
Ik haw in iepenbier tagonklik projekt, om't ik myn eigen GitLab Runner brûke en allinich ik tagong haw om it repository te feroarjen. No, eins, it is net yn myn belangen om privee-ynformaasje te toanen yn iepenbiere pipeline-logs.
De regels foar it feroarjen fan de repository oanskerpe
Gean nei it projekt -> Ynstellings -> Repository -> Push Rules en set de Committer-beheining yn, Kontrolearje oft de auteur in GitLab-brûkersflaggen is. Ik advisearje ek it opsetten commit hântekening, en set de flagge Reject unsigned commits yn.
Folgjende moatte jo in trigger konfigurearje om taken te starten
Gean nei projekt -> Ynstellings -> CI / CD -> Pipeline-triggers en meitsje in nije trigger-token
Dit token kin fuortendaliks tafoege wurde oan 'e algemiene konfiguraasje fan fariabelen foar in groep projekten.
Gean nei groep -> Ynstellings -> CI / CD -> Fariabelen en foegje in fariabele ta DEPLOY_TOKEN mei trigger-token yn wearde.
Dizze seksje beskriuwt de konfiguraasje foar it útfieren fan taken by ynset mei jo eigen (Spesifike) en iepenbiere (Shared) runner.
Spesifike Runner
Ik brûk myn eigen rinners, om't it earst fan alles handich, rap en goedkeap is.
Foar in runner, Ik riede in Linux VDS mei 1 CPU, 2 GB RAM, 20 GB HDD. De útjeftepriis is ~3000₽ per jier.
Myn runner
Foar de runner Ik naam VDS 4 CPU, 4 GB RAM, 50 GB SSD. Kosten ~ 11000 ₽ en hie der noait spyt fan.
Ik haw yn totaal 7 masines. 5 op Aruba en 2 op ihor.
Sa hawwe wy in runner. No sille wy it konfigurearje.
Wy geane nei de masine fia SSH en ynstallearje java, git, maven, gnupg2.
Meitsje in map foar de maven-cache en jou groepsrjochten ta runner
Jo kinne dit punt oerslaan as jo net fan plan binne ferskate runners op ien masine te rinnen.
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!
Wy kontrolearje dat de rinner is registrearre. Gean nei de webside gitlab.com -> deploy-project -> Ynstellings -> CI/CD -> Runners -> Spesifike Runners -> Runners aktivearre foar dit projekt
Wy generearje in kaai troch fragen te beantwurdzjen. Ik brûkte myn eigen namme en e-post.
Soargje derfoar dat jo it wachtwurd foar de kaai opjaan. Artefakten sille wurde tekene mei dizze kaai.
gpg --gen-key
Kontrolearje
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
It opladen fan ús iepenbiere kaai nei de kaai tsjinner
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Meitsje in maven triemtafel repository en keppelje nei de cache (meitsje gjin flater)
Jo kinne dit punt oerslaan as jo net fan plan binne ferskate runners op ien masine te rinnen.
Foegje it .gitlab-ci.yml-bestân ta oan 'e root fan it ynsetprojekt
It skript presintearret twa ûnderling eksklusive ynsettaken. Spesifike Runner of Shared Runner respektivelik.
.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
Yn java-projekten dy't nei iepenbiere repositories moatte wurde uploade, moatte jo 2 stappen tafoegje om de ferzjes fan Release en Snapshot te downloaden.
.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}
Yn dizze oplossing gie ik in bytsje fierder en besleat ien CI-sjabloan te brûken foar java-projekten.
Yn details
Ik makke in apart projekt gitlab-ci wêryn ik pleatste in CI sjabloan foar java projekten common.yml.
As jo in multi-module projekt hawwe en jo hoege gjin spesifike module te uploaden nei it repository, dan moatte jo tafoegje nexus-staging-maven-plugin mei flagge skipNexusStagingDeployMojo
Nei it ynladen binne ferzjes fan snapshot/release beskikber yn staging repositories
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Mear pluses
In heul rike list mei doelen foar wurkjen mei it nexus repository (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automatyske frijlittingskontrôle foar uploaden nei maven sintraal
As in tag is ynstalleare, wurdt de korrespondearjende taak yn it ynsetprojekt automatysk aktivearre om de releaseferzje te downloaden nei nexus (foarbyld).
It bêste diel is dat tichtby frijlitting automatysk yn 'e nexus aktivearre wurdt.
[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] ------------------------------------------------------------------------
En as der wat mis giet, sil de taak definityf mislearje
[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] ------------------------------------------------------------------------
As gefolch hawwe wy mar ien kar oer. Wiskje dizze ferzje of publisearje it.
Nei frijlitting sille nei in skoft de artefakten binnen wêze
offtopic
It wie in ûntdekking foar my dat Maven oare iepenbiere repositories yndeksearret.
Ik moast robots.txt tafoegje om't it myn âlde repository yndeksearre.
In apart ynsetprojekt wêryn jo ferskate CI-taken kinne ymplementearje foar it uploaden fan artefakten nei iepenbiere repositories foar ferskate ûntwikkelingstalen.
It Deploy-projekt is isolearre fan ynterferinsje fan bûten en kin allinich feroare wurde troch brûkers mei de rollen Eigner en Maintainer.
In aparte Spesifike Runner mei in "hot" cache om allinich taken út te fieren.
Snapshot/release ferzjes publisearje yn in iepenbier repository.
Automatyske kontrôle fan 'e releaseferzje foar reeheid foar publikaasje yn Maven Central.
Beskerming tsjin automatyske publikaasje fan "rauwe" ferzjes yn maven sintraal.
Bouwe en publisearje snapshotferzjes "op klik".
In inkele repository foar it krijen fan snapshot/release ferzjes.
Algemiene pipeline foar it bouwen / testen / publisearjen fan in java-projekt.
It ynstellen fan GitLab CI is net sa yngewikkeld in ûnderwerp as it liket op it earste each. It is genôch om CI in pear kear op turn-key basis yn te stellen, en no binne jo fier fan in amateur yn dizze saak. Boppedat is GitLab-dokumintaasje heul oerstallich. Wês net bang om de earste stap te nimmen. De dyk ferskynt ûnder de stappen fan 'e persoan dy't rint (ik herinner my net wa't it sei :)
Ik sil bliid wêze om feedback te ûntfangen.
Yn it folgjende artikel sil ik prate oer hoe't jo GitLab CI konfigurearje om taken mei yntegraasjetests konkurrearjend út te fieren (de tsjinsten ûnder test útfiere mei docker-compose) as jo mar ien shell-runner hawwe.