ProHoster > Blog > uprava > Postavljanje GitLab CI za prijenos java projekta na maven central
Postavljanje GitLab CI za prijenos java projekta na maven central
Ovaj je članak namijenjen Java programerima koji trebaju brzo objaviti svoje proizvode u sonatype i/ili maven središnjim spremištima pomoću GitLaba. U ovom ću članku govoriti o postavljanju gitlab-runnera, gitlab-ci i maven-plugina za rješavanje ovog problema.
Preduvjeti:
Sigurno skladištenje mvn i GPG ključeva.
Sigurno izvršavanje javnih CI zadataka.
Prijenos artefakata (izdanje/snimak) u javna spremišta.
Automatska provjera verzija izdanja za objavljivanje u maven centrali.
Općenito rješenje za učitavanje artefakata u repozitorij za više projekata.
Detaljan opis mehanizma za objavljivanje artefakata u Maven Central putem Sonatype OSS Repository Hosting Service već je opisan u ovaj članak korisnik googolplex, pa ću se referirati na ovaj članak na pravim mjestima.
Predbilježbe na Sonatip JIRA i pokrenite ulaznicu za otvaranje spremišta (za više detalja pročitajte odjeljak Izradite kartu Sonatype JIRA). Nakon otvaranja repozitorija, JIRA par prijava/lozinka (u daljnjem tekstu Sonatype račun) koristit će se za učitavanje artefakata na Sonatype nexus.
Ako koristite Linux konzolu za generiranje GPG ključa (gnupg/gnupg2), tada trebate instalirati RNG-alati za stvaranje entropije. U suprotnom, generiranje ključa može potrajati jako dugo.
Prije svega, morate stvoriti i konfigurirati projekt u kojem će se cjevovod pohraniti za implementaciju artefakata. Svoj sam projekt nazvao jednostavno i nekomplicirano - razviti
Nakon stvaranja repozitorija, morate ograničiti pristup za promjenu repozitorija.
Idite na projekt -> Postavke -> Repozitorij -> Zaštićene grane. Brišemo sva pravila i dodajemo jedno pravilo sa zamjenskim znakom * s pravom guranja i spajanja samo za korisnike s ulogom održavatelja. Ovo pravilo će raditi za sve korisnike i ovog projekta i grupe kojoj ovaj projekt pripada.
Ako postoji više održavatelja, onda bi najbolje rješenje bilo načelno ograničiti pristup projektu.
Idite na projekt -> Postavke -> Općenito -> Vidljivost, značajke projekta, dopuštenja i postavite vidljivost projekta na Privatni.
Imam projekt u javnom pristupu, budući da koristim vlastiti GitLab Runner i samo ja imam pristup modificiranju repozitorija. Pa, zapravo nije u mom interesu prikazivati privatne podatke u javnim zapisnicima cjevovoda.
Pooštravanje pravila za promjenu repozitorija
Idite na projekt -> Postavke -> Repozitorij -> Push Rules i postavite zastavice Ograničenje predavača, Provjerite je li autor korisnik GitLaba. Također preporučujem postavljanje izvršiti potpisivanje, i postavite oznaku Odbaci nepotpisane obveze.
Zatim trebate konfigurirati okidač za pokretanje zadataka
Idite na projekt -> Postavke -> CI / CD -> Okidači cjevovoda i izradite novi token okidača
Ovaj se token može odmah dodati općoj konfiguraciji varijabli za grupu projekata.
Idite na grupu -> Postavke -> CI / CD -> Varijable i dodajte varijablu DEPLOY_TOKEN s trigger-tokenom u vrijednosti.
Ovaj odjeljak opisuje konfiguraciju za pokretanje zadataka pri implementaciji pomoću izvornog (specifičnog) i javnog (dijeljenog) pokretača.
Specifični trkač
Koristim vlastite trkače, jer je prije svega zgodno, brzo, jeftino.
Za trkače preporučujem Linux VDS s 1 CPU, 2 GB RAM-a, 20 GB HDD. Cijena izdavanja ~ 3000₽ godišnje.
Moj trkač
Za runner sam uzeo VDS 4 CPU, 4 GB RAM-a, 50 GB SSD. Koštao je ~11000₽ i nikada nisam požalio.
Imam ukupno 7 mašina. 5 na arubi i 2 na ihoru.
Dakle, imamo trkača. Sada ćemo to postaviti.
Idemo na stroj preko SSH-a i instaliramo java, git, maven, gnupg2.
Stvorite direktorij za maven cache i dodijelite grupna prava runner
Ovaj korak možete preskočiti ako ne planirate pokretati više runnera na istom stroju.
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!
Provjerite je li trkač registriran. Idite na gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners aktivirani za ovaj projekt
Generiramo ključ odgovarajućim na pitanja. Koristio sam svoje ime i e-mail.
Obavezno navedite lozinku za ključ. Artefakti će biti potpisani ovim ključem.
gpg --gen-key
Provjeravanje
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
Prijenos našeg javnog ključa na poslužitelj ključeva
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Stvorite maven direktorij Skladište i povezati s predmemorijom (da ne bude greške)
Ovaj se korak može preskočiti ako ne planirate pokrenuti nekoliko runnera na istom stroju.
Dodajte datoteku .gitlab-ci.yml u korijen projekta implementacije
Skripta predstavlja dva međusobno isključiva zadatka postavljanja. Određeni trkač ili zajednički trkač.
.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
Ako imate projekt s više modula i ne trebate učitati određeni modul u repozitorij, tada trebate dodati u pom.xml ovog modula nexus-staging-maven-plugin sa zastavom skipNexusStagingDeployMojo
Nakon učitavanja snimke/izdanja verzije su dostupne u scenska spremišta
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Više pluseva
Vrlo bogat popis ciljeva za rad s nexus repozitorijem (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automatsko izdanje provjerava mogućnost preuzimanja u maven centrali
Kada je oznaka postavljena, automatski se pokreće odgovarajući zadatak u projektu implementacije za prijenos verzije izdanja na nexus (primjer).
Najbolji dio je što se zatvaranje automatski aktivira u nexusu.
[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] ------------------------------------------------------------------------
A ako je nešto pošlo po zlu, zadatak neće uspjeti
[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] ------------------------------------------------------------------------
Kao rezultat toga, ostaje nam samo jedan izbor. Ili izbrišite ovu verziju ili objavite.
Nakon izlaska, nakon nekog vremena, artefakti će biti unutra
offtopic
Za mene je bilo otkriće da maven indeksira druga javna spremišta.
Morao sam učitati robots.txt jer je indeksirao moje staro spremište.
Zaseban implementacijski projekt u kojem možete implementirati nekoliko CI zadataka za učitavanje artefakata u javna spremišta za različite razvojne jezike.
Projekt implementacije izoliran je od vanjskih smetnji i mogu ga mijenjati samo korisnici s ulogama vlasnika i održavatelja.
Zasebni Specific Runner s "vrućom" predmemorijom za pokretanje samo zadataka implementacije.
Objava verzija snimke/izdanja u javnom repozitoriju.
Automatska provjera spremnosti verzije izdanja za objavljivanje u maven centrali.
Zaštita od automatskog objavljivanja "sirovih" verzija u maven centrali.
Izradite i objavite verzije snimki "na klik".
Jedno spremište za dobivanje verzija snimke/izdanja.
Opći cjevovod za izgradnju / testiranje / objavljivanje java projekta.
Postavljanje GitLab CI nije tako komplicirana tema kao što se na prvi pogled čini. Dovoljno je nekoliko puta postaviti CI po principu "ključ u ruke", a sada ste daleko od amatera po ovom pitanju. Štoviše, GitLab dokumentacija je vrlo suvišna. Nemojte se bojati napraviti prvi korak. Cesta se pojavljuje ispod koraka osobe koja hoda (ne sjećam se tko je to rekao :)
Bit će mi drago povratnim informacijama.
U sljedećem ću vam članku pokazati kako postaviti GitLab CI za konkurentno pokretanje zadataka testa integracije (izvođenje testnih usluga s docker-compose) ako imate samo jedan pokretač ljuske.