Ky artikull është i destinuar për zhvilluesit java, të cilët kanë nevojë të publikojnë shpejt produktet e tyre në depozitë sonatype dhe/ose Maven Central duke përdorur GitLab. Në këtë artikull do të flas për konfigurimin e gitlab-runner, gitlab-ci dhe maven-plugin për zgjidhjen e këtij problemi.
Parakushtet:
- Ruajtja e sigurt e mvn dhe çelësave GPG.
- Kryerja e sigurt e detyrave publike të CI.
- Ngarkimi i artefakteve (release/snapshot) në depozita publike.
- Kontrolli automatike i versioneve release për publikim në Maven Central.
- Një zgjidhje e përgjithshme për ngarkimin e artefakteve në depozitë për disa projekte.
- Thjeshtësia dhe lehtësia e përdorimit.
Përmbajtja
Informacion i përgjithshëm
- Për një përshkrim të detajuar të mekanizmit të publikimit të artefakteve në Maven Central përmes Shërbimit të Hosting të Depozitave OSS të Sonatype është përshkruar tashmë në përdoruesit , kështu që në vendet e nevojshme do të referohem në këtë artikull.
- Para se të regjistrohemi në dhe të hapim një tiket për krijimin e depozitës (lexoni seksionin për më shumë detaje ). Pasi të hapet depozita, çifti login/fjalëkalim nga JIRA (më pas llogaria Sonatype) do të përdoret për ngarkimin e artefakteve në Sonatype nexus.
- Më tej, procesi i gjenerimit të çelësit GPG është përshkruar në një mënyrë shumë të thjeshtë. Shihni seksionin për më shumë detaje
- Nëse përdorni konsolën Linux për të gjeneruar çelësin GPG (gnupg/gnupg2), duhet të instaloni për të gjeneruar entropinë. Në të kundërt, gjenerimi i çelësit mund të zgjasë shumë.
- Shërbimet e ruajtjes publike të çelësave GPG
Konfigurimi i projektit deploy në GitLab
- SĂ« pari, duhet tĂ« krijoni dhe konfiguroni njĂ« projekt, nĂ« tĂ« cilin do tĂ« ruhet pipeline pĂ«r deployimin e artefakteve. Projekti im u quajt nĂ« mĂ«nyrĂ« tĂ« thjeshtĂ« â
- Pas krijimit të depozitës, duhet të kufizoni aksesin për të bërë ndryshime në depozit.
Shkoni në projekt -> Cilësimet -> Depoja -> Degë të Mbrojtura. Fshini të gjitha rregullat dhe shtoni një rregull të vetëm me Wildcard * me të drejtë për të bërë push dhe merge vetëm për përdoruesit me rol Maintainers. Ky rregull do të funksionojë për të gjithë përdoruesit e këtij projekti, si dhe për grupin në të cilin ky projekt hyn.
- Nëse ka disa mmaintainers, zgjidhja më e mirë do të ishte të kufizoni qasjen në projekt në përgjithësi.
Shkoni në projekt -> Cilësimet -> Përgjithshme -> Dallueshmëria, karakteristikat e projektit, lejet dhe vendosni theksin e projektit në vlerën Privat.
Unë kam një projekt në qasje publike, pasi përdor GitLab Runner tim personal dhe vetëm unë kam qasje për të bërë ndryshime në depo. Në fund të fundit, nuk është në interesin tim të ekspozoj informacionin privat në log-et e pipeline-ve publike. - Të ashpërsojmë rregullat për ndryshimin e depozitës
Shkoni në projekt -> Cilësimet -> Depoja -> Rregullat e Dërgesës dhe vendosni flamujt e kufizimit të Komituesit, Kontrolloni nëse autori është një përdorues i GitLab. Gjithashtu rekomandoj të konfigurojmë , dhe vendosni flamurin Refuzoni komitetet e pa nënshkruar. - Më pas, është e nevojshme të konfiguroni një trigger për të nisur detyra
Shkoni në projekt -> Cilësimet -> CI / CD -> Triggers pipeline dhe krijoni një token të ri trigger.
Ky kyç mund të shtohet menjëherë në konfigurimin e përgjithshëm të variablave për grupin e projekteve.
Shkoni në grupin -> Cilësimet -> CI / CD -> Variablat dhe shtoni variablënDEPLOY_TOKENme trigger-token në vlerën e tij.
GitLab Runner
Në këtë seksion përshkruhet konfigurimi për ekzekutimin e detyrave në deploy duke përdorur ranerë të vetëquajtur (Specific) dhe publikë (Shared).
Rera Specifike
Une përdor ranerë të vetëquajtur, pasi kjo është e përshtatshme, e shpejtë dhe e lirë.
PĂ«r raner rekomandoj njĂ« VDS Linux me 1 CPU, 2 GB RAM, 20 GB HDD. Ămimi i çështjes Ă«shtĂ« ~3000✠nĂ« vit.
Raneri im
PĂ«r raner kam marrĂ« njĂ« VDS me 4 CPU, 4 GB RAM, 50 GB SSD. MĂ« kushtoi ~11000✠dhe nuk kam patur asnjĂ«herĂ« pendime.
Kam gjithsej 7 makineri. 5 në aruba dhe 2 në ihor.
Pra, tani kemi ranerin. Tani do ta konfigurojmë.
Hyni në makinë përmes SSH dhe instaloni java, git, maven, gnupg2.
Instaloni gitlab runner
- Krijoni një grup të ri
runnersudo groupadd runner - Krijoni një direktor për cache-in e maven dhe caktoni të drejtat për grupin
runner
Ky hap mund të anashkalohet nëse nuk planifikoni të ekzekutoni disa ranerë në një makinë.mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache - Krijoni një përdorues
gitlab-deployerdhe shtoni në gruprunneruseradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer - Shtojmë në skedarin
/etc/ssh/sshd_configrreshtin e mëposhtëmAllowUsers root@* gitlab-deployer@127.0.0.1 - Rindizim
sshdsystemctl restart sshd - Vendosim fjalëkalimin për përdoruesin
gitlab-deployer(mund të jetë i thjeshtë, pasi ka kufizim për localhost)passwd gitlab-deployer - Po instalojmë 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 - Shkonte në faqen gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners dhe kopjojmë tokenin e regjistrimit
Screenshot
- Regjistrojmë runnerin
gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml
Procesi
Platforma e runtime arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Duke punuar në modin sistemik.
Ju lutem jepni URL-në e koordinatori gitlab-ci (p.sh. https://gitlab.com/):
https://gitlab.com/
Ju lutem jepni tokenin gitlab-ci për këtë runner:
REGISTRATION_TOKEN
Ju lutem jepni përshkrimin gitlab-ci për këtë runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Ju lutem jepni etiketat gitlab-ci pĂ«r kĂ«tĂ« runner (tĂ« ndara me vĂrgula):
deploy
Duke regjistruar runner... suksesi runner=ZvKdjJhx
Ju lutem jepni executor-in: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner regjistruar me sukses. Ndihuni të filloni, por nëse është duke u ekzekutuar tashmë, konfigurimi duhet të rregullohet automatikisht!- Kontrollojmë nëse runneri është regjistruar. Shkojmë në faqen gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners aktiv që janë për këtë projekt
Screenshot
- Shtojmë i veçantë shërbim
/etc/systemd/system/gitlab-deployer.service[Unit] Përshkrimi=GitLab Deploy Runner Pas=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" Rikthe=always RestartSec=120 [Install] WantedBy=multi-user.target - Po fillojmë shërbimin.
systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service - Kontrollojmë nëse runneri është nisur.
Shembuj
Generimi i çelësave GPG
- Nga kjo makinë, hyjmë përmes ssh si përdorues
gitlab-deployer(kjo është e rëndësishme për gjenerimin e çelësit GPG)ssh gitlab-deployer@127.0.0.1 - Gjenerojmë çelësin duke iu përgjigjur pyetjeve. Unë përdora emrin dhe e-mailin e mia.
Sigurohuni të jepni një fjalëkalim për çelësin. Ky çelës do të përdoret për të nënshkruar artefaktet.gpg --gen-key - Kontrollojmë
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 - Ngarkojmë çelësin tonë publik në serverin e çelësave
gpg --keyserver keys.gnupg.net --send-key 00000000 gpg: duke dërguar çelësin 00000000 në serverin hkp keys.gnupg.net
Konfigurimi i Maven
- Hyjmë si përdorues
gitlab-deployersu gitlab-deployer - Krijojmë drejtorinë maven repository dhe lidhim me cache (mos gaboni)
Ky pikë mund të anashkalohet nëse nuk planifikoni të nisni disa runner-a në të njëjtën makinë.mkdir -p ~/ .m2 /repository ln -s /usr/cache/ .m2 /repository /home/gitlab-deployer / .m2 /repository - Krijojmë çelësin master
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci /mpsur /73tR2I=} - Krijojmë skedarin ~/ .m2 /settings-security.xml
{hnkle5BJ9HUHUMP+CXfGBl8dScfFci /mpsur /73tR2I=} - Kriptimi i fjalëkalimit të llogarisë Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - Krijojmë skedarin ~/ .m2 /settings.xml
env true GPG_SECRET_KEY_PASSPHRASE sonatype SONATYPE_USERNAME {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
ku,
GPG_SECRET_KEY_PASSPHRASE â fjalĂ«kalimi i çelĂ«sit GPG
SONATYPE_USERNAME â emri i pĂ«rdoruesit tĂ« llogarisĂ« sonatype
Me këtë përfundon konfigurimi i runner-it, mund të kaloni në seksionin
Runner i Ndajshëm
Generimi i çelësave GPG
- Në radhë të parë nevojitet krijimi i çelësit GPG. Për këtë instaloni gnupg.
yum install -y gnupg - Krijohet çelësi duke u përgjigjur në pyetje. Unë kam përdorur emrin dhe email-in tim. Sigurohuni të vendosni një fjalëkalim për çelësin.
gpg --gen-key - Caktojmë informacionin në lidhje me çelësin
gpg --list-keys -a pub rsa3072 2019-04-24 [SC] [expiron: 2021-04-23] 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 uid [ultimate] tttemp sub rsa3072 2019-04-24 [E] [expiron: askush] - Ngarkojmë çelësin tonë publik në serverin e çelësave
gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 gpg: duke dërguar çelësin 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 në serverin hkp keys.gnupg.net - Marrim çelësin privat
gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 -----BEGIN PGP PRIVATE KEY BLOCK----- lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5 ... =2Wd2 -----END PGP PRIVATE KEY BLOCK----- - Shkoni në cilësimet e projektit -> Settings -> CI / CD -> Variables dhe ruani çelësin privat në variabël
GPG_SECRET_KEY
Konfigurimi i Maven
- Krijojmë çelësin master
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci /mpsur /73tR2I=} - Shkoni në cilësimet e projektit -> Settings -> CI / CD -> Variables dhe ruani në variabël
SETTINGS_SECURITY_XMLrreshtat e mëposhtëm:{hnkle5BJ9HUHUMP+CXfGBl8dScfFci /mpsur /73tR2I=} - Kriptimi i fjalëkalimit të llogarisë Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - Shkoni në cilësimet e projektit -> Settings -> CI / CD -> Variables dhe ruani në variabël
SETTINGS_XMLrreshtat e mëposhtëm:env true GPG_SECRET_KEY_PASSPHRASE sonatype sonatype_username {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
ku,
GPG_SECRET_KEY_PASSPHRASE â fjalĂ«kalimi i çelĂ«sit GPG
SONATYPE_USERNAME â emri i pĂ«rdoruesit tĂ« llogarisĂ« sonatype
Deploy imazhi docker
- Krijojmë një Dockerfile mjaft të thjeshtë për të ekzekutuar detyra për deploy me versionin e duhuruar të Java. Më poshtë është një shembull pë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/ - Ndërtojmë kontejnerin për projektin tuaj
docker build -t registry.gitlab.com/group/deploy . - Autentifikohuni dhe ngarkoni kontejnerin në registry.
docker login -u USER -p PASSWORD registry.gitlab.com docker push registry.gitlab.com/group/deploy
GitLab CI
Deploy projektin
Shtoni në rrënjën e projektit të deploy-it skedarin .gitlab-ci.yml
Në skript janë paraqitur dy detyra për deploy që përjashtojnë njëra-tjetrën. Specific Runner ose Shared Runner përkatësisht.
.gitlab-ci.yml
stage:
- deploy
Përgjegjës i veçantë:
extends: .java_deploy_template
# Detyra do të ekzekutohet në runnerri tuaj shell
tags:
- deploy
Përgjegjës i përbashkët:
extends: .java_deploy_template
# Detyra do të ekzekutohet në docker-in e publikuar
tags:
- docker
# Imazhi nga seksioni GitLab Runner -> Shared Runner -> Docker
image: registry.gitlab.com/group/deploy-project:latest
before_script:
# Importojmë çelësin GPG
- printf "${GPG_SECRET_KEY}" | gpg --batch --import
# Ruajmë konfigurimin e maven
- printf "${SETTINGS_SECURITY_XML}" > ~/\.m2/settings-security.xml
- printf "${SETTINGS_XML}" > ~/\.m2/settings.xml
.java_deploy_template:
stage: deploy
# Detyra do të aktivizohet me trigger-in, nëse kalon variablin DEPLOY me vlerë java
only:
variables:
- $DEPLOY == "java"
variables:
# ĂaktivizojmĂ« klonimin e projektit aktual
GIT_STRATEGY: none
script:
# Ofron mundësinë për ruajtjen e fjalëkalimit në format të paenkriptuar
- git config --global credential.helper store
# Ruajmë kredencialet e përkohshme të përdoruesit gitlab-ci-token
# Tokeni funksionon për të gjitha projektet publike gitlab.com dhe për projektet e grupit
- echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/\.git-credentials
# Pastroni krejtësisht direktorinë aktuale
- rm -rf .* *
# Kloni projektin që do të deplojmë në Sonatype Nexus
- git clone ${DEPLOY_CI_REPOSITORY_URL} .
# Kalojmë në komitin e duhur
- git checkout ${DEPLOY_CI_COMMIT_SHA} -f
# Nëse ndonjë pom.xml përmban parametrin autoReleaseAfterClose, ndalim ndërtimin.
# Në të kundërt, ka rrezik të ngarkojmë artefakte të papërfunduara në maven central
- >
for pom in $(find . -name pom.xml); do
if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
echo "File $pom përmban cilësimin e ndaluar: ";
exit 1;
fi;
done
# Nëse parametri DEPLOY_CI_COMMIT_TAG është bosh, atëherë me këmbëngulje vendosim versionin 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
# Ekzekutojmë detyrën për ndërtimin dhe depërtimin e artefakteve
- mvn clean deploy -DskipTests=trueProjekti Java
Në projektet java që pritet të ngarkohen në depo publike, është e nevojshme të shtohen 2 hapa për ngarkimin e versioneve Release dhe Snapshot.
.gitlab-ci.yml
stages:
- build
- test
- verify
- deploy
Release:
extends: .trigger_deploy
# Ekzekutoni detyrën vetëm për etiketën.
only:
- tags
Snapshot:
extends: .trigger_deploy
# Ekzekutojmë detyrën për publikimin e versionit SNAPSHOT manualisht
when: manual
# Mos e ekzekutoni detyrën, nëse është vendosur një etiketë.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# ĂaktivizojmĂ« klonimin e projektit aktual
GIT_STRATEGY: none
# Linku për trigger-in e detyrës së deploy
URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
# Variablat e detyrës së 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:
# Nuk përdor cURL, pasi me flagjet --fail --show-error
# nuk shfaq pjesën e përgjigjes, nëse kodi HTTP është 400 e më lart
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}Në këtë zgjidhje, kam shkuar pak më tej dhe kam vendosur të përdor një model CI për projektet java.
Më në detaje
Krijova një projekt të veçantë ku vendosa modelin CI për projektet java .
common.yml
stages:
- ndërtim
- testim
- verifikim
- shpërndarje
variables:
SONAR_ARGS: "
-Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA}
-Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME}
"
.build_java_project:
stage: ndërtim
tags:
- touchbit-shell
variables:
SKIP_TEST: "false"
script:
- mvn clean
- mvn package -DskipTests=${SKIP_TEST}
artifacts:
when: always
expire_in: 30 ditë
paths:
- "*/target/reports"
.build_sphinx_doc:
stage: ndërtim
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: testim
tags:
- touchbit-shell
variables:
MODULE: ""
script:
- cd ${MODULE}
- mvn test
artifacts:
when: always
expire_in: 30 ditë
paths:
- "*/target/reports"
.junit_test_run:
stage: testim
tags:
- touchbit-shell
script:
- mvn test
artifacts:
when: always
expire_in: 30 ditë
paths:
- "*/target/reports"
.sonar_review:
stage: verifikim
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: shpërndarje
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
Si rezultati, skedarët .gitlab-ci.yml në projektet java duken shumë kompakti dhe jo të drejta.
.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_deployKonfigurimi i pom.xml
Kjo temë është përshkruar shumë detajisht. në , prandaj do të përshkruaj disa nuanca në përdorimin e plugins. Po ashtu, do të përshkruaj se sa lehtë dhe pa ndjenja mund ta përdorni. nexus-staging-maven-plugin, nëse nuk dëshironi ose nuk mund të përdorni org.sonatype.oss:oss-parent si prind për projektin tuaj.
maven-install-plugin
Installon modulet në depozitën lokale.
Shumë e dobishme për verifikimin lokal të zgjidhjeve në projekte të tjera, si dhe për kontrollin e integritetit.
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
Gjenerimi i javadoc për projektin.
org.apache.maven.plugins
maven-javadoc-plugin
jar
prepare-package
true
true
falseNëse keni një modul që nuk përmban java (për shembull, vetëm burime)
Ose nuk dëshironi t'i gjeneroni javadoc në përgjithësi, atëherë në ndihmë 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
Konfigurimi:
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/Nëse keni një projekt me module të shumta dhe nuk është e nevojshme të ngarkoni një modul të caktuar në depo, atëherë në pom.xml të këtij moduli duhet të shtoni nexus-staging-maven-plugin me flamur skipNexusStagingDeployMojo
org.sonatype.plugins
nexus-staging-maven-plugin
truePas ngarkimit, versionet snapshot/release janë të disponueshme në
SonatypeNexus
https://oss.sonatype.org/content/groups/staging/
<!--Një tjetër plus
- Një listë shumë e pasur e qëllimeve për punë me depo-nexus (
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin). - Kontroll automatik i lëshimit për mundësinë e ngarkimit në maven central
Rezultati
Publikimi i versionit SNAPSHOT
Gjatë ndërtimit të projektit, ekziston mundësia e nisjes manuale të detyrës për ngarkimin e versionit SNAPSHOT në nexus
Kur ekzekutohet kjo detyrë, aktivizohet detyra përkatëse në projektin deploy ().
Log i prerë
Po afatgjatë me gitlab-runner 11.10.0 (3001a600)
në Deploy runner JSKWyxUw
Duke përdorur executor-in Shell...
Po punon në ih1174328.vds.myihor.ru...
Duke anashkaluar konfigurimin e depozitës Git
Duke anashkaluar kontrollin e Git
Duke anashkaluar konfigurimin e nënmodulëve Git
$ 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} .
Duke kopjuar në 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Shënim: po kontrolloni '850f86aa317194395c5387790da1350e437125a7'.
Jeni në gjendjen 'detached HEAD'. Mund të shikoni rreth, të bëni ndryshime eksperimentale
dhe t'i angazhoni ato, dhe mund të hidhni çdo angazhim që bëni në këtë
gjendje pa ndikuar në asnjë degë duke kryer një tjetër kontroll.
Nëse dëshironi të krijoni një degë të re për të ruajtur angazhimet që krijoni, mund
të bëni këtë (tani ose më vonë) duke përdorur -b me komandën e kontrollit përsëri. Shembull:
git checkout -b emri_deges_se_re
HEAD tani është në 850f86a... anashkaloni testin e shpërndarjes
$ për pom në $(find . -name pom.xml); bëj # komandë e ndarë shumë-line
$ nëse [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; atëherë # komandë e ndarë shumë-line
[INFO] Skanoj për projekte...
[INFO] Inspektoj ndërtimin me total prej 4 moduleve...
[INFO] Instalimi i veçorive të Nexus Staging:
[INFO] ... total prej 4 ekzekutimesh të maven-deploy-plugin u zëvendësua me nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Renditja e Ndërtimit të Reaktorëve:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Klienti Shields4J [jar]
[INFO] Dëgjuesi TestNG [jar]
[INFO]
[INFO] -----------------------------
[INFO] Po ndërtosh Shields4J 1.0.0 [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Duke kërkuar për rrënjën e agreguesit lokal...
[INFO] Rrënja e agregimit lokal: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Procesi i ndryshimit të org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Procesi org.touchbit.shields4j:shields4j-parent
[INFO] Po përditëson projektin org.touchbit.shields4j:shields4j-parent
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]
[INFO] Procesi org.touchbit.shields4j:client
[INFO] Po përditëson prindin org.touchbit.shields4j:shields4j-parent
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] Po përditëson varësinë org.touchbit.shields4j:test-core
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]
[INFO] Procesi org.touchbit.shields4j:test-core
[INFO] Po përditëson prindin org.touchbit.shields4j:shields4j-parent
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]
[INFO] Procesi org.touchbit.shields4j:testng
[INFO] Po përditëson prindin org.touchbit.shields4j:shields4j-parent
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] Po përditëson varësinë org.touchbit.shields4j:client
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] Po përditëson varësinë org.touchbit.shields4j:test-core
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Rezuma e Reaktorëve:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUKSES [ 0.992 s]
[INFO] test-core .......................................... SKIPUAR
[INFO] Klienti Shields4J ................................... SKIPUAR
[INFO] Dëgjuesi TestNG 1.0.0 .............................. SKIPUAR
[INFO] ------------------------------------------------------------------------
[INFO] NDĂRTIM SUKSES
[INFO] ------------------------------------------------------------------------
[INFO] Koha totale: 2.483 s
[INFO] Mbaruar në: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Skanoj për projekte...
[INFO] Inspektoj ndërtimin me total prej 4 moduleve...
[INFO] Instalimi i veçorive të Nexus Staging:
[INFO] ... total prej 4 ekzekutimesh të maven-deploy-plugin u zëvendësua me nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Renditja e Ndërtimit të Reaktorëve:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Klienti Shields4J [jar]
[INFO] Dëgjuesi TestNG [jar]
[INFO]
[INFO] -----------------------------
[INFO] Po ndërtosh Shields4J 1.0.0-SNAPSHOT [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
FIRMA
...
[INFO] * Shpërndarja e masës së artefakteve të grumbulluara për snapshot përfundoi.
[INFO] Shpërndarja e largët u përfundua me sukses.
[INFO] ------------------------------------------------------------------------
[INFO] Rezuma e Reaktorëve:
[INFO]
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUKSES [ 2.375 s]
[INFO] test-core .......................................... SUKSES [ 3.929 s]
[INFO] Klienti Shields4J ................................... SUKSES [ 3.815 s]
[INFO] Dëgjuesi TestNG 1.0.0-SNAPSHOT ..................... SUKSES [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] NDĂRTIM SUKSES
[INFO] ------------------------------------------------------------------------
[INFO] Koha totale: 47.629 s
[INFO] Mbaruar në: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------Si pasojë, në nexus u ngarkua versioni .
Të gjitha versionet snapshot mund të fshihen nga repository në sitin nën llogarinë tuaj.
Publikimi i versionit release
Kur caktohet etiketë, automatikisht aktivizohet detyra përkatëse në projektin deploy për ngarkimin e versionit të lëshuar në nexus ().
Më e këndshmja, automatikisht aktivizohet close release në nexus.
[INFO] Duke bërë staging nga distanca...
[INFO]
[INFO] * Staging në profilin e stagingut me ID "9043b43f77dcc9"
[INFO] * Krijuar repository staging me ID "orgtouchbit-1037".
[INFO] * Repository staging në https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Ngarkimi i artefakteve të ngarkuara lokal në profilin org.touchbit
[INFO] * Ngarkimi i artefakteve të ngarkuara lokal përfundoi.
[INFO] * Duke mbyllur repository staging me ID "orgtouchbit-1037".
Duke pritur që operacioni të përfundojë...
.........
[INFO] Staging nga distanca 1 repository, përfundoi me sukses.
[INFO] ------------------------------------------------------------------------
[INFO] Rezultati i reaktorit:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUKSES [ 9.603 s]
[INFO] test-core .......................................... SUKSES [ 3.419 s]
[INFO] Shields4J klient ................................... SUKSES [ 9.793 s]
[INFO] TestNG dëgjuesi 1.0.0 .............................. SUKSES [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] NDĂRTIMI SUKSES
[INFO] ------------------------------------------------------------------------
[INFO] Koha totale: 01:47 min
[INFO] Përfundoi në: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------Dhe nëse diçka shkoi keq, detyra do të dështojë për siguri.
[INFO] Duke remote staging...
[INFO]
[INFO] * Duke në profilin e skenimit ID "9043b43f77dcc9"
[INFO] * Krijuar depo skenimi me ID "orgtouchbit-1038".
[INFO] * Depotë skenimi në https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Ngarkimi i artefakteve të skenuara lokal në profilin org.touchbit
[INFO] * Ngarkimi i artefakteve të skenuara lokal përfundoi.
[INFO] * Duke mbyllur depo skenimi me ID "orgtouchbit-1038".
Po pret për përfundimin e veprimit...
.......
[ERROR] Dështimi i rregullit gjatë përpjekjes për të mbyllur depo skenimi me ID "orgtouchbit-1039".
[ERROR]
[ERROR] Raporti i Dështimit të Rregullave të Nexus Staging
[ERROR] ==================================
[ERROR]
[ERROR] Dështimet e depo "orgtouchbit-1039"
[ERROR] Dështimet e rregullit "signature-staging"
[ERROR] * ĂelĂ«si publik mungon: ĂelĂ«si me ID: (1f42b618d1cbe1b5) nuk mund tĂ« gjendej nĂ« <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. Ngarko çelĂ«sin tĂ«nd publik dhe provo pĂ«rsĂ«ri operacionin.
...
[ERROR] Pastrimi i direktorisë lokale të skenimit pas dështimit të një Rregulli gjatë mbylljes së depo skenimi: [orgtouchbit-1039]
[ERROR] * Duke fshirë kontekstin 9043b43f77dcc9.properties
[ERROR] Pastrimi i depo skenimi të largët pas dështimit të një Rregulli gjatë mbylljes së depo skenimi: [orgtouchbit-1039]
[ERROR] * Duke hequr depo skenimi të dështuar me ID "orgtouchbit-1039" (Dështimi i rregullit gjatë mbylljes së depo skenimi: [orgtouchbit-1039]).
[ERROR] Duke përfunduar skenimin e largët me një dështim: Dështimi i rregullave të skenimit!
[INFO] ------------------------------------------------------------------------
[INFO] Përmbledhje e Reaktorëve:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUKSES [ 4.073 s]
[INFO] test-core .......................................... SUKSES [ 2.788 s]
[INFO] Klienti Shields4J ................................... SUKSES [ 3.962 s]
[INFO] DĂ«gjuesi TestNG 1.0.0 .............................. DĂSHTIM [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] DĂSHTIM I NDĂRTIMIT
[INFO] ------------------------------------------------------------------------Kemi mbetur vetëm një zgjedhje. Ose të fshijmë këtë version ose ta publikojmë.
Pas publikimit, pas një kohe artefaktet do të përfundojnë në
offtopic
Për mua ishte një zbulim se maven indekson depozita publike të tjera.
Ishte e nevojshme të shtoj robots.txt, pasi ai indeksoi depozitën time të vjetër.
Përfundimi
ĂfarĂ« kemi
- Një projekt i veçantë deploy ku mund të realizohet një numër CI punësh për ngarkimin e artefakteve në depozita publike për gjuhë të ndryshme zhvillimi.
- Projekti deploy është i izoluar nga ndërhyrjet e jashtme dhe mund të ndryshohet vetëm nga përdoruesit me rolin Owner dhe Maintainer.
- Një Runner specifik i veçantë me një cache "të nxehtë" për të ekzekutuar vetëm punët e deploy.
- Publikimi i versioneve snapshot/release në depozitën publike.
- Kontrolli automatik i versionit release për gatishmërinë për publikim në maven central.
- Mbrojtja nga publikimi automatik i versioneve "të papjekura" në maven central.
- Ndërtimi dhe publikimi i versioneve snapshot "me një klik".
- Një depo e vetme për marrjen e versioneve snapshot/release.
- Një pipeline e përbashkët për ndërtimin/testimin/publikimin e projektit java.
Konfigurimi i GitLab CI nuk Ă«shtĂ« njĂ« temĂ« aq e komplikuar sa duket nĂ« shikim tĂ« parĂ«. Mjafton tĂ« konfiguroni CI "nga fillimi" disa herĂ« dhe ja, ju nuk jeni mĂ« njĂ« novice nĂ« kĂ«tĂ« fushĂ«. Sidomos dokumentacioni i GitLab Ă«shtĂ« mjaft i hollĂ«sishĂ«m. Mos keni frikĂ« tĂ« bĂ«ni hapin e parĂ«. Rruga shfaqet nĂ«n hapat e atij qĂ« ecĂ«n (nuk e mbaj mend kush e tha đ ).
Do të isha i lumtur për ndonjë feedback.
Në artikullin e ardhshëm do të flas për mënyrën e konfigurimit të GitLab CI për ekzekutimin konkurent të detyrave me testet integruese (me nisjen e shërbimeve që testohen përmes docker-compose), nëse keni vetëm një shell runner.
Burimi: habr.com
