ProHoster > blogg > administration > Konfigurera GitLab CI för att ladda upp ett java-projekt till maven central
Konfigurera GitLab CI för att ladda upp ett java-projekt till maven central
Den här artikeln är avsedd för java-utvecklare som snabbt behöver publicera sina produkter till sonatype och/eller maven centrala repositories med GitLab. I den här artikeln kommer jag att prata om att ställa in gitlab-runner, gitlab-ci och maven-plugin för att lösa detta problem.
Förkunskaper:
Säker förvaring av mvn- och GPG-nycklar.
Säkert utförande av offentliga CI-uppgifter.
Ladda upp artefakter (release/snapshot) till offentliga arkiv.
Automatisk kontroll av releaseversioner för publicering i maven central.
En generell lösning för att ladda upp artefakter till ett arkiv för flera projekt.
En detaljerad beskrivning av mekanismen för att publicera artefakter till Maven Central via Sonatype OSS Repository Hosting Service beskrivs redan i Denna artikel användare googolplex, så jag kommer att hänvisa till den här artikeln på rätt ställen.
Föranmälan kl Sonatyp JIRA och starta en biljett för att öppna förvaret (för mer information, läs avsnittet Skapa en Sonatype JIRA-biljett). Efter att ha öppnat förvaret kommer JIRA-inloggning/lösenordsparet (hädanefter kallat Sonatype-kontot) att användas för att ladda upp artefakter till Sonatype-nexusen.
Om du använder Linux-konsolen för att generera en GPG-nyckel (gnupg/gnupg2), måste du installera rng-tools för att generera entropi. Annars kan nyckelgenerering ta mycket lång tid.
Först och främst måste du skapa och konfigurera ett projekt där pipelinen kommer att lagras för distribution av artefakter. Jag kallade mitt projekt enkelt och okomplicerat - distribuera
Efter att ha skapat arkivet måste du begränsa åtkomsten för att ändra arkivet.
Gå till projektet -> Inställningar -> Förvar -> Skyddade grenar. Vi tar bort alla regler och lägger till en enda regel med Wildcard * med rätt att pusha och slå samman endast för användare med rollen Maintainers. Den här regeln kommer att fungera för alla användare av både detta projekt och gruppen som det här projektet tillhör.
Om det finns flera underhållare skulle den bästa lösningen vara att begränsa tillgången till projektet i princip.
Gå till projektet -> Inställningar -> Allmänt -> Synlighet, projektfunktioner, behörigheter och ställ in Projektsynlighet till Privat.
Jag har ett projekt i offentlig tillgång, eftersom jag använder min egen GitLab Runner och bara jag har tillgång till att modifiera arkivet. Tja, faktiskt ligger det inte i mitt intresse att visa privat information i offentliga pipelineloggar.
Skärpning av reglerna för ändring av förvaret
Gå till projektet -> Inställningar -> Repository -> Push-regler och ställ in flaggorna Committer-begränsning, Kontrollera om författaren är en GitLab-användare. Jag rekommenderar också inställning begå undertecknande, och ställ in flaggan Reject unsigned commits.
Därefter måste du konfigurera en utlösare för att köra uppgifter
Gå till projekt -> Inställningar -> CI / CD -> Pipeline triggers och skapa en ny trigger-token
Denna token kan omedelbart läggas till den allmänna konfigurationen av variabler för en grupp av projekt.
Gå till gruppen -> Inställningar -> CI / CD -> Variabler och lägg till en variabel DEPLOY_TOKEN med trigger-token i värdet.
Det här avsnittet beskriver konfigurationen för att köra uppgifter vid distribution med den inbyggda (specifika) och offentliga (Delade) löparen.
Specifik löpare
Jag använder mina egna löpare, eftersom det först och främst är bekvämt, snabbt, billigt.
För löpare rekommenderar jag Linux VDS med 1 CPU, 2 GB RAM, 20 GB hårddisk. Emissionspris ~ 3000 ₽ per år.
Min löpare
För löparen tog jag VDS 4 CPU, 4 GB RAM, 50 GB SSD. Det kostade ~11000₽ och ångrade det aldrig.
Jag har totalt 7 maskiner. 5 på aruba och 2 på ihor.
Så vi har en löpare. Nu ska vi ställa in det.
Vi går till maskinen via SSH och installerar java, git, maven, gnupg2.
Skapa en katalog för maven-cachen och tilldela grupprättigheter runner
Du kan hoppa över det här steget om du inte planerar att köra flera löpare på samma 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!
Kontrollera att löparen är registrerad. Gå till gitlab.com -> deploy-project -> Inställningar -> CI/CD -> Löpare -> Specifika löpare -> Löpare aktiverade för detta projekt
Skärm
Lägger till separat tjänsten /etc/systemd/system/gitlab-deployer.service
Vi skapar en nyckel genom att svara på frågor. Jag använde mitt eget namn och e-postadress.
Var noga med att ange lösenordet för nyckeln. Artefakter kommer att signeras med denna nyckel.
gpg --gen-key
Kontroll
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
Laddar upp vår publika nyckel till nyckelservern
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Skapa en Maven-katalog Repository och länka till cachen (gör inga misstag)
Detta steg kan hoppas över om du inte planerar att köra flera löpare på samma maskin.
Lägg till filen .gitlab-ci.yml till roten av distributionsprojektet
Skriptet presenterar två ömsesidigt uteslutande distributionsuppgifter. Specifik löpare respektive delad löpare.
.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
<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>
Om du har en modul som inte innehåller java (till exempel bara resurser)
Eller så vill du inte generera javadoc i princip, då för att hjälpa till maven-jar-plugin
Om du har ett flermodulsprojekt och du inte behöver ladda upp en specifik modul till förvaret, måste du lägga till i pom.xml för denna modul nexus-staging-maven-plugin med flagga skipNexusStagingDeployMojo
Efter uppladdning av ögonblicksbild/släpp versioner är tillgängliga i iscensättande förråd
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Fler plus
En mycket rik lista med mål för att arbeta med nexus-förvaret (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automatisk releasekontroll för nedladdningsbarhet i maven central
När taggen är inställd utlöses motsvarande uppgift i distributionsprojektet automatiskt för att ladda upp releaseversionen till nexus (exempel).
Det bästa är att close release automatiskt utlöses 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] ------------------------------------------------------------------------
Och om något gick fel, kommer uppgiften att misslyckas
[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 ett resultat har vi bara ett val. Eller ta bort den här versionen eller publicera.
Efter utgivningen, efter en tid, kommer artefakterna att vara in
orelevant
Det var en uppenbarelse för mig att Maven indexerar andra offentliga arkiv.
Jag var tvungen att ladda upp robots.txt eftersom det indexerade mitt gamla arkiv.
Ett separat distributionsprojekt där du kan implementera flera CI-uppgifter för att ladda upp artefakter till offentliga arkiv för olika utvecklingsspråk.
Implementeringsprojektet är isolerat från yttre störningar och kan endast ändras av användare med rollerna Ägare och Underhållare.
En separat Specifik Runner med en "het" cache för att endast köra distributionsuppgifter.
Publicering av ögonblicksbild/releaseversioner i ett offentligt arkiv.
Automatisk kontroll av releaseversionen för beredskap för publicering i maven central.
Skydd mot automatisk publicering av "rå" versioner i maven central.
Bygg och publicera ögonblicksbildversioner "vid klick".
Enstaka förråd för att få ögonblicksbild/releaseversioner.
Allmän pipeline för att bygga / testa / publicera ett java-projekt.
Att ställa in GitLab CI är inte ett så komplicerat ämne som det verkar vid första anblicken. Det räcker med att ställa in CI på nyckelfärdig basis ett par gånger, och nu är du långt ifrån en amatör i den här frågan. Dessutom är GitLab-dokumentationen mycket överflödig. Var inte rädd för att ta första steget. Vägen dyker upp under trappan på den som går (jag kommer inte ihåg vem som sa det :)
Jag kommer gärna med feedback.
I nästa artikel kommer jag att visa dig hur du ställer in GitLab CI för att köra integrationstestuppgifter konkurrenskraftigt (kör testtjänster med docker-compose) om du bara har en skallöpare.