Nastavenie GitLab CI na nahranie projektu java do maven central
Tento článok je určený pre java vývojárov, ktorí potrebujú rýchlo publikovať svoje produkty do centrálnych repozitárov sonatype a/alebo maven pomocou GitLab. V tomto článku budem hovoriť o nastavení gitlab-runner, gitlab-ci a maven-plugin na vyriešenie tohto problému.
Predpoklady:
Bezpečné uloženie kľúčov mvn a GPG.
Bezpečné vykonávanie úloh verejnej CI.
Nahrávanie artefaktov (vydanie/snímka) do verejných úložísk.
Automatická kontrola verzií vydania na zverejnenie v centrále maven.
Všeobecné riešenie pre nahrávanie artefaktov do úložiska pre viacero projektov.
Podrobný popis mechanizmu zverejňovania artefaktov do Maven Central cez Sonatype OSS Repository Hosting Service je už popísaný v tento článok používateľ googolplex, preto budem odkazovať na tento článok na správnych miestach.
Predbežne sa zaregistrujte na Sonatyp JIRA a spustite lístok na otvorenie úložiska (ďalšie podrobnosti nájdete v časti Vytvorte lístok Sonatype JIRA). Po otvorení úložiska bude pár login/heslo JIRA (ďalej len Sonatype účet) použitý na nahrávanie artefaktov do Sonatype nexusu.
Ak používate konzolu Linux na generovanie kľúča GPG (gnupg/gnupg2), musíte nainštalovať RNG-tools vytvárať entropiu. V opačnom prípade môže generovanie kľúča trvať veľmi dlho.
V prvom rade je potrebné vytvoriť a nakonfigurovať projekt, v ktorom bude uložený pipeline na nasadenie artefaktov. Svoj projekt som nazval jednoducho a nekomplikovane - rozmiestniť
Po vytvorení úložiska musíte obmedziť prístup, aby ste mohli úložisko zmeniť.
Prejdite do projektu -> Nastavenia -> Úložisko -> Chránené pobočky. Vymažeme všetky pravidlá a pridáme jediné pravidlo so zástupným znakom * s právom push a zlúčením len pre používateľov s rolou správcov. Toto pravidlo bude fungovať pre všetkých používateľov tohto projektu aj skupiny, do ktorej tento projekt patrí.
Ak existuje niekoľko správcov, najlepším riešením by bolo zásadne obmedziť prístup k projektu.
Prejdite na projekt -> Nastavenia -> Všeobecné -> Viditeľnosť, funkcie projektu, povolenia a nastavte Viditeľnosť projektu na Súkromný.
Mám projekt vo verejnom prístupe, pretože používam svoj vlastný GitLab Runner a iba ja mám prístup k úprave úložiska. V skutočnosti nie je v mojom záujme zobrazovať súkromné informácie vo verejných protokoloch.
Sprísnenie pravidiel pre zmenu úložiska
Prejdite do projektu -> Nastavenia -> Úložisko -> Pravidlá push a nastavte príznaky Obmedzenie poverenia, Skontrolujte, či je autor používateľom GitLab. Odporúčam aj nastavenie odovzdať podpisa nastavte príznak Odmietnuť nepodpísané potvrdenia.
Ďalej musíte nakonfigurovať spúšťač na spustenie úloh
Prejdite na projekt -> Nastavenia -> CI / CD -> Spúšťače Pipeline a vytvorte nový spúšťací token
Tento token je možné okamžite pridať do všeobecnej konfigurácie premenných pre skupinu projektov.
Prejdite do skupiny -> Nastavenia -> CI / CD -> Premenné a pridajte premennú DEPLOY_TOKEN so spúšťacím tokenom v hodnote.
Táto časť popisuje konfiguráciu spúšťania úloh pri nasadení pomocou natívneho (špecifického) a verejného (zdieľaného) spúšťača.
Špecifický bežec
Používam vlastné bežce, pretože je to v prvom rade pohodlné, rýchle, lacné.
Pre bežcov odporúčam Linux VDS s 1 CPU, 2 GB RAM, 20 GB HDD. Emisná cena ~ 3000₽ ročne.
Môj bežec
Pre bežca som vzal VDS 4 CPU, 4 GB RAM, 50 GB SSD. Stálo to ~11000 XNUMX₽ a nikdy som to neoľutoval.
Mám spolu 7 strojov. 5 na arube a 2 na ihor.
Takže máme bežca. Teraz to nastavíme.
Ideme do stroja cez SSH a nainštalujeme java, git, maven, gnupg2.
Vytvorte adresár pre vyrovnávaciu pamäť maven a priraďte skupinové práva runner
Tento krok môžete preskočiť, ak neplánujete behať viacerých bežcov na rovnakom 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!
Skontrolujte, či je bežec zaregistrovaný. Prejdite na gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners aktivované pre tento projekt
Vytvorte maven adresár sklad a odkaz na vyrovnávaciu pamäť (nedajte sa pomýliť)
Tento krok je možné preskočiť, ak neplánujete behať niekoľko bežcov na rovnakom stroji.
Pridajte súbor .gitlab-ci.yml do koreňového adresára projektu nasadenia
Skript predstavuje dve vzájomne sa vylučujúce úlohy nasadenia. Špecifický bežec alebo zdieľaný bež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
Ak máte projekt s viacerými modulmi a nepotrebujete nahrať konkrétny modul do úložiska, musíte pridať 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>
Viac plusov
Veľmi bohatý zoznam cieľov pre prácu s úložiskom Nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Automatická kontrola stiahnuteľnosti v centrále maven
Keď je značka nastavená, zodpovedajúca úloha v projekte nasadenia sa automaticky spustí na nahranie verzie vydania do zariadenia nexus (príklad).
Najlepšie na tom je, že blízke uvoľnenie sa automaticky spustí v nexuse.
[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 ak sa niečo pokazilo, úloha zlyhá
[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] ------------------------------------------------------------------------
V dôsledku toho nám zostáva len jedna možnosť. Alebo odstráňte túto verziu alebo zverejnite.
Po vydaní, po nejakom čase, budú artefakty in
mimo témy
Bolo pre mňa zjavením, že maven indexuje iné verejné úložiská.
Musel som nahrať súbor robots.txt, pretože indexoval môj starý repozitár.
Samostatný projekt nasadenia, v ktorom môžete implementovať niekoľko úloh CI na nahrávanie artefaktov do verejných úložísk pre rôzne vývojové jazyky.
Projekt nasadenia je izolovaný od vonkajšieho rušenia a môžu ho upravovať iba používatelia s rolami Vlastník a Správca.
Samostatný špecifický bežec s „horúcou“ vyrovnávacou pamäťou na spustenie iba úloh nasadenia.
Zverejnenie snímok/verzií vydania vo verejnom úložisku.
Automatická kontrola pripravenosti verzie na publikovanie v maven centrale.
Ochrana pred automatickým zverejnením „surových“ verzií v centrále maven.
Vytvárajte a publikujte verzie snímok „na kliknutie“.
Jediné úložisko na získanie verzií snímok/vydaní.
Všeobecný kanál na vytváranie/testovanie/publikovanie java projektu.
Nastavenie GitLab CI nie je taká zložitá téma, ako sa na prvý pohľad zdá. Stačí niekoľkokrát nastaviť CI na kľúč a teraz v tejto veci nie ste ani zďaleka amatér. Dokumentácia GitLab je navyše veľmi nadbytočná. Nebojte sa urobiť prvý krok. Cesta sa objavuje pod krokmi kráčajúcej osoby (nepamätám si, kto to povedal :)
Budem rád za spätnú väzbu.
V ďalšom článku vám ukážem, ako nastaviť GitLab CI na konkurenčné spúšťanie úloh integračného testu (spustenie testovacích služieb s docker-compose), ak máte iba jeden shell runner.