Denna artikel riktar sig till java-utvecklare som har behov av att snabbt publicera sina produkter i repositorier som sonatype och/eller maven central med hjÀlp av GitLab. I denna artikel kommer jag att gÄ igenom instÀllningen av gitlab-runner, gitlab-ci och maven-plugin för att lösa detta problem.
FörutsÀttningar:
- SĂ€ker lagring av mvn och GPG-nycklar.
- SÀker körning av offentliga CI-uppgifter.
- Ladda upp artefakter (release/snapshot) till offentliga repositorier.
- Automatisk kontroll av release-versioner för publicering i maven central.
- Generell lösning för att ladda upp artefakter till repositoriet för flera projekt.
- Enkelhet och anvÀndarvÀnlighet.
InnehÄll
AllmÀn information
- En detaljerad beskrivning av mekanismen för publicering av artefakter i Maven Central via Sonatype OSS Repository Hosting Service har redan beskrivits i anvÀndaren , sÄ jag kommer att hÀnvisa till denna artikel vid behov.
- Registrera oss först pÄ och öppna ett Àrende för att skapa ett repositorium (lÀs mer i avsnittet ). Efter att repositoriet har skapats kommer inloggningsuppgifterna (anvÀndarnamn/lösenord) frÄn JIRA (senare Sonatype-kontot) att anvÀndas för att ladda upp artefakter till Sonatype nexus.
- Processen för att generera GPG-nyckeln beskrivs ganska kort. Se avsnittet
- Om du anvÀnder Linux-konsolen för att generera GPG-nyckeln (gnupg/gnupg2) mÄste du installera för att generera entropi. Annars kan nyckelgenereringen ta mycket lÄng tid.
- LagringstjÀnster offentliga GPG-nycklar
InstÀllning av deploy-projekt i GitLab
- Först och frĂ€mst mĂ„ste du skapa och konfigurera ett projekt dĂ€r pipelinen för att deploya artefakter kommer att lagras. Jag kallade mitt projekt enkelt och tydligt â
- Efter att ha skapat repositoriet mÄste du begrÀnsa Ätkomsten till att Àndra repositoriet.
GÄ till projektet -> InstÀllningar -> Repositorium -> Skyddade grenar. Ta bort alla regler och lÀgg till en enda regel med Wildcard * med rÀttighet att push och merge endast för anvÀndare med rollen Maintainers. Denna regel kommer att gÀlla för alla anvÀndare i bÄde detta projekt och den grupp som detta projekt tillhör.
- Om det finns flera maintainers, Àr det bÀsta att begrÀnsa Ätkomsten till projektet helt.
GÄ till projekt -> InstÀllningar -> AllmÀnt -> Synlighet, projekfunktioner, behörigheter och stÀll in Projektets synlighet till Private.
Mitt projekt Àr offentligt tillgÀngligt eftersom jag anvÀnder min egen GitLab Runner och endast jag har behörighet att Àndra i förvaret. Jag vill inte heller avslöja privat information i offentliga pipeline-loggar. - StrÀngare regler för att Àndra i förvaret
GÄ till projekt -> InstÀllningar -> Förvaring -> Push-regler och aktivera flaggorna Kommittentrestriktion, Kontrollera om författare Àr en GitLab-anvÀndare. Jag rekommenderar ocksÄ att konfigurera , och aktivera flaggan Avvisa osignerade commits. - DÀrefter behöver vi stÀlla in en trigger för att starta uppgifter
GÄ till projekt -> InstÀllningar -> CI / CD -> Pipeline-triggers och skapa en ny trigger-token
Denna token kan direkt lÀggas till i den gemensamma konfigurationen av variabler för projektgruppen.
GÄ till grupp -> InstÀllningar -> CI / CD -> Variabler och lÀgg till variabelnDEPLOY_TOKENmed trigger-token som vÀrde.
GitLab Runner
Detta avsnitt beskriver konfigurationen för att starta uppgifter för distribuerade med anvÀndning av egna (Specifika) och offentliga (Delade) runners.
Specifik Runner
Jag anvÀnder egna runners eftersom det frÀmst Àr bekvÀmt, snabbt och billigt.
För runner rekommenderar jag en Linux VDS med 1 CPU, 2 GB RAM, 20 GB HDD. Kostnaden Ă€r ungefĂ€r ~3000✠per Ă„r.
Min runner
För runner tog jag en VDS med 4 CPU, 4 GB RAM, 50 GB SSD. Kostnaden blev ~11000✠och jag har aldrig Ă„ngrat mig.
Jag har totalt 7 maskiner. 5 pÄ aruba och 2 pÄ ihor.
SĂ„, vi har en runner. Nu ska vi konfigurera den.
Logga in pÄ maskinen via SSH och installera java, git, maven, gnupg2.
Installerar gitlab runner
- Skapa en ny grupp
runnersudo groupadd runner - Skapa en katalog för maven-cache och ge gruppen rÀttigheter
runner
Detta steg kan hoppas över om du inte planerar att köra flera runners pÄ en och samma maskin.mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache - Skapa en anvÀndare
gitlab-deployeroch lÀgg till i gruppenrunneruseradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer - LÀgg till följande rad i filen
/etc/ssh/sshd_configAllowUsers root@* gitlab-deployer@127.0.0.1Starta om - systemctl restart sshd
sshd.StÀll in ett lösenord för anvÀndaren - (kan vara enkelt, dÄ det finns en begrÀnsning för localhost)
gitlab-deployerpasswd gitlab-deployerInstallerar GitLab Runner (Linux x86-64) - ĐŁŃŃĐ°ĐœĐ°ĐČлОĐČĐ°Đ”ĐŒ 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 - GÄ till gitlab.com -> deploy-project -> InstÀllningar -> CI/CD -> Runners -> Specifika Runners och kopiera registreringstoken
SkÀrm
- Registrera runner
gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml
Process
Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Körs i systemlÀge.
Var god ange gitlab-ci koordinator URL (t.ex. https://gitlab.com/):
https://gitlab.com/
Var god ange gitlab-ci token för denna runner:
REGISTRATION_TOKEN
Var god ange gitlab-ci beskrivning för denna runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Var god ange gitlab-ci taggar för denna runner (komma-separerade):
deply
Registrerar runner... lyckades runner=ZvKdjJhx
Var god ange exekveraren: docker-ssh, parallels, virtualbox, docker-ssh+maskin, kubernetes, docker, ssh, docker+maskin, shell:
shell
Runner registrerad framgÄngsrikt. Du kan börja anvÀnda den, men om den redan körs bör konfigurationen automatiskt laddas om!- Kontrollerar att runnern Àr registrerad. GÄ till gitlab.com -> deploy-project -> InstÀllningar -> CI/CD -> Runners -> Specifika Runners -> Runners aktiverade för detta projekt
SkÀrm
- LÀgg till separat tjÀnst
/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 - Startar tjÀnsten.
systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service - Kontrollerar att runnern körs.
Exempel
Generering av GPG-nycklar
- Logga in pÄ samma maskin via ssh under anvÀndaren
gitlab-deployer(detta Àr viktigt för att generera GPG-nyckeln)ssh gitlab-deployer@127.0.0.1 - Generera nyckeln genom att svara pÄ frÄgorna. Jag anvÀnde mitt eget namn och e-post.
Var noga med att ange lösenord för nyckeln. Denna nyckel kommer att anvÀndas för att signera artefakter.gpg --gen-key - Kontrollerar
gpg --list-keys -a /home/gitlab-deployer/.gnupg/pubring.gpg ---------------------------------------- pub 4096R/00000000 2019-04-19 uid Petruha Petrov sub 4096R/11111111 2019-04-19 - Ladda upp vÄr publika nyckel till nyckelservern
gpg --keyserver keys.gnupg.net --send-key 00000000 gpg: skickar nyckel 00000000 till hkp-servern keys.gnupg.net
InstÀllning av Maven
- Logga in under anvÀndaren
gitlab-deployersu gitlab-deployer - Skapa en maven-katalog repository och lÀnka med cache (kom ihÄg detta)
Detta steg kan hoppas över om du inte planerar att köra flera runners pÄ samma maskin.mkdir -p ~/.m2/repository ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository - Skapa en huvudnyckel
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Skapa filen ~/.m2/settings-security.xml
{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Kryptera lösenordet för Sonatype-kontot
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - Skapa filen ~/.[m2]/settings.xml
env true GPG_SECRET_KEY_PASSPHRASE sonatype SONATYPE_USERNAME {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
dÀr,
GPG_SECRET_KEY_PASSPHRASE â lösenordet för GPG-nyckeln
SONATYPE_USERNAME â inloggning för Sonatype-kontot
InstÀllningen av runner Àr nu klar, vi kan gÄ vidare till avsnittet
Delad Runner
Generering av GPG-nycklar
- Först mÄste vi skapa en GPG-nyckel. För detta installerar vi gnupg.
yum install -y gnupg - Generera nyckeln genom att svara pÄ frÄgorna. Jag anvÀnde mitt eget namn och e-post. Var noga med att ange ett lösenord för nyckeln.
gpg --gen-key - Visar information om nyckeln
gpg --list-keys -a pub rsa3072 2019-04-24 [SC] [expires: 2021-04-23] 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 uid [ultimate] tttemp sub rsa3072 2019-04-24 [E] [expires: none] - Ladda upp vÄr publika nyckel till nyckelservern
gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 gpg: skickar nyckel 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 till hkp-server keys.gnupg.net - Vi fÄr den privata nyckeln
gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 -----BEGIN PGP PRIVATE KEY BLOCK----- lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5 ... =2Wd2 -----END PGP PRIVATE KEY BLOCK----- - GÄ till projektinstÀllningar -> InstÀllningar -> CI / CD -> Variabler och spara den privata nyckeln i en variabel
GPG_SECRET_KEY
InstÀllning av Maven
- Skapa en huvudnyckel
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - GÄ till projektinstÀllningar -> InstÀllningar -> CI / CD -> Variabler och spara i en variabel
SETTINGS_SECURITY_XMLföljande rader:{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Kryptera lösenordet för Sonatype-kontot
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - GÄ till projektinstÀllningar -> InstÀllningar -> CI / CD -> Variabler och spara i en variabel
SETTINGS_XMLföljande rader:env true GPG_SECRET_KEY_PASSPHRASE sonatype sonatype_username {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
dÀr,
GPG_SECRET_KEY_PASSPHRASE â lösenordet för GPG-nyckeln
SONATYPE_USERNAME â inloggning för Sonatype-kontot
Deploy docker-bild
- Skapa en tillrÀckligt enkel Dockerfile för att köra uppgifter pÄ deploy med rÀtt version av Java. Nedan Àr ett exempel för alpine.
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]/ - Bygg containern för ditt projekt
docker build -t registry.gitlab.com/group/deploy . - Autentisera och ladda upp containern till registret.
docker login -u USER -p PASSWORD registry.gitlab.com docker push registry.gitlab.com/group/deploy
GitLab CI
Deploy-projekt
LĂ€gg till filen .gitlab-ci.yml i roten av deploy-projektet
I skriptet presenteras tvÄ ömsesidigt uteslutande uppgifter för distribution. Specific Runner eller Shared Runner beroende pÄ situation.
.gitlab-ci.yml
stages:
- deploy
Specific Runner:
extends: .java_deploy_template
# Uppgiften kommer att köras pÄ din shell-runner
tags:
- deploy
Shared Runner:
extends: .java_deploy_template
# Uppgiften kommer att köras pÄ en offentlig docker-runner
tags:
- docker
# Bild frÄn avsnittet GitLab Runner -> Shared Runner -> Docker
image: registry.gitlab.com/group/deploy-project:latest
before_script:
# Importera GPG-nyckel
- printf "${GPG_SECRET_KEY}" | gpg --batch --import
# Spara maven-konfiguration
- printf "${SETTINGS_SECURITY_XML}" > ~/ .m2/settings-security.xml
- printf "${SETTINGS_XML}" > ~/ .m2/settings.xml
.java_deploy_template:
stage: deploy
# Uppgiften aktiveras genom trigger om variabeln DEPLOY med vÀrdet java skickas
only:
variables:
- $DEPLOY == "java"
variables:
# inaktivera kloning av nuvarande projekt
GIT_STRATEGY: none
script:
# Ge möjlighet att lagra lösenordet i okrypterad form
- git config --global credential.helper store
# Spara temporÀra credentials för anvÀndaren gitlab-ci-token
# Tokenet fungerar för alla offentliga projekt pÄ gitlab.com och för gruppens projekt
- echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/ .git-credentials
# Rensa nuvarande katalog helt
- rm -rf .* *
# Klona projektet som ska distribueras till Sonatype Nexus
- git clone ${DEPLOY_CI_REPOSITORY_URL} .
# Byt till rÀtt commit
- git checkout ${DEPLOY_CI_COMMIT_SHA} -f
# Om nÄgon pom.xml innehÄller parametern autoReleaseAfterClose, avbryt byggnationen.
# Annars finns det risk att ladda upp rÄa artefakter till maven central
- >
for pom in $(find . -name pom.xml); do
if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
echo "Fil $pom innehÄller förbjuden instÀllning: ";
exit 1;
fi;
done
# Om parametern DEPLOY_CI_COMMIT_TAG Àr tom, sÀtts SNAPSHOT-versionen tvÄngsmÀssigt
- >
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
# Kör uppgiften för att bygga och distribuera artefakter
- mvn clean deploy -DskipTests=trueJava-projekt
I java-projekt som avser att laddas upp till offentliga förrÄd behöver tvÄ steg lÀggas till för att ladda upp Release och Snapshot-versioner.
.gitlab-ci.yml
steg:
- bygg
- testa
- verifiera
- distribuera
SlÀpp:
utökar: .trigger_deploy
# Kör jobben endast p taggen.
endast:
- taggar
Snapshot:
utökar: .trigger_deploy
# Kör jobbet för att publicera SNAPSHOT-version manuellt
nÀr: manuellt
# Kör inte jobbet om en tagg har satts.
förutom:
- taggar
.trigger_deploy:
steg: distribuera
variabler:
# Inaktiverar kloning av det aktuella projektet
GIT_STRATEGY: none
# LÀnk till trigger för deploy-jobbet
URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
# Variabler för deploy-jobbet
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:
# AnvÀnder inte cURL, eftersom flaggorna --fail --show-error
# inte visar svarskroppen om HTTP-koden Àr 400 och uppÄt
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}I den hÀr lösningen har jag gÄtt lite lÀngre och beslutat att anvÀnda en CI-mall för java-projekt.
Mer i detalj
Jag skapade ett separat projekt dÀr jag placerade CI-mallen för java-projekt .
common.yml
steg:
- bygg
- testa
- verifiera
- distribuera
variabler:
SONAR_ARGS: "
-Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA}
-Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME}
"
.build_java_project:
steg: bygg
taggar:
- touchbit-shell
variabler:
SKIP_TEST: "false"
script:
- mvn clean
- mvn package -DskipTests=${SKIP_TEST}
artefakter:
nÀr: alltid
gÄ ut om: 30 dagar
vÀgar:
- "*\/target\/reports"
.build_sphinx_doc:
steg: bygg
taggar:
- touchbit-shell
variabler:
DOCKERFILE: .indirect\/docs\/Dockerfile
script:
- docker build --no-cache -t ${CI_PROJECT_NAME}\/doc -f ${DOCKERFILE} .
.junit_module_test_run:
steg: testa
taggar:
- touchbit-shell
variabler:
MODULE: ""
script:
- cd ${MODULE}
- mvn test
artefakter:
nÀr: alltid
gÄ ut om: 30 dagar
vÀgar:
- "*\/target\/reports"
.junit_test_run:
steg: testa
taggar:
- touchbit-shell
script:
- mvn test
artefakter:
nÀr: alltid
gÄ ut om: 30 dagar
vÀgar:
- "*\/target\/reports"
.sonar_review:
steg: verifiera
taggar:
- touchbit-shell
beroenden: []
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:
steg: distribuera
taggar:
- touchbit-shell
variabler:
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:
utökar: .trigger_deploy
endast:
- taggar
.trigger_snapshot_deploy:
utökar: .trigger_deploy
nÀr: manuellt
förutom:
- taggar
Som följd ser .gitlab-ci.yml i sjÀlva java-projekten ganska kompakt och koncist ut
.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_deployKonfiguration av pom.xml
Detta Àmne beskrivs mycket detaljerat pÄ , sÄ jag kommer att beskriva nÄgra nyanser kring anvÀndningen av plugins. Jag kommer ocksÄ att beskriva hur enkelt och obehagligt det kan vara att anvÀnda nexus-staging-maven-plugin, om du inte vill eller inte kan anvÀnda org.sonatype.oss:oss-parent som förÀlder för ditt projekt.
maven-install-plugin
Installerar moduler i det lokala arkivet.
Mycket anvÀndbart för lokal testning av lösningar i andra projekt samt för kontrollsummor.
org.apache.maven.plugins
maven-install-plugin
install-project
install
target/${project.artifactId}-${project.version}.jar
target/${project.artifactId}-${project.version}-sources.jar
dependency-reduced-pom.xml
true
truemaven-javadoc-plugin
Generering av javadoc för projektet.
org.apache.maven.plugins
maven-javadoc-plugin
jar
prepare-package
true
true
falseOm du har en modul som inte innehÄller java (till exempel endast resurser)
Eller om du om överhuvudtaget inte vill generera javadoc, sÄ finns det hjÀlp maven-jar-plugin
org.apache.maven.plugins
maven-jar-plugin
empty-javadoc-jar
generate-resources
jar
javadoc
${basedir}/javadocmaven-gpg-plugin
org.apache.maven.plugins
maven-gpg-plugin
sign-artifacts
deploy
signnexus-staging-maven-plugin
Konfiguration:
org.sonatype.plugins
nexus-staging-maven-plugin
org.sonatype.plugins
nexus-staging-maven-plugin
true
sonatype
https://oss.sonatype.org/
true
org.apache.maven.plugins
maven-deploy-plugin
true
sonatype
Nexus Snapshot Repository
https://oss.sonatype.org/content/repositories/snapshots/
sonatype
Nexus Release Repository
https://oss.sonatype.org/service/local/staging/deploy/maven2/Om du har ett flermodulsprojekt och inte behöver ladda upp en viss modul till arkivet, mÄste du lÀgga till nexus-staging-maven-plugin med flaggan skipNexusStagingDeployMojo
org.sonatype.plugins
nexus-staging-maven-plugin
trueEfter att ha laddat upp snapshot/release-versionerna Àr de tillgÀngliga i
SonatypeNexus
https://oss.sonatype.org/content/groups/staging/
Fler fördelar
- En mycket omfattande lista över mÄl för arbete med nexus-repositoryt (
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin). - Automatisk kontroll av release för möjligheten att ladda upp till maven central
Resultat
Publicering av SNAPSHOT-version
Under byggprocessen finns det möjlighet att manuellt starta uppgiften för att ladda upp SNAPSHOT-version till nexus
Vid körning av denna uppgift triggas den motsvarande uppgiften i deploy-projektet ().
Beskuret log
Körning med gitlab-runner 11.10.0 (3001a600)
pÄ Deploy runner JSKWyxUw
AnvÀnder Shell-exekverare...
Körning pÄ ih1174328.vds.myihor.ru...
Hoppar över Git-förvarande instÀllning
Hoppar över Git-checkout
Hoppar över instÀllning av Git-undermoduler
$ 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} .
Klonar in i 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Obs: checkar ut '850f86aa317194395c5387790da1350e437125a7'.
Du Àr i 'detached HEAD'-lÀge. Du kan titta runt, göra experimentella
Àndringar och göra dessa, och du kan kassera alla commits du gör i detta
lÀge utan att pÄverka nÄgra grenar genom att utföra en annan checkout.
Om du vill skapa en ny gren för att behÄlla commits du skapar, kan du
göra sÄ (nu eller senare) genom att anvÀnda -b med checkout-kommandot igen. Exempel:
git checkout -b new_branch_name
HEAD Àr nu pÄ 850f86a... hoppa över deploy test-core
$ för pom i $(find . -name pom.xml); do # ihopslagen flera-radskommand
$ om [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; dÄ # ihopslagen flera-radskommand
[INFO] Skannar efter projekt...
[INFO] Inspekterar bygg med totalt 4 moduler...
[INFO] Installerar Nexus Staging-funktioner:
[INFO] ... totalt 4 körningar av maven-deploy-plugin ersattes med nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reaktors byggordning:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Shields4J klient [jar]
[INFO] TestNG lyssnare [jar]
[INFO]
[INFO] -----------------------------
[INFO] Bygger Shields4J 1.0.0 [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Söker efter lokal aggregatrot...
[INFO] Lokal aggregatrot: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Bearbetar Àndring av org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Bearbetar org.touchbit.shields4j:shields4j-parent
[INFO] Uppdaterar projekt org.touchbit.shields4j:shields4j-parent
[INFO] frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO]
[INFO] Bearbetar org.touchbit.shields4j:client
[INFO] Uppdaterar förÀlder org.touchbit.shields4j:shields4j-parent
[INFO] frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO] Uppdaterar beroendet org.touchbit.shields4j:test-core
[INFO] frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO]
[INFO] Bearbetar org.touchbit.shields4j:test-core
[INFO] Uppdaterar förÀlder org.touchbit.shields4j:shields4j-parent
[INFO] frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO]
[INFO] Bearbetar org.touchbit.shields4j:testng
[INFO] Uppdaterar förÀlder org.touchbit.shields4j:shields4j-parent
[INFO] frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO] Uppdaterar beroendet org.touchbit.shields4j:client
[INFO] frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO] Uppdaterar beroendet org.touchbit.shields4j:test-core
[INFO] frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reaktors sammanfattning:
[INFO]
[INFO] Shields4J 1.0.0 .................................... LYCKADES [ 0.992 s]
[INFO] test-core .......................................... HOPPADES
[INFO] Shields4J klient ................................... HOPPADES
[INFO] TestNG lyssnare 1.0.0 .............................. HOPPADES
[INFO] ------------------------------------------------------------------------
[INFO] BYGG LYCKADES
[INFO] ------------------------------------------------------------------------
[INFO] Total tid: 2.483 s
[INFO] Avslutad vid: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Skannar efter projekt...
[INFO] Inspekterar bygg med totalt 4 moduler...
[INFO] Installerar Nexus Staging-funktioner:
[INFO] ... totalt 4 körningar av maven-deploy-plugin ersattes med nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reaktors byggordning:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Shields4J klient [jar]
[INFO] TestNG lyssnare [jar]
[INFO]
[INFO] -----------------------------
[INFO] Bygger Shields4J 1.0.0-SNAPSHOT [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO] * Bulkdeploy av lokalt insamlade snapshot-artiklar avslutat.
[INFO] FjÀrrdeploy avslutades med framgÄng.
[INFO] ------------------------------------------------------------------------
[INFO] Reaktors sammanfattning:
[INFO]
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... LYCKADES [ 2.375 s]
[INFO] test-core .......................................... LYCKADES [ 3.929 s]
[INFO] Shields4J klient ................................... LYCKADES [ 3.815 s]
[INFO] TestNG lyssnare 1.0.0-SNAPSHOT ..................... LYCKADES [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BYGG LYCKADES
[INFO] ------------------------------------------------------------------------
[INFO] Total tid: 47.629 s
[INFO] Avslutad vid: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------Som följd laddades en version upp till nexus .
Alla snapshot-versioner kan tas bort frÄn lagret pÄ webbplatsen med ditt konto.
Publicering av release-version
NÀr taggen installeras triggas automatiskt motsvarande uppgift i deploy-projektet för att ladda upp release-versionen till nexus ().
Det mest behagliga Àr att close release automatiskt aktiveras i nexus.
[INFO] Utför fjÀrrstaging...
[INFO]
[INFO] * FjÀrrstaging till staging-profil ID "9043b43f77dcc9"
[INFO] * St staging-repository med ID "orgtouchbit-1037".
[INFO] * St staging-repository pÄ https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Laddar upp lokalt stageade artefakter till profil org.touchbit
[INFO] * Uppladdning av lokalt stageade artefakter Àr avslutad.
[INFO] * StÀnger staging-repository med ID "orgtouchbit-1037".
VÀntar pÄ att operationen ska slutföras...
.........
[INFO] FjÀrrstageade 1 repositories, avslutad med framgÄng.
[INFO] ------------------------------------------------------------------------
[INFO] Resumé:
[INFO]
[INFO] Shields4J 1.0.0 .................................... FRAMGĂ
NG [ 9.603 s]
[INFO] test-core .......................................... FRAMGĂ
NG [ 3.419 s]
[INFO] Shields4J-klient ................................... FRAMGĂ
NG [ 9.793 s]
[INFO] TestNG-lyssnare 1.0.0 .............................. FRAMGĂ
NG [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BYGG FRAMGĂ
NG
[INFO] ------------------------------------------------------------------------
[INFO] Total tid: 01:47 min
[INFO] Avslutad at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------Och om nÄgot gÄr fel, kommer uppgiften definitivt att misslyckas
[INFO] Utför fjÀrrstaging...
[INFO]
[INFO] * FjÀrrstaging in i stagingprofil ID "9043b43f77dcc9"
[INFO] * Skapade stagingrepository med ID "orgtouchbit-1038".
[INFO] * Stagingrepository pÄ https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Laddar upp lokalt stÀllda artefakter till profil org.touchbit
[INFO] * Uppladdning av lokalt stÀllda artefakter avslutad.
[INFO] * StÀnger stagingrepository med ID "orgtouchbit-1038".
VÀntar pÄ att operationen ska avslutas...
.......
[ERROR] Regler för felaktig stÀngning av stagingrepository med ID "orgtouchbit-1039".
[ERROR]
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR]
[ERROR] Repository "orgtouchbit-1039" fel
[ERROR] Regel "signature-staging" fel
[ERROR] * Ingen offentlig nyckel: Nyckel med id: (1f42b618d1cbe1b5) kunde inte hittas pÄ http://keys.gnupg.net:11371/. Ladda upp din offentliga nyckel och försök operationen igen.
...
[ERROR] StÀdning av lokal stagekatalog efter en regelmisslyckande under stÀngning av stagingrepositories: [orgtouchbit-1039]
[ERROR] * Tar bort kontext 9043b43f77dcc9.properties
[ERROR] StÀdning av avlÀgsna stagerepositories efter en regelmisslyckande under stÀngning av stagingrepositories: [orgtouchbit-1039]
[ERROR] * Tar bort misslyckat stagingrepository med ID "orgtouchbit-1039" (Regelmisslyckande under stÀngning av stagingrepositories: [orgtouchbit-1039]).
[ERROR] FjÀrrstaging avslutad med ett fel: Regelmisslyckande vid staging!
[INFO] ------------------------------------------------------------------------
[INFO] Reaktorsammanfattning:
[INFO]
[INFO] Shields4J 1.0.0 .................................... LYCKAT [ 4.073 s]
[INFO] test-core .......................................... LYCKAT [ 2.788 s]
[INFO] Shields4J-klient ................................... LYCKAT [ 3.962 s]
[INFO] TestNG-lyssnare 1.0.0 .............................. MISSLYCKAT [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BYGGMISSLYCKANDE
[INFO] ------------------------------------------------------------------------Som resultat har vi bara ett alternativ kvar. Antingen ta bort den hÀr versionen eller publicera den.
Efter utgivningen kommer artefakterna att finnas i
off-topic
För mig var det en ögonöppnare att maven indexerar andra offentliga repositories.
Jag fick lÀgga till robots.txt, eftersom den indexerade mitt gamla repository.
Slutsats
Vad har vi?
- Ett separat deploy-projekt dÀr flera CI-uppgifter kan genomföras för att ladda upp artefakter till offentliga repositories för olika utvecklingssprÄk.
- Deploy-projektet Ă€r isolerat frĂ„n extern pĂ„verkan och kan endast Ă€ndras av anvĂ€ndare med rollen Ăgare och UnderhĂ„llare.
- En separat Specific Runner med "varm" cache för att endast köra deploy-uppgifter.
- Publicering av snapshot/release-versioner i offentligt repository.
- Automatisk kontroll av release-versionens beredskap för publicering i maven central.
- Skydd mot automatisk publicering av "rÄa" versioner i maven central.
- Bygg och publicera snapshot-versioner "med ett klick".
- Ett enhetligt repository för att fÄ snapshot/release-versioner.
- Den totala pipeline för byggande/testning/publicering av ett Java-projekt.
Att konfigurera GitLab CI Ă€r inte sĂ„ svĂ„rt som det verkar vid första anblicken. Det rĂ€cker med att stĂ€lla in CI "nyckelfĂ€rdigt" ett par gĂ„nger, och dĂ„ Ă€r du redan lĂ„ngt ifrĂ„n att vara nybörjare pĂ„ detta omrĂ„de. Dessutom Ă€r dokumentationen för GitLab ganska omfattande. Tveka inte att ta det första steget. VĂ€gen uppstĂ„r under den som gĂ„r (jag minns inte vem som sa det đ ).
Jag ser fram emot feedback.
I nÀsta artikel kommer jag att berÀtta om hur man konfigurerar GitLab CI för att köra uppgifter parallellt med integreringstester (med start av testade tjÀnster med hjÀlp av docker-compose), om du bara har en shell-runner.
KĂ€lla: habr.com
