GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central
Šis raksts ir paredzēts Java izstrādātājiem, kuriem ātri jāpublicē savi produkti sonatype un/vai maven centrālajos krātuvēs, izmantojot GitLab. Šajā rakstā es runāšu par gitlab-runner, gitlab-ci un maven-plugin iestatīšanu, lai atrisinātu šo problēmu.
Detalizēts mehānisma apraksts artefaktu publicēšanai Maven Central, izmantojot Sonatype OSS repozitorija mitināšanas pakalpojumu, jau ir aprakstīts Šis raksts lietotājs Googolplex, tāpēc es atsaukšos uz šo rakstu pareizajās vietās.
Iepriekšēja reģistrācija plkst Sonatips JIRA un sāciet biļeti, lai atvērtu repozitoriju (sīkāku informāciju lasiet sadaļā Izveidojiet Sonatype JIRA biļeti). Pēc repozitorija atvēršanas JIRA pieteikšanās/paroles pāris (turpmāk – Sonatype konts) tiks izmantots, lai augšupielādētu artefaktus Sonatype saiknē.
Ja izmantojat Linux konsoli, lai ģenerētu GPG atslēgu (gnupg/gnupg2), jums ir jāinstalē rng-tools lai radītu entropiju. Pretējā gadījumā atslēgu ģenerēšana var aizņemt ļoti ilgu laiku.
Pirmkārt, jums ir jāizveido un jākonfigurē projekts, kurā tiks saglabāts cauruļvads artefaktu izvietošanai. Es savu projektu nosaucu vienkārši un nesarežģīti - izvietot
Pēc repozitorija izveides jums jāierobežo piekļuve, lai mainītu repozitoriju.
Dodieties uz projektu -> Iestatījumi -> Repozitorijs -> Aizsargātās filiāles. Mēs dzēšam visas kārtulas un pievienojam vienu kārtulu ar aizstājējzīmi * ar tiesībām nospiest un apvienot tikai lietotājiem, kuriem ir uzturētāja loma. Šī kārtula darbosies visiem lietotājiem gan šajā projektā, gan grupā, kurai šis projekts pieder.
Ja ir vairāki uzturētāji, tad labākais risinājums būtu principā ierobežot pieeju projektam.
Dodieties uz projektu -> Iestatījumi -> Vispārīgi -> Redzamība, projekta līdzekļi, atļaujas un iestatiet Projekta redzamību uz Privāts.
Man ir publiski pieejams projekts, jo es izmantoju savu GitLab Runner un tikai man ir piekļuve, lai mainītu repozitoriju. Nu, patiesībā manās interesēs nav rādīt privātu informāciju publiskajos cauruļvadu žurnālos.
Stingrāki repozitorija maiņas noteikumi
Dodieties uz projektu -> Iestatījumi -> Repozitorijs -> Push Rules un iestatiet karogus Committer ierobežojums, Pārbaudiet, vai autors ir GitLab lietotājs. Iesaku arī iestatīt apņemas parakstītiesun iestatiet karogu Noraidīt neparakstītas saistības.
Pēc tam jums ir jākonfigurē aktivizētājs, lai palaistu uzdevumus
Dodieties uz projekts -> Iestatījumi -> CI / CD -> Cauruļvada aktivizētāji un izveidojiet jaunu trigeri
Šo marķieri var nekavējoties pievienot vispārējai mainīgo konfigurācijai projektu grupai.
Dodieties uz grupu -> Iestatījumi -> CI / CD -> Mainīgie un pievienojiet mainīgo DEPLOY_TOKEN ar sprūda marķieri vērtībā.
Šajā sadaļā ir aprakstīta konfigurācija uzdevumu izpildei, izvietojot, izmantojot vietējo (specifisko) un publisko (koplietoto) palaidēju.
Konkrēts skrējējs
Es izmantoju savus skrējējus, jo vispirms tas ir ērti, ātri, lēti.
Skrējējiem iesaku Linux VDS ar 1 CPU, 2 GB RAM, 20 GB HDD. Emisijas cena ~ 3000₽ gadā.
Mans skrējējs
Skrējējam paņēmu VDS 4 CPU, 4 GB RAM, 50 GB SSD. Tas maksāja ~11000₽ un nekad to nenožēloju.
Man kopā ir 7 mašīnas. 5 uz arubas un 2 uz ihor.
Tātad, mums ir skrējējs. Tagad mēs to iestatīsim.
Mēs ejam uz mašīnu caur SSH un instalējam java, git, maven, gnupg2.
Izveidojiet maven kešatmiņas direktoriju un piešķiriet grupas tiesības runner
Varat izlaist šo darbību, ja neplānojat vienā mašīnā palaist vairākus skrējējus.
Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
REGISTRATION_TOKEN
Please enter the gitlab-ci description for this runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
Registering runner... succeeded runner=ZvKdjJhx
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Pārbaudiet, vai skrējējs ir reģistrēts. Dodieties uz gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners Activated for this project.
Ekrāns
Pievienot atsevišķi pakalpojumu /etc/systemd/system/gitlab-deployer.service
Mēs ģenerējam atslēgu, atbildot uz jautājumiem. Es izmantoju savu vārdu un e-pastu.
Noteikti norādiet atslēgas paroli. Artefakti tiks parakstīti ar šo atslēgu.
gpg --gen-key
Pārbaude
gpg --list-keys -a
/home/gitlab-deployer/.gnupg/pubring.gpg
----------------------------------------
pub 4096R/00000000 2019-04-19
uid Petruha Petrov <[email protected]>
sub 4096R/11111111 2019-04-19
Notiek mūsu publiskās atslēgas augšupielāde atslēgu serverī
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Izveidojiet maven direktoriju krātuve un saite ar kešatmiņu (nekļūdieties)
Šo soli var izlaist, ja neplānojat ar vienu mašīnu skriet vairākus skrējējus.
Pievienojiet failu .gitlab-ci.yml izvietošanas projekta saknei
Skripts piedāvā divus savstarpēji izslēdzošus izvietošanas uzdevumus. Attiecīgi īpašs skrējējs vai koplietots skrējējs.
.gitlab-ci.yml
stages:
- deploy
Specific Runner:
extends: .java_deploy_template
# Задача будет выполняться на вашем shell-раннере
tags:
- deploy
Shared Runner:
extends: .java_deploy_template
# Задача будет выполняться на публичном docker-раннере
tags:
- docker
# Образ из раздела GitLab Runner -> Shared Runner -> Docker
image: registry.gitlab.com/group/deploy-project:latest
before_script:
# Импортируем GPG ключ
- printf "${GPG_SECRET_KEY}" | gpg --batch --import
# Сохраняем maven конфигурацию
- printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
- printf "${SETTINGS_XML}" > ~/.m2/settings.xml
.java_deploy_template:
stage: deploy
# Задача сработает по триггеру, если передана переменная DEPLOY со значением java
only:
variables:
- $DEPLOY == "java"
variables:
# отключаем клонирование текущего проекта
GIT_STRATEGY: none
script:
# Предоставляем возможность хранения пароля в незашифрованном виде
- git config --global credential.helper store
# Сохраняем временные креды пользователя gitlab-ci-token
# Токен работает для всех публичных проектов gitlab.com и для проектов группы
- echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
# Полностью чистим текущую директорию
- rm -rf .* *
# Клонируем проект который, будем деплоить в Sonatype Nexus
- git clone ${DEPLOY_CI_REPOSITORY_URL} .
# Переключаемся на нужный коммит
- git checkout ${DEPLOY_CI_COMMIT_SHA} -f
# Если хоть один pom.xml содержит параметр autoReleaseAfterClose валим сборку.
# В противном случае есть риск залить сырые артефакты в maven central
- >
for pom in $(find . -name pom.xml); do
if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
exit 1;
fi;
done
# Если параметр DEPLOY_CI_COMMIT_TAG пустой, то принудительно ставим SNAPSHOT-версию
- >
if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
else
VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
if [[ "${VERSION}" == *-SNAPSHOT ]]; then
mvn versions:set -DnewVersion=${VERSION}
else
mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
fi
fi
# Запускаем задачу на сборку и деплой артефактов
- mvn clean deploy -DskipTests=true
Ja jums ir vairāku moduļu projekts un jums nav jāaugšupielādē konkrēts modulis repozitorijā, jums tas ir jāpievieno šī moduļa pom.xml. nexus-staging-maven-plugin ar karogu skipNexusStagingDeployMojo
Pēc momentuzņēmuma/izlaiduma augšupielādes ir pieejamas versijas inscenēšanas krātuves
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Vairāk plusu
Ļoti bagātīgs mērķu saraksts darbam ar nexus repozitoriju (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automātiska izlaišanas pārbaude lejupielādējamībai Maven central
Kad tags ir iestatīts, attiecīgais uzdevums izvietošanas projektā tiek automātiski aktivizēts, lai augšupielādētu laidiena versiju nexus (piemērs).
Labākā daļa ir tāda, ka ciešā atbrīvošana automātiski aktivizējas savienojumā.
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO] * Created staging repository with ID "orgtouchbit-1037".
[INFO] * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Uploading locally staged artifacts to profile org.touchbit
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 9.603 s]
[INFO] test-core .......................................... SUCCESS [ 3.419 s]
[INFO] Shields4J client ................................... SUCCESS [ 9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------
Un, ja kaut kas nogāja greizi, tad uzdevums neizdosies
[INFO] Performing remote staging...
[INFO]
[INFO] * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO] * Created staging repository with ID "orgtouchbit-1038".
[INFO] * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Uploading locally staged artifacts to profile org.touchbit
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "orgtouchbit-1038".
Waiting for operation to complete...
.......
[ERROR] Rule failure while trying to close staging repository with ID "orgtouchbit-1039".
[ERROR]
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR]
[ERROR] Repository "orgtouchbit-1039" failures
[ERROR] Rule "signature-staging" failures
[ERROR] * No public key: Key with id: (1f42b618d1cbe1b5) was not able to be located on <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 4.073 s]
[INFO] test-core .......................................... SUCCESS [ 2.788 s]
[INFO] Shields4J client ................................... SUCCESS [ 3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
Rezultātā mums paliek tikai viena izvēle. Vai dzēsiet šo versiju vai publicējiet.
Pēc izlaišanas, pēc kāda laika, artefakti būs iekšā
ne par tēmu
Man bija atklājums, ka maven indeksē citus publiskos repozitorijus.
Man bija jāaugšupielādē robots.txt, jo tas indeksēja manu veco repozitoriju.
Atsevišķs izvietošanas projekts, kurā varat īstenot vairākus CI uzdevumus, lai augšupielādētu artefaktus publiskajās krātuvēs dažādām izstrādes valodām.
Izvietošanas projekts ir izolēts no ārējiem traucējumiem, un to var mainīt tikai lietotāji ar īpašnieka un uzturētāja lomu.
Atsevišķs īpašs skrējējs ar “karstu” kešatmiņu, lai palaistu tikai izvietošanas uzdevumus.
Automātiska izlaiduma versijas gatavības pārbaude publicēšanai Maven central.
Aizsardzība pret “neapstrādātu” versiju automātisku publicēšanu Maven Central.
Veidojiet un publicējiet momentuzņēmumu versijas “noklikšķinot”.
Viena repozitorija momentuzņēmumu/izlaiduma versiju iegūšanai.
Vispārējs cauruļvads Java projekta izveidei/testēšanai/publicēšanai.
GitLab CI iestatīšana nav tik sarežģīta tēma, kā šķiet no pirmā acu uzmetiena. Pietiek pāris reizes iestatīt CI pēc atslēgas principa, un tagad jūs šajā jautājumā esat tālu no amatiera. Turklāt GitLab dokumentācija ir ļoti lieka. Nebaidieties spert pirmo soli. Ceļš parādās zem ejošā cilvēka soļiem (neatceros, kurš to teica :)
Priecāšos par atsauksmēm.
Nākamajā rakstā es jums parādīšu, kā iestatīt GitLab CI, lai konkurētspējīgi izpildītu integrācijas testa uzdevumus (palaist testa pakalpojumus ar docker-compose), ja jums ir tikai viens čaulas palaidējs.