Podešavanje GitLab CI za učitavanje java projekta na maven central
Ovaj članak je namijenjen java programerima koji trebaju brzo objaviti svoje proizvode u sonatype i/ili maven centralnim spremištima koristeći GitLab. U ovom članku ću govoriti o postavljanju gitlab-runnera, gitlab-ci i maven-plugina za rješavanje ovog problema.
Preduslovi:
Sigurno skladištenje mvn i GPG ključeva.
Sigurno izvršavanje javnih CI zadataka.
Učitavanje artefakata (izdanja/snimka) u javna spremišta.
Automatska provjera verzija izdanja za objavljivanje u maven centralu.
Općenito rješenje za učitavanje artefakata u spremište za više projekata.
Detaljan opis mehanizma za objavljivanje artefakata u Maven Central preko Sonatype OSS Repository Hosting usluge je već opisan u Ovaj članak korisnika Googolplex, pa ću se referirati na ovaj članak na pravim mjestima.
Prethodno se prijavite na Sonatype JIRA i pokrenite tiket za otvaranje spremišta (za više detalja pročitajte odjeljak Kreirajte Sonatype JIRA kartu). Nakon otvaranja spremišta, JIRA par login/password (u daljem tekstu Sonatype nalog) će se koristiti za učitavanje artefakata na Sonatype nexus.
Ako koristite Linux konzolu za generiranje GPG ključa (gnupg/gnupg2), tada morate instalirati rng-tools da generiše entropiju. U suprotnom, generiranje ključeva može potrajati jako dugo.
Prije svega, potrebno je kreirati i konfigurirati projekt u kojem će cjevovod biti pohranjen za postavljanje artefakata. Svoj sam projekat nazvao jednostavno i nekomplikovano - rasporediti
Nakon kreiranja spremišta, morate ograničiti pristup da biste promijenili spremište.
Idite na projekat -> Postavke -> Repozitorijum -> 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 projekat pripada.
Ako postoji nekoliko održavatelja, onda bi najbolje rješenje bilo načelno ograničiti pristup projektu.
Idite na projekat -> Postavke -> Općenito -> Vidljivost, karakteristike projekta, dozvole i postavite Vidljivost projekta na privatan.
Imam projekat u javnom pristupu, pošto koristim svoj GitLab Runner i samo ja imam pristup da modifikujem spremište. Pa, zapravo, nije u mom interesu da prikazujem privatne informacije u javnim evidencijama.
Pooštravanje pravila za promjenu spremišta
Idite na projekat -> Settings -> Repository -> Push Rules i postavite zastavice Committer limitation, Provjerite da li je autor GitLab korisnik. Takođe preporučujem podešavanje urezivanje potpisivanja, i postavite oznaku Odbaci nepotpisano urezivanje.
Zatim morate konfigurirati okidač za pokretanje zadataka
Idite na projekt -> Postavke -> CI / CD -> Pipeline okidači i kreirajte novi okidač-token
Ovaj token se može odmah dodati općoj konfiguraciji varijabli za grupu projekata.
Idite na grupu -> Postavke -> CI / CD -> Varijable i dodajte varijablu DEPLOY_TOKEN sa trigger-tokenom u vrijednosti.
Ovaj odjeljak opisuje konfiguraciju za izvršavanje zadataka prilikom implementacije pomoću izvornog (specifičnog) i javnog (dijeljenog) pokretača.
Specific Runner
Koristim svoje trkače, jer su prije svega zgodne, brze, jeftine.
Za trkače preporučujem Linux VDS sa 1 CPU, 2 GB RAM-a, 20 GB HDD-om. Cijena emisije ~ 3000₽ godišnje.
Moj trkač
Za trkač 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 mašinu preko SSH-a i instaliramo java, git, maven, gnupg2.
Kreirajte direktorij za maven cache i dodijelite grupna prava runner
Možete preskočiti ovaj korak ako ne planirate pokrenuti više pokretača na istoj mašini.
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 projekat
Ekran
Dodaj odvojeno servis /etc/systemd/system/gitlab-deployer.service
Odgovarajući na pitanja generišemo ključ. Koristio sam svoje ime i email.
Obavezno navedite lozinku za ključ. Artefakti će biti potpisani ovim ključem.
gpg --gen-key
Proverite
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
Učitavanje našeg javnog ključa na server ključeva
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Kreirajte maven direktorij spremište i povežite se s keš memorijom (ne griješite)
Ovaj korak se može preskočiti ako ne planirate pokrenuti nekoliko trkača na istoj mašini.
Dodajte datoteku .gitlab-ci.yml u korijen projekta postavljanja
Skripta predstavlja dva međusobno isključiva zadatka implementacije. Specific Runner ili Shared Runner.
.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 projekat sa više modula, a ne morate da učitavate određeni modul u spremište, onda morate da dodate u pom.xml ovog modula nexus-staging-maven-plugin sa zastavom skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Više pluseva
Veoma bogata lista ciljeva za rad sa nexus repozitorijumom (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automatska provjera izdanja za preuzimanje u maven centralu
Kada je oznaka postavljena, automatski se pokreće odgovarajući zadatak u projektu implementacije da prenese verziju izdanja na nexus (primer).
Najbolji dio je što se zatvaranje zatvaranja 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 nešto pođe po zlu, onda 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 da otpremim robots.txt jer je indeksirao moje staro spremište.
Zaseban projekat implementacije u kojem možete implementirati nekoliko CI zadataka za učitavanje artefakata u javna spremišta za različite razvojne jezike.
Projekat implementacije je izoliran od vanjskih smetnji i mogu ga mijenjati samo korisnici s ulogama vlasnika i održavatelja.
Odvojeni Specific Runner sa "vrućom" keš memorijom za pokretanje samo zadataka implementacije.
Objavljivanje snimaka/izdanja verzija u javnom spremištu.
Automatska provjera verzije izdanja za spremnost za objavljivanje u maven centralu.
Zaštita od automatskog objavljivanja "sirovih" verzija u maven central.
Izgradite i objavite verzije snimaka „na klik“.
Jedno spremište za dobijanje snimaka/izdanja verzija.
Generalni cevovod za izgradnju / testiranje / objavljivanje java projekta.
Postavljanje GitLab CI-a nije tako komplikovana tema kao što se čini na prvi pogled. Dovoljno je nekoliko puta postaviti CI po principu ključ u ruke, a sada ste daleko od amatera u ovoj stvari. Štaviše, GitLab dokumentacija je vrlo suvišna. Nemojte se plašiti da napravite prvi korak. Put se pojavljuje ispod stepenica osobe koja hoda (ne sjećam se ko je to rekao :)
Bit će mi drago da dobijem povratnu informaciju.
U sljedećem članku ću vam pokazati kako postaviti GitLab CI za konkurentno pokretanje zadataka integracijskog testa (pokretanje testnih usluga sa docker-compose) ako imate samo jedan shell runner.