Kyç i këtij artikulli është për zhvilluesit java që kanë nevojë të publikojnë shpejt produktet e tyre në repositorët 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 të zgjidhur këtë detyrë.
Kushtet paraprake:
- Ruajtja e sigurt e mvn dhe çelsojve GPG.
- Ekzekutimi i sigurt i detyrave publike CI.
- Ngarko artefaktet (release/snapshot) në repositorë publik.
- Kontrolli automatik i versioneve release për publikim në Maven Central.
- Zgjidhja e përgjithshme për ngarkimin e artefakteve në repository për disa projekte.
- Thjeshtësia dhe lehtësia e përdorimit.
Përmbajtja
Informacion i përgjithshëm
- Përshkrimi i detajuar i mekanizmit të publikimit të artefakteve në Maven Central përmes Shërbimit të Hosting të Repositorëve OSS Sonatype është përshkruar tashmë në nga përdoruesi , ndaj në vendet e nevojshme do të bëj referencë në këtë artikull.
- Përpara, regjistrohemi në dhe hapim një tiket për hapjen e repositorit (lexoni më shumë në seksionin ). Pas hapjes së repositorit, çifti login/fjalëkalim nga JIRA (më pas llogaria Sonatype) do të përdoret për ngarkimin e artefakteve në Sonatype nexus.
- Më pas, procesi i generimit të çelsojve GPG përshkruhet mjaft i thatë. Shihni më shumë në seksionin
- Nëse përdorni terminalin Linux për të gjeneruar çelësin GPG (gnupg/gnupg2), është e nevojshme të instaloni për gjenerimin e entropisë. Përndryshe, gjenerimi i çelësit mund të marrë shumë kohë.
- Shërbimet e ruajtjes çelsojve GPG publikë
Konfigurimi i projektit deploy në GitLab
- Së pari, duhet të krijoni dhe konfiguroni një projekt ku do të ruhet pipeline, për të deploy-uar artefaktet. Projketin tim e quajta thjesht dhe pa ndonjë komplikuar -
- Pas krijimit të repositorit, është e nevojshme të kufizoni aksesin për të ndryshuar repositorin.
Kaloni në projekt -> Settings -> Repository -> Protected Branches. Fshini të gjitha rregullat dhe shtoni një rregull të vetëm me Wildcard * me të drejta pë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 grupin në të cilin ky projekt përfshihet.
- Nëse ka disa mbajtës, zgjidhja më e mirë do të ishte të kufizoni aksesin në projekt në përgjithësi.
Shkoni te projekti -> Settings -> General -> Visibility, project features, permissions dhe caktoni Project visibility në Privat.
Unë kam projektin në akses publik, pasi përdor GitLab Runner tim dhe aksesin për të ndryshuar repository e kam vetëm për vete. Poashtu nuk është në interesin tim të ekspozoj informacion privat në logët publike të pipeline. - Rigorifikimi i rregullave për ndryshimin e repository-t.
Shkoni te projekti -> Settings -> Repository -> Push Rules dhe vendosni flag-un Committer restriction, Check whether author is a GitLab user. Po ashtu rekomandoj të konfiguroni , dhe vendosni flag-un Reject unsigned commits. - Më pas është e nevojshme të konfigurohet një trigger për të nisur detyrat.
Shkoni te projekti -> Settings -> CI / CD -> Pipeline triggers dhe krijoni një trigger-token të ri.
Ky token mund të shtohet menjëherë në konfigurimin e përgjithshëm të variablave për grupin e projekteve.
Shkoni te grupi -> Settings -> CI / CD -> Variables dhe shtoni variablënDEPLOY_TOKENme vlerën e trigger-token.
GitLab Runner
Ky seksion përshkruan konfigurimin për nisjen e detyrave në deploy duke përdorur runner personal (Specific) dhe publik (Shared).
Runner specifik
Unë përdor runner të miat, pasi është e përshtatshme, e shpejtë dhe e lirë.
PĂ«r runner-in rekomandoj njĂ« VDS me 1 CPU, 2 GB RAM, 20 GB HDD. Ămimi Ă«shtĂ« rreth 3000✠nĂ« vit.
Runner-i im
PĂ«r runner-in kam marrĂ« njĂ« VDS me 4 CPU, 4 GB RAM, 50 GB SSD. MĂ« ka kushtuar rreth 11000✠dhe nuk kam penduar asnjĂ«herĂ«.
Në total kam 7 makineri. 5 në aruba dhe 2 në ihor.
Pra, tani kemi një runner. Tani do ta konfigurojmë atë.
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 e grupit.
runner
Ky hap mund të lihet jashtë nëse nuk planifikoni të përdorni disa runner në të njëjtën makinë.mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache - Krijojmë përdorues
gitlab-deployerdhe shtoni në grup.runneruseradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer - Shtoni në skedarin
/etc/ssh/sshd_configrreshtin e mëposhtëm.AllowUsers root@* gitlab-deployer@127.0.0.1 - Rinovoni
sshdsystemctl restart sshd - Krijoni një fjalëkalim për përdoruesin.
gitlab-deployer(mund të jetë e thjeshtë, pasi ka një kufizim për localhost).passwd gitlab-deployer - Instaloni 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 - Shkoni në faqen gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners dhe kopjoni tokenin e regjistrimit
Screenshot
- Regjistroni runner-in
gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml
Në ditën e fillimit të modulit, struktura e tij bëhet e disponueshme. Studimi në UoL përbëhet nga cikli në vijim:
Platforma e runtime-së arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Duke funksionuar në modalitetin sistemor.
Ju lutemi, shkruani URL-në e koordinatori gitlab-ci (p.sh. https://gitlab.com/):
https://gitlab.com/
Ju lutemi, shkruani tokenin gitlab-ci për këtë runner:
REGISTRATION_TOKEN
Ju lutemi, shkruani përshkrimin gitlab-ci për këtë runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Ju lutemi, shkruani etiketat gitlab-ci për këtë runner (të ndara me presje):
deploy
Duke regjistruar runner-in... u suksesshëm runner=ZvKdjJhx
Ju lutemi, shkruani_executor-in: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner i regjistruar me sukses. Mos hezitoni ta filloni, por nëse është duke funksionuar tashmë, konfigurimi duhet të rifreskohet automatikisht!- Kontrolloni nëse runner-i është regjistruar. Shkoni në faqen gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners aktivë për këtë projekt
Screenshot
- Shtoni të veçantë shërbimin
/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 - Filloni shërbimin.
systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service - Kontrolloni nëse runner-i është aktiv.
Shembulli
Generimi i çelsojve GPG
- Nga kjo makinë hyni përmes ssh si përdoruesi
gitlab-deployer(kjo është e rëndësishme për gjenerimin e çelësit GPG)ssh gitlab-deployer@127.0.0.1 - Gjeneroni çelësin duke iu përgjigjur pyetjeve. Unë përdora emrin dhe emailin tim të pronarit.
Sigurohuni të tregoni fjalëkalim për çelësin. Ky çelës do të përdoret për të nënshkruar artefaktet.gpg --gen-key - Po 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 - Ngarko çelësin tuaj 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
- Hyni si përdoruesi
gitlab-deployersu gitlab-deployer - Krijoni direktorinë maven repository dhe lidhni me cache (mos gaboni)
Ky pikë mund të lihet përjashtim, nëse nuk planifikoni të nisni disa runners në të njëjtën makinë.mkdir -p ~/.m2/repository ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository - Krijoni çelësin kryesor
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Krijoni skedarin ~/.m2/settings-security.xml
{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Krijojmë një fjalëkalim për llogarinë 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 pĂ«r çelĂ«sin GPG
SONATYPE_USERNAME â emri i pĂ«rdoruesit pĂ«r llogarinĂ« sonatype
Këtu përfundon konfigurimi i runner-it, mund të kaloni në seksionin
Runner të shpërndarë
Generimi i çelsojve GPG
- Së pari, është e nevojshme të krijoni një çelës GPG. Për këtë instalohet gnupg.
yum install -y gnupg - Gjenieroni çelësin duke iu përgjigjur pyetjeve. Unë përdora emrin dhe emailin tim personal. Sigurohuni të tregoni fjalëkalimin për çelësin.
gpg --gen-key - Shfaqim informacionin rreth çelësit
gpg --list-keys -a pub rsa3072 2019-04-24 [SC] [skadon: 2021-04-23] 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 uid [fundamental] tttemp sub rsa3072 2019-04-24 [E] [skadon: asnjë] - Ngarko çelësin tuaj publik në serverin e çelësave
gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 gpg: dërgimi i çelësit 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 te serveri 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----- - Kalojmë në konfigurimin e projektit -> Settings -> CI / CD -> Variables dhe ruajmë çelësin privat në variablin
GPG_SECRET_KEY
Konfigurimi i Maven
- Krijoni çelësin kryesor
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Kalojmë në konfigurimin e projektit -> Settings -> CI / CD -> Variables dhe ruajmë në variablin
SETTINGS_SECURITY_XMLlini këto rreshta:{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Krijojmë një fjalëkalim për llogarinë Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - Kalojmë në konfigurimin e projektit -> Settings -> CI / CD -> Variables dhe ruajmë në variablin
SETTINGS_XMLlini këto rreshta:env true GPG_SECRET_KEY_PASSPHRASE sonatype sonatype_username {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
ku,
GPG_SECRET_KEY_PASSPHRASE â fjalĂ«kalimi pĂ«r çelĂ«sin GPG
SONATYPE_USERNAME â emri i pĂ«rdoruesit pĂ«r llogarinĂ« sonatype
Deploy imazhin docker
- Krijojmë një Dockerfile të thjeshtë për të ekzekutuar detyrat në deploy me versionin e nevojshëm të Java. Më poshtë jepet 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/ - Krijojmë konteinerin për projektin tuaj
docker build -t registry.gitlab.com/group/deploy . - Autentikohuni dhe ngarkoni konteinerin në registry.
docker login -u USER -p PASSWORD registry.gitlab.com docker push registry.gitlab.com/group/deploy
GitLab CI
Deploy projektin
Shtojmë në rrënjën e projektit deploy skedarin .gitlab-ci.yml
Në skenarin paraqiten dy detyra për deploy që përjashtojnë njëra-tjetrën. Specific Runner ose Shared Runner përkatësisht.
.gitlab-ci.yml
stages:
- deploy
Specific Runner:
extends: .java_deploy_template
# Detyra do të ekzekutohet në shell-runners tuaj
tags:
- deploy
Shared Runner:
extends: .java_deploy_template
# Detyra do të ekzekutohet në docker-runner publik
tags:
- docker
# Imazh 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 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 jepet variabla DEPLOY me vlerën java
only:
variables:
- $DEPLOY == "java"
variables:
# ndalojmë klonimin e projektit aktual
GIT_STRATEGY: none
script:
# Ofroni mundësinë e ruajtjes së fjalëkalimit në formë të pa-enkriptuar
- git config --global credential.helper store
# Ruajmë kredencialet për përdoruesin gitlab-ci-token
# Token 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
# Pjesa më e madhe e drejtorisë aktuale
- rm -rf .* *
# Klonojmë projektin që do të vendosim në Sonatype Nexus
- git clone ${DEPLOY_CI_REPOSITORY_URL} .
# Kthehemi në komitin e duhur
- git checkout ${DEPLOY_CI_COMMIT_SHA} -f
# Nëse ndonjë pom.xml përmban parametrin autoReleaseAfterClose, prishim ndërtimin.
# Ndryshe, ka rrezik të ngarkohet arti i papërfunduar 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ë i zbrazët, atëherë vendosim forcërisht 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 vendosjen e artefakteve
- mvn clean deploy -DskipTests=trueProjekti Java
Në projektet java që pritet të ngarkohen në repozitorë publikë, është e nevojshme të shtojmë 2 hapa për ngarkimin e versioneve Release dhe Snapshot.
.gitlab-ci.yml
etapat:
- ndërtim
- test
- verifikim
- shpërndarje
Release:
extends: .trigger_deploy
# Ekzekuto këtë detyrë vetëm për etiketat.
only:
- tags
Snapshot:
extends: .trigger_deploy
# Ekzekutojmë detyrën për publikimin e versionit SNAPSHOT manualisht
when: manual
# Mos e ekzekuto këtë detyrë nëse është vendosur një etiketë.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# ĂaktivizojmĂ« klonimin e projektit aktual
GIT_STRATEGY: none
# Linku për detyrën e triggerit të deploy-it
URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
# Variablat për detyrën e deploy-it
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, sepse me flagat --fail --show-error
# nuk e printon trupin e përgjigjes, nëse kodi HTTP është 400 dhe më shumë
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}Në këtë zgjidhje shkuam pak më tej dhe vendosa të përdor një model CI për projektet java.
Më hollësisht
Krijova një projekt të veçantë ku vendosa modelin CI për projektet java .
common.yml
etapat:
- ndërtim
- test
- verifikim
- shpërndarje
variablat:
SONAR_ARGS: "
-Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA}
-Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME}
"
.build_java_project:
stage: build
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: build
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: test
tags:
- touchbit-shell
variables:
MODULE: ""
script:
- cd ${MODULE}
- mvn test
artifacts:
when: always
expire_in: 30 ditë
paths:
- "*\/target\/reports"
.junit_test_run:
stage: test
tags:
- touchbit-shell
script:
- mvn test
artifacts:
when: always
expire_in: 30 ditë
paths:
- "*\/target\/reports"
.sonar_review:
stage: verify
tags:
- touchbit-shell
dependencies: []
script:
- >
nëse [ "$CI_BUILD_REF_NAME" == "master" ]; atëherë
mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
përndryshe
mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
fi
.trigger_deploy:
stage: deploy
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 e verifikon se në vetë projektet java, .gitlab-ci.yml duket mjaft kompakt dhe jo fjalë më fjalë.
.gitlab-ci.yml
përfshi: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml
Shields4J:
zgjeron: .build_java_project
Sphinx doc:
zgjeron: .build_sphinx_doc
variablat:
DOCKERFILE: .docs/Dockerfile
Sonar review:
zgjeron: .sonar_review
varësitë:
- Shields4J
Releasë:
zgjeron: .trigger_release_deploy
Snapshot:
zgjeron: .trigger_snapshot_deployKonfigurimi i pom.xml
Ky temë është përshkruar shumë në detaje. në , prandaj do të përshkruaj disa nuanca të përdorimit të plaginave. Gjithashtu do të përshkruaj se si lehtë dhe pa ndonjë ngarkesë mund të 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 modulat në depozitin lokal.
Mjaft e dobishme për verifikimin lokal të zgjidhjeve në projekte të tjera, si dhe për kontrollin e sumave.
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
Generimi 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.sh. vetëm burime)
Ose nëse nuk dëshironi që në përgjithësi të gjeneroni javadoc, 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 shumë module dhe nuk keni nevojë 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 flamurin 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/
<!--Më shumë përfitime
- Një listë shumë të pasur qëllimesh për të punuar me depot nexus (
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin). - Kontroll automatik i lëshimit për mundësinë e ngarkesës në maven central
Rezultati
Publikimi i versionit SNAPSHOT
Gjatë ndërtimit të projektit, ka mundësi për të nisur në mënyrë manuale detyrën për ngarkimin e versionit SNAPSHOT në nexus
Kur niset kjo detyrë, aktivizohet detyra përkatës në projektin deploy ().
Logs i prerë
Ekzekutimi me gitlab-runner 11.10.0 (3001a600)
në Deploy runner JSKWyxUw
Duke përdorur ekzekutorin Shell...
Duke punuar në ih1174328.vds.myihor.ru...
Të dhënat e Git-it janë duke u anashkaluar
Të dhënat e kontrollit të Git-it janë duke u anashkaluar
Të dhënat e submoduleve të Git-it janë duke u anashkaluar
$ 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} .
Klonimi në 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Shënim: duke kontrolluar '850f86aa317194395c5387790da1350e437125a7'.
Jeni në gjendjen 'detached HEAD'. Mund të bëni ndryshime eksperimentale
dhe t'i angazhoni ato, dhe mund të anashkaloni çdo angazhim që bëni në këtë
shtet pa ndikuar në ndonjë degë duke bërë një kontroll të ri.
Nëse dëshironi të krijoni një degë të re për të mbajtur 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 new_branch_name
HEAD tani është në 850f86a... anashkaloni testin e shpërndarjes
$ për pom në $(find . -name pom.xml); bëj # komandë e shumëfishtë e anashkaluar
$ nëse [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; atëherë # komandë e shumëfishtë e anashkaluar
[INFO] Scanuar për projekte...
[INFO] Duke kontrolluar ndërtimin me një total prej 4 moduleve...
[INFO] Duke instaluar karakteristikat e Nexus Staging:
[INFO] ... një total prej 4 ekzekutimesh të maven-deploy-plugin të zëvendësuar me nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Renditja e Ndërtimit të Reaktorit:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Klienti Shields4J [jar]
[INFO] Dëgjuesi TestNG [jar]
[INFO]
[INFO] -----------------------------
[INFO] Duke ndërtuar Shields4J 1.0.0 [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Duke kërkuar rrënjën e agregatorit lokal...
[INFO] Rrënja lokale e agregatës: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Duke përpunuar ndryshimin e org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Duke përpunuar org.touchbit.shields4j:shields4j-parent
[INFO] Duke përditësuar projektin org.touchbit.shields4j:shields4j-parent
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]
[INFO] Duke përpunuar org.touchbit.shields4j:client
[INFO] Duke përditësuar prindin org.touchbit.shields4j:shields4j-parent
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] Duke përditësuar varësinë org.touchbit.shields4j:test-core
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]
[INFO] Duke përpunuar org.touchbit.shields4j:test-core
[INFO] Duke përditësuar prindin org.touchbit.shields4j:shields4j-parent
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]
[INFO] Duke përpunuar org.touchbit.shields4j:testng
[INFO] Duke përditësuar prindin org.touchbit.shields4j:shields4j-parent
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] Duke përditësuar varësinë org.touchbit.shields4j:client
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] Duke përditësuar varësinë org.touchbit.shields4j:test-core
[INFO] nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Përmbledhja e Reaktorit:
[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] Përfunduar në: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanuar për projekte...
[INFO] Duke kontrolluar ndërtimin me një total prej 4 moduleve...
[INFO] Duke instaluar karakteristikat e Nexus Staging:
[INFO] ... një total prej 4 ekzekutimesh të maven-deploy-plugin të zëvendësuar me nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Renditja e Ndërtimit të Reaktorit:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Klienti Shields4J [jar]
[INFO] Dëgjuesi TestNG [jar]
[INFO]
[INFO] -----------------------------
[INFO] Duke ndërtuar Shields4J 1.0.0-SNAPSHOT [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
TĂ FSHIHA
...
[INFO] * Shpërndarja masive e artefakteve të grumbulluar vendore të snapshot është përfunduar.
[INFO] Shpërndarja e largët përfundoi me sukses.
[INFO] ------------------------------------------------------------------------
[INFO] Përmbledhja e Reaktorit:
[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] Përfunduar në: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------Si pasojë, një version është ngarkuar në nexus .
Të gjitha versionet snapshot mund të fshihen nga repository në sitin në llogarinë tuaj.
Publikimi i versionit release
Kur vendosni etiketën, një detyrë përkatëse në projektin deploy për ngarkimin e versionit të publikimit në nexus aktivizohet automatikisht ().
Më e mira është se mbyllja e publikimit në nexus aktivizohet automatikisht.
[INFO] Duke realizuar skenimin e largët...
[INFO]
[INFO] * Skenimi i largët në profilin e skenimit ID "9043b43f77dcc9"
[INFO] * Repo e skenimit të krijuar me ID "orgtouchbit-1037".
[INFO] * Repo e skenimit në https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Dërgimi i artikujve të skenuar lokal për profilin org.touchbit
[INFO] * Dërgimi i artikujve të skanuar lokal përfundoi.
[INFO] * Duke mbyllur repo e skenimit me ID "orgtouchbit-1037".
Këtu po presim për përfundimin e operacionit...
.........
[INFO] Skenimi i largët për 1 repo, përfundoi me sukses.
[INFO] ------------------------------------------------------------------------
[INFO] I përmbledhuri i reaktorit:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUKSES [ 9.603 s]
[INFO] test-core .......................................... SUKSES [ 3.419 s]
[INFO] Klienti Shields4J ................................... SUKSES [ 9.793 s]
[INFO] Dëgjuesi TestNG 1.0.0 .............................. SUKSES [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] NDĂRTIM SUKSES
[INFO] ------------------------------------------------------------------------
[INFO] Koha totale: 01:47 min
[INFO] Përfunduar në: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------Dhe nëse diçka shkoi keq, detyra do të dështojë patjetër
[INFO] Po kryerjen e skenimit të largët...
[INFO]
[INFO] * Skenim i largët në profilin e skenimit ID "9043b43f77dcc9"
[INFO] * Kreu repository-n e skenimit me ID "orgtouchbit-1038".
[INFO] * Repository i skenimit në https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Ngarkimi i artefakteve të skenuara lokalisht në profilin org.touchbit
[INFO] * Ngarkimi i artefakteve të skenuara lokalisht përfundoi.
[INFO] * Duke mbyllur repository-n e skenimit me ID "orgtouchbit-1038".
Duke pritur për të përfunduar operacionin...
.......
[ERROR] Dështimi i rregullave gjatë përpjekjes për të mbyllur repository-n e skenimit me ID "orgtouchbit-1039".
[ERROR]
[ERROR] Raporti i dështimeve të rregullave të Nexus Staging
[ERROR] ==================================
[ERROR]
[ERROR] Dështimet e repository-it "orgtouchbit-1039"
[ERROR] Dështimet e rregullës "signature-staging"
[ERROR] * Nuk ka çelĂ«s publik: ĂelĂ«si me id: (1f42b618d1cbe1b5) nuk u gjet nĂ« <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. Ngarko çelĂ«sin tuaj publik dhe provoni pĂ«rsĂ«ri operacionin.
...
[ERROR] Pastrimi i direktorisë lokale të skenimit pasi një dështim rregullash gjatë mbylljes së repository-ve të skenimit: [orgtouchbit-1039]
[ERROR] * Duke fshirë kontekstin 9043b43f77dcc9.properties
[ERROR] Pastrimi i repository-ve të skenuara larg nga një dështim rregullash gjatë mbylljes së repository-ve të skenimit: [orgtouchbit-1039]
[ERROR] * Duke hequr repository-n e skenimit të dështuar me ID "orgtouchbit-1039" (Dështim rregullash gjatë mbylljes së repository-ve të skenimit: [orgtouchbit-1039]).
[ERROR] Skenimi i largët përfundoi me një dështim: Dështimi i rregullave të skenimit!
[INFO] ------------------------------------------------------------------------
[INFO] Përmbledhja 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ĂRTIMEVE
[INFO] ------------------------------------------------------------------------Si rezultat, na mbetet vetëm një zgjedhje. Ose të fshijmë këtë version ose ta publikojmë.
Pas publikimit, pas disa kohësh artefaktet do të shpërndahen në
off-topic
Më bëri përshtypje që maven indeksonte repository të tjera publike.
Duhej të shtoja robots.txt, sepse ai indeksoi repository-n tim të vjetër.
Përfundim
ĂfarĂ« kemi
- Një projekt të veçantë të deploy-n ku mund të realizohen disa punë CI për ngarkimin e artefakteve në repository të publikuara për gjuhë të ndryshme zhvillimi.
- Projekti i deploy-it është i izoluar nga ndërhyrjet e jashtme dhe mund të ndryshohet vetëm nga përdoruesit me rol Pronari dhe Mantues.
- Një Runner të veçantë me një cache "në funksion" për të ekzekutuar vetëm detyrat e deploy-it.
- Publikimi i versioneve snapshot/release në një repository të publikuar.
- Kontrollim automatik të versionit release për gatishmërinë për publikim në maven central.
- Mbrojtje nga publikimi automatik i versioneve "të papjekura" në maven central.
- Ndërtimi dhe publikimi i versioneve snapshot "me një klik".
- Një repository i vetëm për marrjen e versioneve snapshot/release.
- Pipeline i përgjithshëm për ndërtimin/testimin/publikimin e projektit java.
Konfigurimi i GitLab CI nuk Ă«shtĂ« njĂ« temĂ« aq e komplikuar siç duket nĂ« shikim tĂ« parĂ«. Mjafton ta konfiguroni disa herĂ« CI "nga fillimi" dhe, ja, tashmĂ« nuk jeni njĂ« fillestar nĂ« kĂ«tĂ« fushĂ«. PĂ«r mĂ« tepĂ«r, dokumentacioni i GitLab Ă«shtĂ« mjaft i bollshmĂ«. Mos e frikĂ«soni hapat e parĂ«. RrugĂ«t shfaqen nĂ«n hapat e atyre qĂ« ecin (nuk e mbaj mend kush tha đ ).
Do të isha i lumtur për feedback.
Në artikullin e ardhshëm do të flas për si të konfiguroni GitLab CI për ekzekutimin paralel të detyrave me teste integrimi (me ekzekutimin e shërbimeve që po testohen përmes docker-compose), nëse keni vetëm një shell runner.
Burimi: habr.com
