Tento článok je určený pre vývojárov jazyka Java, ktorí potrebujú rýchlo publikovať svoje produkty v repozitároch Sonatype a/alebo Maven Central pomocou GitLab. V tomto článku popíšem nastavenie gitlab-runner, gitlab-ci a maven-plugin na vyriešenie tejto úlohy.
Predpoklady:
- Bezpečné uchovávanie kľúčov mvn a GPG.
- Bezpečné vykonávanie verejných CI úloh.
- Nahrávanie artefaktov (release/snapshot) do verejných repozitárov.
- Automatická kontrola release verzií na publikovanie v Maven Central.
- Celkovo riešenie na nahrávanie artefaktov do repozitára pre viacero projektov.
- Jednoduchosť a pohodlnosť používania.
Obsah
Základné informácie
- Podrobné opísanie mechanizmu publikovania artefaktov v Maven Central cez službu Sonatype OSS Repository Hosting Service už bolo uvedené v užívateľom , preto v potrebných miestach budem odkazovať na tento článok.
- Predtým sa zaregistrujeme na a vytvoríme tiket na otvorenie repozitára (podrobnejšie čítajte v sekcii ). Po otvorení repozitára sa pár prihlasovacích údajov / hesla z JIRA (ďalej účet Sonatype) použije na nahrávanie artefaktov do Sonatype nexus.
- Ďalej je proces generovania GPG kľúča opísaný veľmi stručne. Podrobnejšie pozrite sekciu
- Ak používate Linux konzolu na generovanie GPG kľúča (gnupg/gnupg2), je potrebné nainštalovať na generovanie entropie. Inak môže generovanie kľúča prebiehať veľmi pomaly.
- Služby ukladania verejných GPG kľúčov
Nastavenie deploy projektu v GitLab
- V prvom rade je potrebné vytvoriť a nastaviť projekt, v ktorom sa bude uchovávať pipeline pre nasadenie artefaktov. Môj projekt som nazval jednoducho —
- Po vytvorení repozitára je potrebné obmedziť prístup na zmenu repozitára.
Prejdite na projekt -> Nastavenia -> Repozitár -> Chránené vetvy. Odstráňte všetky pravidlá a pridajte jedinú jednu pravidlo s Wildcard * s právom na push a merge len pre používateľov s rolou Maintainers. Toto pravidlo bude fungovať pre všetkých používateľov ako tohto projektu, tak aj skupiny, do ktorej tento projekt patrí.
- Ak je viacero údržbárov, najlepším riešením je obmedziť prístup k projektu ako takému.
Prejdeme do projektu -> Nastavenia -> Všeobecné -> Viditeľnosť, funkcie projektu, povolenia a nastavíme viditeľnosť projektu na Private.
Mám projekt v verejnom prístupe, pretože používam svoj vlastný GitLab Runner a prístup na úpravu repozitára mám len ja. A samozrejme, nie je v mojich záujmoch zverejňovať súkromné informácie vo verejných pipeline logoch. - Zvýšenie prísnosti pravidiel na zmenu repozitára
Prejdeme do projektu -> Nastavenia -> Repozitár -> Pravidlá push a nastavíme parametre Obmedzenie commitera, Skontrolovať, či je autor používateľom GitLab. Taktiež odporúčam nastaviť , a nastaviť parameter Zamietnuť nepodpísané commity. - Ďalej je potrebné nastaviť spúšťač na spustenie úloh
Prejdeme do projektu -> Nastavenia -> CI / CD -> Spúšťače pipeline a vytvoríme nový token spúšťača
Tento token môžeme ihneď pridať do spoločnej konfigurácie premenných pre skupinu projektov.
Prejdeme do skupiny -> Nastavenia -> CI / CD -> Premenné a pridáme premennúDEPLOY_TOKENs hodnotou tokenu spúšťača.
GitLab Runner
V tejto sekcii je opísaná konfigurácia na spustenie úloh na deploy s využitím vlastného (Specific) a verejného (Shared) runnera.
Špecifický Runner
Používam vlastné runnery, pretože je to predovšetkým pohodlné, rýchle a lacné.
Pre runner odporúčam linuxový VDS s 1 CPU, 2 GB RAM, 20 GB HDD. Cena je približne 3000₽ za rok.
Môj runner
Pre runner som vzal VDS 4 CPU, 4 GB RAM, 50 GB SSD. Stál ma približne 11000₽ a ani raz som toho neľutoval.
Mám celkovo 7 strojov. 5 na aruba a 2 na ihor.
Takže máme runner. Teraz ho budeme nastavovať.
Prihlásime sa na stroj cez SSH a nainštalujeme java, git, maven, gnupg2.
Nainštalujeme gitlab runner
- Vytvoríme novú skupinu
runnersudo groupadd runner - Vytvoríme adresár pre cache maven a nastavíme práva skupiny
runner
Tento krok je možné preskočiť, ak neplánujete spúšťať viacero runnerov na jednom stroji.mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache - Vytvárame používateľa
gitlab-deployera pridáme do skupinyrunneruseradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer - Pridáme do súboru
/etc/ssh/sshd_configtúto vetuAllowUsers root@* gitlab-deployer@127.0.0.1 - Reštartujeme
sshdsystemctl restart sshd - Nastavíme heslo pre používateľa
gitlab-deployer(môže byť jednoduché, pretože platí obmedzenie pre localhost)passwd gitlab-deployer - Nainštalujeme 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 - Prejdeme na stránku gitlab.com -> deploy-project -> Nastavenia -> CI/CD -> Runners -> Špecifické runneri a skopírujeme registration token
Snímek
- Registrujeme runner
gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml
Proces
Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Prosím, zadajte URL koordinátora gitlab-ci (napríklad https://gitlab.com/):
https://gitlab.com/
Prosím, zadajte token gitlab-ci pre tento runner:
REGISTRATION_TOKEN
Prosím, zadajte popis gitlab-ci pre tento runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Prosím, zadajte tagy gitlab-ci pre tento runner (oddelené čiarkou):
deply
Registrácia runnera... úspešná runner=ZvKdjJhx
Prosím, zadajte executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner bol úspešne registrovaný. Môžete ho spustiť, ale ak už beží, konfigurácia by sa mala automaticky načítať!- Kontrolujeme, či je runner registrovaný. Prejdeme na stránku gitlab.com -> deploy-project -> Nastavenia -> CI/CD -> Runners -> Špecifické runneri -> Runners aktivované pre tento projekt
Snímek
- Pridávame samostatný služba
/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 - Spúšťame službu.
systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service - Kontrolujeme, či je runner spustený.
Príklad
Generovanie GPG kľúčov
- Z tej istej mašiny sa prihlásime cez ssh ako používateľ
gitlab-deployer(to je dôležité pre generovanie GPG kľúča)ssh gitlab-deployer@127.0.0.1 - Generujeme kľúč odpovedajúc na otázky. Použil som svoje vlastné meno a email.
Nezabudneme uviesť heslo pre kľúč. Týmto kľúčom sa budú podpisovať artefakty.gpg --gen-key - Overujeme
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 - Nahrávame náš verejný kľúč na server kľúčov
gpg --keyserver keys.gnupg.net --send-key 00000000 gpg: sending key 00000000 to hkp server keys.gnupg.net
Nastavenie Maven
- Prihlásime sa ako používateľ
gitlab-deployersu gitlab-deployer - Vytvárame adresár maven repository a prepojujeme s cache (nespomýlť sa)
Tento krok môžeme preskočiť, ak neplánujete spúšťať niekoľko runnerov na jednej mašine.mkdir -p ~/.m2/repository ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository - Vytvárame hlavný kľúč
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Vytvárame súbor ~/.m2/settings-security.xml
{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Šifrujeme heslo účtu Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - Vytvárame súbor ~/.m2/settings.xml
env true GPG_SECRET_KEY_PASSPHRASE sonatype SONATYPE_USERNAME {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
kde,
GPG_SECRET_KEY_PASSPHRASE — heslo pre GPG kľúč
SONATYPE_USERNAME — prihlásenie do účtu Sonatype
Týmto je nastavenie bežca dokončené, môžeme prejsť na sekciu
Zdieľaný Runner
Generovanie GPG kľúčov
- Najprv musíme vytvoriť GPG kľúč. Na to nainštalujeme gnupg.
yum install -y gnupg - Generujeme kľúč a odpovedáme na otázky. Použil som vlastné meno a e-mail. Nezabudnite zadať heslo pre kľúč.
gpg --gen-key - Zobrazujeme informácie o kľúči
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] - Nahrávame náš verejný kľúč na server kľúčov
gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 gpg: odosielanie kľúča 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 na hkp server keys.gnupg.net - Získavame súkromný kľúč
gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 -----BEGIN PGP PRIVATE KEY BLOCK----- lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5 ... =2Wd2 -----END PGP PRIVATE KEY BLOCK----- - Prejdite do nastavení projektu -> Nastavenia -> CI / CD -> Premenné a uložte súkromný kľúč do premennej
GPG_SECRET_KEY
Nastavenie Maven
- Vytvárame hlavný kľúč
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Prejdite do nastavení projektu -> Nastavenia -> CI / CD -> Premenné a uložte do premennej
SETTINGS_SECURITY_XMLnasledujúce riadky:{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Šifrujeme heslo účtu Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - Prejdite do nastavení projektu -> Nastavenia -> CI / CD -> Premenné a uložte do premennej
SETTINGS_XMLnasledujúce riadky:env true GPG_SECRET_KEY_PASSPHRASE sonatype sonatype_username {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
kde,
GPG_SECRET_KEY_PASSPHRASE — heslo pre GPG kľúč
SONATYPE_USERNAME — prihlásenie do účtu Sonatype
Nasadenie docker obrazu
- Vytvárame dostatočne jednoduchý Dockerfile pre spustenie úloh na nasadzovaní s požadovanou verziou Javy. Nižšie je uvedený príklad pre 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/ - Skladáme kontajner pre váš projekt
docker build -t registry.gitlab.com/group/deploy . - Autentifikujeme sa a nahráme kontajner do registry.
docker login -u USER -p PASSWORD registry.gitlab.com docker push registry.gitlab.com/group/deploy
GitLab CI
Nasadenie projektu
Pridávame do koreňového adresára deploy-projektu súbor .gitlab-ci.yml
V skripte sú predstavené dve vzájomne sa vylučujúce úlohy na nasadenie. Specific Runner alebo Shared Runner podľa potreby.
.gitlab-ci.yml
stages:
- deploy
Specific Runner:
extends: .java_deploy_template
# Úloha sa vykoná na vašom shell-účastníkovi
tags:
- deploy
Shared Runner:
extends: .java_deploy_template
# Úloha sa vykoná na verejnom docker-účastníkovi
tags:
- docker
# Obrázok z časti GitLab Runner -> Shared Runner -> Docker
image: registry.gitlab.com/group/deploy-project:latest
before_script:
# Importujeme GPG kľúč
- printf "${GPG_SECRET_KEY}" | gpg --batch --import
# Ukladáme maven konfiguráciu
- printf "${SETTINGS_SECURITY_XML}" > ~/\.m2/settings-security.xml
- printf "${SETTINGS_XML}" > ~/\.m2/settings.xml
.java_deploy_template:
stage: deploy
# Úloha sa spustí podľa spúšťacieho signálu, ak je odovzdaná premenná DEPLOY s hodnotou java
only:
variables:
- $DEPLOY == "java"
variables:
# Vypneme klonovanie aktuálneho projektu
GIT_STRATEGY: none
script:
# Umožňujeme uchovanie hesla v nezašifrovanej podobe
- git config --global credential.helper store
# Ukladáme dočasné kredity používateľa gitlab-ci-token
# Token funguje pre všetky verejné projekty gitlab.com a pre projekty skupiny
- echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/\.git-credentials
# Úplne čistí aktuálny adresár
- rm -rf .* *
# Klonujeme projekt, ktorý budeme nasadzovať do Sonatype Nexus
- git clone ${DEPLOY_CI_REPOSITORY_URL} .
# Prepíname sa na požadovaný komit
- git checkout ${DEPLOY_CI_COMMIT_SHA} -f
# Ak aspoň jeden pom.xml obsahuje parameter autoReleaseAfterClose, zrušíme zostavenie.
# V opačnom prípade hrozí riziko nahrania surových artefaktov do maven central
- >
for pom in $(find . -name pom.xml); do
if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
echo "Súbor $pom obsahuje zakázané nastavenie: ";
exit 1;
fi;
done
# Ak je parameter DEPLOY_CI_COMMIT_TAG prázdny, násilne nastavíme SNAPSHOT-verziu
- >
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
# Spúšťame úlohu na zostavenie a nasadenie artefaktov
- mvn clean deploy -DskipTests=trueProjekt Java
V java projektoch, ktoré sa predpokladajú nahrať do verejných repozitárov, je potrebné pridať 2 kroky na nahranie Release a Snapshot verzií.
.gitlab-ci.yml
stages:
- build
- test
- verify
- deploy
Release:
extends: .trigger_deploy
# Spustiť úlohu iba cez tag.
only:
- tags
Snapshot:
extends: .trigger_deploy
# Spúšťame úlohu na publikovanie SNAPSHOT verzie manuálne
when: manual
# Nespúšťať úlohu, ak je nastavený tag.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# Vypíname klonovanie aktuálneho projektu
GIT_STRATEGY: none
# Odkaz na trigger nasadzovacej úlohy
URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
# Premenné nasadzovacej úlohy
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:
# Nepoužívam cURL, pretože s príznakmi --fail --show-error
# nevytlačí telo odpovede, ak je HTTP kód 400 a vyšší
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}V tomto riešení som išiel o krok ďalej a rozhodol som sa použiť jeden CI šablón pre java projekty.
Podrobnejšie
Vytvoril som samostatný projekt v ktorom som umiestnil CI šablónu pre java projekty .
common.yml
stages:
- build
- test
- verify
- deploy
variables:
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 day
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 day
paths:
- "*\/target\/reports"
.junit_test_run:
stage: test
tags:
- touchbit-shell
script:
- mvn test
artifacts:
when: always
expire_in: 30 day
paths:
- "*\/target\/reports"
.sonar_review:
stage: verify
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=$SONOR_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
V dôsledku toho vyzerá súbor .gitlab-ci.yml v samotných java projektoch veľmi kompaktne a nie príliš slovne.
.gitlab-ci.yml
include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml
Shields4J:
extends: .build_java_project
Dokumentácia Sphinx:
extends: .build_sphinx_doc
variables:
DOCKERFILE: .docs/Dockerfile
Sonar recenzia:
extends: .sonar_review
dependencies:
- Shields4J
Release:
extends: .trigger_release_deploy
Snapshot:
extends: .trigger_snapshot_deployKonfigurácia pom.xml
Toto téma je veľmi podrobne opísaná. v , preto opíšem niektoré nuansy používania pluginov. Rovnako opíšem, ako jednoducho a bez námahy je možné ich použiť. nexus-staging-maven-plugin, ak nechcete alebo nemôžete použiť org.sonatype.oss:oss-parent ako rodiča pre svoj projekt.
maven-install-plugin
Inštaluje moduly do lokálneho repozitára.
Veľmi užitočné na lokálne overenie riešení v iných projektoch, ako aj pre kontrolný súčet.
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
Generovanie javadoc pre projekt.
org.apache.maven.plugins
maven-javadoc-plugin
jar
prepare-package
true
true
falseAk máte modul, ktorý neobsahuje java (napríklad iba zdroje),
Alebo ak nechcete v zásade generovať javadoc, potom vám pomôže 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
Konfigurácia:
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/Ak máte viacmodulový projekt a nemusíte konkrétny modul nahrávať do repozitára, je potrebné pridať do pom.xml tohto modulu nexus-staging-maven-plugin s príznakom skipNexusStagingDeployMojo
org.sonatype.plugins
nexus-staging-maven-plugin
truePo nahratí sú verzie snapshot/release dostupné v
SonatypeNexus
https://oss.sonatype.org/content/groups/staging/
Ďalšie výhody
- Veľmi bohatý zoznam cieľov pre prácu s nexus repozitárom (
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin). - Automatická kontrola vydania na možnosti nahratia do maven central
Výsledok
Publikovanie SNAPSHOT verzie
Pri zostavovaní projektu existuje možnosť manuálneho spustenia úlohy na nahranie SNAPSHOT verzie do nexus
Pri spustení tejto úlohy sa spustí zodpovedajúca úloha v projekte deploy ().
Orezané logy
Spúšťanie s gitlab-runner 11.10.0 (3001a600)
na Deploy runner JSKWyxUw
Používam Shell executor...
Spúšťam na ih1174328.vds.myihor.ru...
Preskakujem nastavenie Git repozitára
Preskakujem Git checkout
Preskakujem nastavenie Git submodulov
$ 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} .
Klonujem do 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Poznámka: kontrola '850f86aa317194395c5387790da1350e437125a7'.
Nachádzate sa v stave 'odpojená hlava'. Môžete sa poobzerať, robiť experimentálne
zmeny a ukladať ich, a môžete zrušiť akékoľvek úpravy, ktoré vykonáte v tomto
stave bez ovplyvnenia akýchkoľvek vetiev vykonaním ďalšieho checkoutu.
Ak chcete vytvoriť novú vetvu, aby ste si udržali zmeny, môžete
tak spraviť (teraz alebo neskôr) pomocou -b s príkazom checkout znova. Príklad:
git checkout -b new_branch_name
HEAD je teraz na 850f86a... preskočiť test nasadenia-core
$ for pom in $(find . -name pom.xml); do # zložený viacriadkový príkaz
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # zložený viacriadkový príkaz
[INFO] Skenovanie projektov...
[INFO] Kontrola zostavenia s celkovým počtom 4 modulov...
[INFO] Inštalácia funkcií Nexus Staging:
[INFO] ... celkovo 4 vykonania maven-deploy-plugin nahradené nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Poradie Reactor Build:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Klient Shields4J [jar]
[INFO] TestNG listener [jar]
[INFO]
[INFO] -----------------------------
[INFO] Vytváranie Shields4J 1.0.0 [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Hľadanie miestneho agregátora...
[INFO] Miestny agregačný koreň: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Spracovanie zmeny org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Spracovanie org.touchbit.shields4j:shields4j-parent
[INFO] Aktualizácia projektu org.touchbit.shields4j:shields4j-parent
[INFO] z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO]
[INFO] Spracovanie org.touchbit.shields4j:client
[INFO] Aktualizácia nadradeného org.touchbit.shields4j:shields4j-parent
[INFO] z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO] Aktualizácia závislosti org.touchbit.shields4j:test-core
[INFO] z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO]
[INFO] Spracovanie org.touchbit.shields4j:test-core
[INFO] Aktualizácia nadradeného org.touchbit.shields4j:shields4j-parent
[INFO] z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO]
[INFO] Spracovanie org.touchbit.shields4j:testng
[INFO] Aktualizácia nadradeného org.touchbit.shields4j:shields4j-parent
[INFO] z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO] Aktualizácia závislosti org.touchbit.shields4j:client
[INFO] z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO] Aktualizácia závislosti org.touchbit.shields4j:test-core
[INFO] z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Zhrnutie Reactor:
[INFO]
[INFO] Shields4J 1.0.0 .................................... ÚSPECH [ 0.992 s]
[INFO] test-core .......................................... PRESKOČENÉ
[INFO] Klient Shields4J ................................... PRESKOČENÉ
[INFO] TestNG listener 1.0.0 .............................. PRESKOČENÉ
[INFO] ------------------------------------------------------------------------
[INFO] ZOSTAVENIE ÚSPEŠNÉ
[INFO] ------------------------------------------------------------------------
[INFO] Celkový čas: 2.483 s
[INFO] Dokončené o: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Skenovanie projektov...
[INFO] Kontrola zostavenia s celkovým počtom 4 modulov...
[INFO] Inštalácia funkcií Nexus Staging:
[INFO] ... celkovo 4 vykonania maven-deploy-plugin nahradené nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Poradie Reactor Build:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Klient Shields4J [jar]
[INFO] TestNG listener [jar]
[INFO]
[INFO] -----------------------------
[INFO] Vytváranie Shields4J 1.0.0-SNAPSHOT [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
ZMAZANÉ
...
[INFO] * Hromadné nasadenie miestne zhromaždených snapshot artefaktov skončilo.
[INFO] Diaľkové nasadenie úspešne dokončené.
[INFO] ------------------------------------------------------------------------
[INFO] Zhrnutie Reactor:
[INFO]
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... ÚSPECH [ 2.375 s]
[INFO] test-core .......................................... ÚSPECH [ 3.929 s]
[INFO] Klient Shields4J ................................... ÚSPECH [ 3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... ÚSPECH [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] ZOSTAVENIE ÚSPEŠNÉ
[INFO] ------------------------------------------------------------------------
[INFO] Celkový čas: 47.629 s
[INFO] Dokončené o: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------Výsledkom je, že do nexus bola načítaná verzia .
Všetky snapshot verzie je možné odstrániť z repozitára na stránke pod svojím účtom.
Publikovanie release verzie
Pri inštalácii tagu sa automaticky spustí zodpovedajúca úloha v projekte deploy na nahranie stabilnej verzie do nexus ().
Najpríjemnejšie je, že sa automaticky spustí close release v nexus.
[INFO] Prebieha vzdialené staging...
[INFO]
[INFO] * Vzdialené staging do profile ID "9043b43f77dcc9"
[INFO] * Vytvorený staging repozitár s ID "orgtouchbit-1037".
[INFO] * Staging repozitár na https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Nahrávanie lokálne staged artefaktov do profilu org.touchbit
[INFO] * Nahrávanie lokálne staged artefaktov dokončené.
[INFO] * Zatváranie staging repozitára s ID "orgtouchbit-1037".
Čakanie na dokončenie operácie...
.........
[INFO] Vzdialene staged 1 repozitár, skončené úspešne.
[INFO] ------------------------------------------------------------------------
[INFO] Zhrnutie reactor:
[INFO]
[INFO] Shields4J 1.0.0 .................................... ÚSPECH [ 9.603 s]
[INFO] test-core .......................................... ÚSPECH [ 3.419 s]
[INFO] Shields4J klient ................................... ÚSPECH [ 9.793 s]
[INFO] TestNG listener 1.0.0 .............................. ÚSPECH [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] VÝSTAVBA ÚSPECH
[INFO] ------------------------------------------------------------------------
[INFO] Celkový čas: 01:47 min
[INFO] Dokončené o: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------A ak sa niečo pokazí, úloha sa určite zruší
[INFO] Vykonáva sa vzdialené zscénovanie...
[INFO]
[INFO] * Vzdialené zscénovanie do profilu zscénovania ID "9043b43f77dcc9"
[INFO] * Vytvorený zscénovaný repozitár s ID "orgtouchbit-1038".
[INFO] * Zscénovaný repozitár na https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Nahrávanie lokálne zscénovaných artefaktov do profilu org.touchbit
[INFO] * Nahrávanie lokálne zscénovaných artefaktov dokončené.
[INFO] * Uzatváranie zscénovaného repozitára s ID "orgtouchbit-1038".
Čakanie na dokončenie operácie...
.......
[ERROR] Zlyhanie pravidla pri pokuse o uzatvorenie zscénovaného repozitára s ID "orgtouchbit-1039".
[ERROR]
[ERROR] Správa o zlyhaní pravidiel zscénovania Nexus
[ERROR] ==================================
[ERROR]
[ERROR] Zlyhania repozitára "orgtouchbit-1039"
[ERROR] Zlyhania pravidla "signature-staging"
[ERROR] * Chýbajúci verejný kľúč: Kľúč s ID: (1f42b618d1cbe1b5) nebolo možné nájsť na http://keys.gnupg.net:11371/. Nahráť svoj verejný kľúč a skúsiť operáciu znova.
...
[ERROR] Čistenie lokálneho adresára zscénovania po zlyhaní pravidla pri uzatváraní zscénovaných repozitárov: [orgtouchbit-1039]
[ERROR] * Odstraňovanie kontextu 9043b43f77dcc9.properties
[ERROR] Čistenie vzdialených zscénovaných repozitárov po zlyhaní pravidla pri uzatváraní zscénovaných repozitárov: [orgtouchbit-1039]
[ERROR] * Zrušenie zlyhaného zscénovaného repozitára s ID "orgtouchbit-1039" (Zlyhanie pravidla pri uzatváraní zscénovaných repozitárov: [orgtouchbit-1039]).
[ERROR] Vzdialené zscénovanie skončilo s chybou: Zlyhanie pravidiel zscénovania!
[INFO] ------------------------------------------------------------------------
[INFO] Prehľad reaktora:
[INFO]
[INFO] Shields4J 1.0.0 .................................... ÚSPECH [ 4.073 s]
[INFO] test-core .......................................... ÚSPECH [ 2.788 s]
[INFO] Shields4J klient ................................... ÚSPECH [ 3.962 s]
[INFO] TestNG poslucháč 1.0.0 .............................. ZLYHANIE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] CHYBA REALIZÁCIE
[INFO] ------------------------------------------------------------------------Zostáva nám len jedna voľba. Buď odstrániť túto verziu, alebo ju publikovať.
Po vydaní, po určitom čase, sa artefakty ocitnú v
off-topic
Bolo pre mňa prekvapením, že maven indexuje iné verejné repozitáre.
Musel som pridať robots.txt, pretože indexoval môj starý repozitár.
Záver
Čo máme
- Samostatný deploy-projekt, v ktorom je možné realizovať viacero CI úloh na nahrávanie artefaktov do verejných repozitárov pre rôzne programovacie jazyky.
- Deploy-projekt je izolovaný od vonkajších zásahov a môže byť menený iba používateľmi s rolou Owner a Maintainer.
- Samostatný Specific Runner s "horúcou" cache pre spúšťanie len deploy úloh.
- Publikovanie snapshot/release verzií vo verejnom repozitári.
- Automatická kontrola release verzie na pripravenosť na publikovanie v maven central.
- Ochrana pred automatickým publikovaním "nedokončených" verzií v maven central.
- Zostavenie a publikovanie snapshot verzií "na kliknutie".
- Jednotný repozitár pre získanie snapshot/release verzií.
- Celkový proces na zostavenie/testovanie/publikovanie java projektu.
Nastavenie GitLab CI nie je taká zložitá téma, ako sa na prvý pohľad zdá. Stačí párkrát nastaviť CI „na kľúč“ a už nie si len začiatočník v tejto oblasti. A navyše je dokumentácia GitLab veľmi obsiahla. Nebojte sa urobiť prvý krok. Cesta vzniká pod krokmi kráčajúceho (nepamätám si, kto to povedal 🙂 ).
Budem rád za spätnú väzbu.
V ďalšom článku sa podelím o to, ako nastaviť GitLab CI pre paralelné spúšťanie úloh s integračnými testami (s spúšťaním testovaných služieb pomocou docker-compose), pokiaľ máte len jeden shell runner.
Zdroj: habr.com
