„GitLab CI“ nustatymas įkelti „Java“ projektą į „maven central“.
Šis straipsnis skirtas „Java“ kūrėjams, kuriems reikia greitai paskelbti savo produktus „Sonatype“ ir (arba) „maven“ centrinėse saugyklose naudojant „GitLab“. Šiame straipsnyje kalbėsiu apie gitlab-runner, gitlab-ci ir maven-plugin nustatymą, kad išspręstumėte šią problemą.
Būtinos sąlygos:
Saugus mvn ir GPG raktų saugojimas.
Saugus viešųjų KI užduočių vykdymas.
Artefaktų (išleidimo / momentinės nuotraukos) įkėlimas į viešąsias saugyklas.
Automatinis leidimo versijų tikrinimas, kad būtų galima paskelbti Maven Central.
Bendras sprendimas artefaktams įkelti į saugyklą keliems projektams.
Išsamus artefaktų paskelbimo Maven Central naudojant Sonatype OSS saugyklos prieglobos paslaugą mechanizmo aprašymas jau aprašytas Šis straipsnis Vartotojas „Googolplex“, todėl į šį straipsnį kreipsiuosi tinkamose vietose.
Išankstinė registracija tel Sonatipas JIRA ir atidarykite bilietą, kad atidarytumėte saugyklą (daugiau informacijos skaitykite skyriuje Sukurkite bilietą „Sonatype JIRA“.). Atidarius saugyklą, prisijungimo / slaptažodžio pora iš JIRA (toliau – Sonatype paskyra) bus naudojama artefaktams įkelti į Sonatype nexus.
Jei naudojate Linux konsolę GPG raktui generuoti (gnupg/gnupg2), turite įdiegti rng-įrankiai entropijai sukurti. Priešingu atveju raktų generavimas gali užtrukti labai ilgai.
Visų pirma, turite sukurti ir sukonfigūruoti projektą, kuriame bus saugomas artefaktų diegimo dujotiekis. Savo projektą pavadinau paprastai ir nesudėtingai - dislokuoti
Sukūrę saugyklą, turite apriboti prieigą, kad galėtumėte pakeisti saugyklą.
Eikite į projektą -> Nustatymai -> Saugykla -> Apsaugotos šakos. Ištriname visas taisykles ir pridedame vieną taisyklę su pakaitos simboliu * su teise stumti ir sujungti tik naudotojams, turintiems priežiūros vaidmenį. Ši taisyklė veiks visiems šio projekto ir grupės, kuriai priklauso šis projektas, naudotojams.
Jei yra keli prižiūrėtojai, geriausias sprendimas būtų iš principo apriboti prieigą prie projekto.
Eikite į projektą -> Nustatymai -> Bendrieji -> Matomumas, projekto funkcijos, leidimai ir nustatykite Projekto matomumą Privatus.
Turiu viešą prieigą prie projekto, nes naudoju savo „GitLab Runner“ ir tik aš turiu prieigą modifikuoti saugyklą. Na, iš tikrųjų aš nesuinteresuotas viešuose vamzdynų žurnaluose rodyti privačią informaciją.
Sugriežtintos saugyklos keitimo taisyklės
Eikite į projektą -> Nustatymai -> Saugykla -> Push Rules ir nustatykite Komiteto apribojimą, Patikrinkite, ar autorius yra GitLab naudotojas. Taip pat rekomenduoju nustatyti įsipareigoti pasirašyti, ir nustatykite žymą Atmesti nepasirašytus įsipareigojimus.
Tada turite sukonfigūruoti paleidiklį, kad paleistumėte užduotis
Eikite į projektas -> Nustatymai -> CI / CD -> Dujotiekio aktyvikliai ir sukurkite naują paleidimo prieigos raktą
Šis prieigos raktas gali būti nedelsiant įtrauktas į bendrą projektų grupės kintamųjų konfigūraciją.
Eikite į grupę -> Nustatymai -> CI / CD -> Kintamieji ir pridėkite kintamąjį DEPLOY_TOKEN su trigerio žetono verte.
Šiame skyriuje aprašoma konfigūracija, kaip vykdyti užduotis diegiant naudojant savo (specifinį) ir viešąjį (bendrąjį) paleidiklį.
Konkretus bėgikas
Naudoju savo bėgikus, nes, visų pirma, tai patogu, greita ir pigu.
Bėgikams rekomenduoju Linux VDS su 1 CPU, 2 GB RAM, 20 GB HDD. Emisijos kaina ~3000₽ per metus.
Mano bėgikas
Bėgikui paėmiau VDS 4 procesorių, 4 GB RAM, 50 GB SSD. Kainavo ~11000 XNUMX ₽ ir niekada dėl to nesigailėjau.
Iš viso turiu 7 mašinas. 5 ant aruba ir 2 ant ihor.
Taigi, mes turime bėgiką. Dabar mes jį nustatysime.
Einame į mašiną per SSH ir įdiegiame java, git, maven, gnupg2.
Sukurkite „maven“ talpyklos katalogą ir priskirkite grupės teises runner
Galite praleisti šį punktą, jei neplanuojate leisti kelių bėgikų vienoje mašinoje.
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!
Tikriname, ar bėgikas užsiregistravęs. Eikite į svetainę gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners suaktyvinti šiam projektui
Sukurkite maven katalogą Saugykla ir nuoroda į talpyklą (neklyskite)
Galite praleisti šį punktą, jei neplanuojate leisti kelių bėgikų vienoje mašinoje.
Pridėkite .gitlab-ci.yml failą į diegimo projekto šaknį
Scenarijus pateikia dvi viena kitą paneigiančias diegimo užduotis. Atitinkamai konkretus bėgikas arba bendras bėgikas.
.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
Jei turite kelių modulių projektą ir jums nereikia įkelti konkretaus modulio į saugyklą, turite pridėti prie šio modulio pom.xml nexus-staging-maven-plugin su vėliava skipNexusStagingDeployMojo
Atsisiuntus momentinės nuotraukos / leidimo versijos yra prieinamos sustojimo saugyklos
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Daugiau pliusų
Labai gausus darbo su „Nexus“ saugykla tikslų sąrašas (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automatinis išleidimo patikrinimas įkeliant į Maven central
Nustačius žymą, atitinkama diegimo projekto užduotis automatiškai suaktyvinama, kad leidimo versija būtų įkelta į nexus (pavyzdys).
Geriausia tai, kad „Nexus“ automatiškai suaktyvinamas uždaras atleidimas.
[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] ------------------------------------------------------------------------
Ir jei kažkas nutiko ne taip, tada užduotis nepavyks
[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] ------------------------------------------------------------------------
Dėl to mums lieka tik vienas pasirinkimas. Ištrinkite šią versiją arba paskelbkite ją.
Po išleidimo, po kurio laiko, artefaktai bus viduje
ne į temą
Man buvo atradimas, kad „maven“ indeksuoja kitas viešąsias saugyklas.
Turėjau įkelti robots.txt, nes jis indeksavo mano seną saugyklą.
Atskiras diegimo projektas, kuriame galite įgyvendinti keletą CI užduočių, skirtų įvairioms kūrimo kalboms įkelti artefaktus į viešąsias saugyklas.
Diegimo projektas yra izoliuotas nuo išorinių trukdžių ir jį gali keisti tik savininko ir prižiūrėtojo vaidmenis turintys vartotojai.
Atskiras konkretus bėgikas su „karšta“ talpykla, skirtas vykdyti tik diegimo užduotis.
Momentinių nuotraukų / leidimo versijų publikavimas viešoje saugykloje.
Automatinis leidimo versijos patikrinimas, ar ji parengta publikuoti Maven Central.
Apsauga nuo automatinio „neapdorotų“ versijų paskelbimo „maven central“.
Sukurkite ir paskelbkite momentines versijas „spustelėjus“.
Viena saugykla momentinių nuotraukų / leidimo versijoms gauti.
Bendras java projekto kūrimo/testavimo/publikavimo vamzdynas.
„GitLab CI“ nustatymas nėra tokia sudėtinga tema, kaip atrodo iš pirmo žvilgsnio. Pakanka porą kartų nustatyti CI raktų principu, o dabar jūs toli gražu nėra mėgėjas šiuo klausimu. Be to, „GitLab“ dokumentacija yra labai nereikalinga. Nebijokite žengti pirmojo žingsnio. Kelias atsiranda po einančio žmogaus laiptais (nepamenu, kas tai pasakė :)
Man bus malonu gauti atsiliepimų.
Kitame straipsnyje parodysiu, kaip nustatyti „GitLab CI“, kad integracijos bandymo užduotis būtų vykdoma konkurencingai (paleisti bandymo paslaugas naudojant „docker-compose“), jei turite tik vieną apvalkalo vykdyklę.