ProHoster > Log > administrasjon > Sette opp GitLab CI for å laste opp et java-prosjekt til maven central
Sette opp GitLab CI for å laste opp et java-prosjekt til maven central
Denne artikkelen er ment for java-utviklere som har behov for å raskt publisere produktene sine i sonatype og/eller maven sentrale repositories ved hjelp av GitLab. I denne artikkelen vil jeg snakke om å sette opp gitlab-runner, gitlab-ci og maven-plugin for å løse dette problemet.
Forutsetninger:
Sikker lagring av mvn- og GPG-nøkler.
Sikker utførelse av offentlige CI-oppgaver.
Opplasting av artefakter (utgivelse/øyeblikksbilde) til offentlige depoter.
Automatisk kontroll av utgivelsesversjoner for publisering i maven sentral.
En generell løsning for å laste opp artefakter til et depot for flere prosjekter.
En detaljert beskrivelse av mekanismen for publisering av artefakter i Maven Central via Sonatype OSS Repository Hosting Service er allerede beskrevet i denne artikkelen bruker googolplex, så jeg vil referere til denne artikkelen på de riktige stedene.
Forhåndsregistrer deg for Sonatype JIRA og åpne en billett for å åpne depotet (les delen for flere detaljer Lag en billett på Sonatype JIRA). Etter å ha åpnet depotet, vil påloggings-/passordparet fra JIRA (heretter referert til som Sonatype-kontoen) brukes til å laste opp artefakter til Sonatype-nexus.
Hvis du bruker Linux-konsollen til å generere en GPG-nøkkel (gnupg/gnupg2), må du installere RNG-verktøy å generere entropi. Ellers kan nøkkelgenerering ta svært lang tid.
Først av alt må du opprette og konfigurere et prosjekt der rørledningen vil bli lagret for distribusjon av artefakter. Jeg kalte prosjektet mitt enkelt og ukomplisert - utplassere
Etter å ha opprettet depotet, må du begrense tilgangen for å endre depotet.
Gå til prosjekt -> Innstillinger -> Depot -> Beskyttede grener. Vi sletter alle regler og legger til en enkelt regel med Wildcard * med rett til å push og flette kun for brukere med Maintainers-rollen. Denne regelen vil fungere for alle brukere av både dette prosjektet og gruppen som dette prosjektet tilhører.
Hvis det er flere vedlikeholdere, vil den beste løsningen være å begrense tilgangen til prosjektet i prinsippet.
Gå til prosjekt -> Innstillinger -> Generelt -> Synlighet, prosjektfunksjoner, tillatelser og sett Prosjektsynlighet til Privat.
Jeg har et offentlig tilgjengelig prosjekt, siden jeg bruker min egen GitLab Runner og bare jeg har tilgang til å endre depotet. Vel, faktisk er det ikke i min interesse å vise privat informasjon i offentlige rørledningslogger.
Innstramming av reglene for endring av depot
Gå til prosjektet -> Innstillinger -> Repository -> Push Rules og sett Committer-begrensningen, Sjekk om forfatteren er et GitLab-brukerflagg. Jeg anbefaler også å sette opp forplikte signatur, og sett flagget Reject unsigned commits.
Deretter må du konfigurere en utløser for å starte oppgaver
Gå til prosjekt -> Innstillinger -> CI / CD -> Pipeline-utløsere og opprett et nytt trigger-token
Dette tokenet kan umiddelbart legges til den generelle konfigurasjonen av variabler for en gruppe prosjekter.
Gå til gruppe -> Innstillinger -> CI / CD -> Variabler og legg til en variabel DEPLOY_TOKEN med trigger-token i verdi.
Denne delen beskriver konfigurasjonen for å kjøre oppgaver ved distribusjon med din egen (spesifikke) og offentlige (delte) løper.
Spesifikk løper
Jeg bruker mine egne løpere fordi det først og fremst er praktisk, raskt og billig.
For en løper anbefaler jeg en Linux VDS med 1 CPU, 2 GB RAM, 20 GB HDD. Emisjonskursen er ~3000 ₽ per år.
Min løper
For løperen tok jeg VDS 4 CPU, 4 GB RAM, 50 GB SSD. Kostet ~11000 XNUMX ₽ og angret aldri.
Jeg har totalt 7 maskiner. 5 på aruba og 2 på ihor.
Så vi har en løper. Nå skal vi konfigurere det.
Vi går til maskinen via SSH og installerer java, git, maven, gnupg2.
Opprett en katalog for maven-cachen og tildel gruppetillatelser runner
Du kan hoppe over dette punktet hvis du ikke planlegger å kjøre flere løpere på en maskin.
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!
Vi sjekker at løperen er påmeldt. Gå til nettstedet gitlab.com -> deploy-project -> Innstillinger -> CI/CD -> Løpere -> Spesifikke løpere -> Løpere aktivert for dette prosjektet
Skjerm
legge separat tjeneste /etc/systemd/system/gitlab-deployer.service
Vi genererer en nøkkel ved å svare på spørsmål. Jeg brukte mitt eget navn og e-post.
Sørg for å spesifisere passordet for nøkkelen. Artefakter vil bli signert med denne nøkkelen.
gpg --gen-key
Sjekker
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
Laster opp vår offentlige nøkkel til nøkkelserveren
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Lag en maven-katalog Repository og lenke til cachen (ikke ta feil)
Du kan hoppe over dette punktet hvis du ikke planlegger å kjøre flere løpere på en maskin.
Legg til .gitlab-ci.yml-filen til roten av distribusjonsprosjektet
Skriptet presenterer to gjensidig utelukkende distribusjonsoppgaver. henholdsvis spesifikk løper eller delt løper.
.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
Hvis du har et flermodulprosjekt og du ikke trenger å laste opp en spesifikk modul til depotet, må du legge til nexus-staging-maven-plugin med flagg skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Flere plusser
En veldig rik liste over mål for å jobbe med nexus-depotet (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automatisk utgivelsessjekk for opplasting til maven central
Når en tag er installert, utløses den tilsvarende oppgaven i distribusjonsprosjektet automatisk for å laste ned utgivelsesversjonen til nexus (eksempel).
Det beste er at lukkefrigjøring utløses automatisk i 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] ------------------------------------------------------------------------
Og hvis noe går galt, vil oppgaven definitivt mislykkes
[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] ------------------------------------------------------------------------
Som et resultat står vi igjen med bare ett valg. Enten slett denne versjonen eller publiser den.
Etter utgivelsen, etter en tid vil gjenstandene være inne
offtopic
Det var en oppdagelse for meg at Maven indekserer andre offentlige depoter.
Jeg måtte legge til robots.txt fordi det indekserte det gamle depotet mitt.
Et eget distribusjonsprosjekt der du kan implementere flere CI-oppgaver for å laste opp artefakter til offentlige depoter for ulike utviklingsspråk.
Deploy-prosjektet er isolert fra forstyrrelser utenfor og kan bare endres av brukere med rollene eier og vedlikeholder.
En separat spesifikk løper med en "hot" cache for å kjøre bare distribusjonsoppgaver.
Publisering av øyeblikksbilde/utgivelsesversjoner i et offentlig depot.
Automatisk sjekk av utgivelsesversjonen for beredskap for publisering i maven sentral.
Beskyttelse mot automatisk publisering av "rå" versjoner i maven central.
Bygg og publiser øyeblikksbildeversjoner "ved klikk".
Et enkelt depot for å skaffe øyeblikksbilde/utgivelsesversjoner.
Generell pipeline for å bygge/teste/publisere et java-prosjekt.
Å sette opp GitLab CI er ikke et så komplisert emne som det ser ut ved første øyekast. Det er nok å sette opp CI på nøkkelferdig basis et par ganger, og nå er du langt fra en amatør i denne saken. Dessuten er GitLab-dokumentasjon veldig overflødig. Ikke vær redd for å ta det første skrittet. Veien dukker opp under trinnene til personen som går (jeg husker ikke hvem som sa det :)
Jeg vil gjerne motta tilbakemeldinger.
I den neste artikkelen skal jeg snakke om hvordan du konfigurerer GitLab CI til å kjøre oppgaver med integrasjonstester konkurransedyktig (kjøre tjenestene som testes ved hjelp av docker-compose) hvis du bare har en shell-løper.