ProHoster > Blog > podávání > Nastavení GitLab CI pro nahrání java projektu do maven central
Nastavení GitLab CI pro nahrání java projektu do maven central
Tento článek je určen pro java vývojáře, kteří potřebují rychle publikovat své produkty do centrálních repozitářů sonatype a/nebo maven pomocí GitLabu. V tomto článku budu hovořit o nastavení gitlab-runner, gitlab-ci a maven-plugin k vyřešení tohoto problému.
Předpoklady:
Bezpečné uložení klíčů mvn a GPG.
Bezpečné provádění úkolů veřejné CI.
Nahrávání artefaktů (vydání/snímek) do veřejných úložišť.
Automatická kontrola verzí pro zveřejnění v maven central.
Obecné řešení pro nahrávání artefaktů do úložiště pro více projektů.
Podrobný popis mechanismu pro publikování artefaktů do Maven Central přes Sonatype OSS Repository Hosting Service je již popsán v tento článek uživatel googolplex, tak budu odkazovat na tento článek na správných místech.
Předběžně se zaregistrujte na Sonatyp JIRA a spusťte lístek pro otevření úložiště (pro více podrobností si přečtěte sekci Vytvořte vstupenku Sonatype JIRA). Po otevření úložiště bude dvojice login/heslo JIRA (dále jen účet Sonatype) použita k nahrání artefaktů na nexus Sonatype.
Pokud ke generování klíče GPG (gnupg/gnupg2) používáte konzolu Linux, musíte nainstalovat rng-tools generovat entropii. V opačném případě může generování klíče trvat velmi dlouho.
Nejprve je potřeba vytvořit a nakonfigurovat projekt, ve kterém bude uložen pipeline pro nasazení artefaktů. Svůj projekt jsem nazval jednoduše a nekomplikovaně - rozmístit
Po vytvoření úložiště musíte omezit přístup, abyste mohli úložiště změnit.
Přejděte do projektu -> Nastavení -> Úložiště -> Chráněné větve. Odstraníme všechna pravidla a přidáme jediné pravidlo se zástupným znakem * s právem push a sloučení pouze pro uživatele s rolí Správci. Toto pravidlo bude fungovat pro všechny uživatele tohoto projektu i skupiny, do které tento projekt patří.
Pokud existuje několik správců, pak by nejlepším řešením bylo zásadně omezit přístup k projektu.
Přejděte do projektu -> Nastavení -> Obecné -> Viditelnost, funkce projektu, oprávnění a nastavte Viditelnost projektu na soukromý.
Mám projekt ve veřejném přístupu, protože používám svůj vlastní GitLab Runner a pouze já mám přístup k úpravě úložiště. No, vlastně není v mém zájmu ukazovat soukromé informace ve veřejných protokolech potrubí.
Zpřísnění pravidel pro změnu úložiště
Přejděte do projektu -> Nastavení -> Úložiště -> Pravidla Push a nastavte příznaky Omezení komisí, Zkontrolujte, zda je autor uživatelem GitLab. Doporučuji také nastavit zavázat se k podpisua nastavte příznak Odmítnout nepodepsané potvrzení.
Dále musíte nakonfigurovat spouštěč pro spouštění úloh
Přejděte do Project -> Settings -> CI / CD -> Pipeline triggers a vytvořte nový trigger-token
Tento token lze okamžitě přidat do obecné konfigurace proměnných pro skupinu projektů.
Přejděte do skupiny -> Nastavení -> CI / CD -> Proměnné a přidejte proměnnou DEPLOY_TOKEN se spouštěcím tokenem v hodnotě.
Tato část popisuje konfiguraci pro spouštění úloh při nasazení pomocí nativního (Specifického) a veřejného (Sdíleného) spouštěče.
Konkrétní běžec
Používám vlastní běžce, protože je to především pohodlné, rychlé, levné.
Pro běžce doporučuji Linux VDS s 1 CPU, 2 GB RAM, 20 GB HDD. Emisní cena ~ 3000₽ ročně.
Můj běžec
Pro běžec jsem vzal VDS 4 CPU, 4 GB RAM, 50 GB SSD. Stálo to ~11000 XNUMX₽ a nikdy jsem toho nelitoval.
Mám celkem 7 strojů. 5 na arubě a 2 na ihor.
Takže máme běžce. Nyní to nastavíme.
Přes SSH přejdeme na stroj a nainstalujeme java, git, maven, gnupg2.
Vytvořte adresář pro mezipaměť maven a přidělte práva skupině runner
Tento krok můžete přeskočit, pokud neplánujete běžet více běžců na stejném stroji.
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!
Zkontrolujte, zda je běžec registrován. Přejděte na gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners aktivované pro tento projekt
Přidejte soubor .gitlab-ci.yml do kořenového adresáře projektu nasazení
Skript představuje dvě vzájemně se vylučující úlohy nasazení. Konkrétní běžec nebo sdílený běžec.
.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
Pokud máte projekt s více moduly a nepotřebujete nahrát konkrétní modul do úložiště, musíte přidat do pom.xml tohoto modulu nexus-staging-maven-plugin s vlajkou skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Další plusy
Velmi bohatý seznam cílů pro práci s úložištěm nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automatická kontrola stažení pro stažení v maven central
Když je značka nastavena, příslušná úloha v projektu nasazení se automaticky spustí a nahraje verzi vydání do zařízení nexus (příklad).
Nejlepší na tom je, že blízké uvolnění se automaticky spustí v 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 pokud se něco pokazilo, úkol selže
[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] ------------------------------------------------------------------------
Ve výsledku nám zbývá jediná možnost. Nebo tuto verzi smažte nebo publikujte.
Po vydání, po nějaké době, budou artefakty in
mimo téma
Bylo pro mě zjevením, že maven indexuje další veřejná úložiště.
Musel jsem nahrát soubor robots.txt, protože indexoval můj starý repozitář.
Samostatný projekt nasazení, ve kterém můžete implementovat několik úloh CI pro nahrávání artefaktů do veřejných úložišť pro různé vývojové jazyky.
Projekt nasazení je izolován od vnějšího rušení a mohou jej upravovat pouze uživatelé s rolemi Vlastník a Správce.
Samostatný Specific Runner s „horkou“ mezipamětí pro spouštění pouze úloh nasazení.
Publikování snímků/verzí vydání ve veřejném úložišti.
Automatická kontrola připravenosti vydané verze k publikaci v maven central.
Ochrana proti automatickému zveřejnění „raw“ verzí v maven central.
Vytvářejte a publikujte verze snímků „na kliknutí“.
Jediný repozitář pro získání verzí snímků/vydání.
Obecný kanál pro vytváření / testování / publikování projektu Java.
Nastavení GitLab CI není tak složité téma, jak se na první pohled zdá. Stačí párkrát zřídit CI na klíč a teď v této věci zdaleka nejste amatér. Dokumentace GitLab je navíc velmi nadbytečná. Nebojte se udělat první krok. Cesta se objeví pod kroky toho, kdo jde (nepamatuji si, kdo to řekl :)
Budu rád za zpětnou vazbu.
V příštím článku vám ukážu, jak nastavit GitLab CI, aby spouštělo úlohy integračního testu konkurenceschopně (spouštění testovacích služeb s docker-compose), pokud máte pouze jeden shell runner.