ProHoster > Bloc > Administració > Configuració de GitLab CI per carregar un projecte java a Maven Central
Configuració de GitLab CI per carregar un projecte java a Maven Central
Aquest article està destinat als desenvolupadors de Java que necessiten publicar ràpidament els seus productes als repositoris centrals de sonatype i/o maven mitjançant GitLab. En aquest article, parlaré de la configuració de gitlab-runner, gitlab-ci i maven-plugin per resoldre aquest problema.
Requisits previs:
Emmagatzematge segur de claus mvn i GPG.
Execució segura de les tasques públiques de CI.
Càrrega d'artefactes (alliberament/snapshot) als repositoris públics.
Comprovació automàtica de les versions de llançament per a la seva publicació a maven central.
Una solució general per carregar artefactes a un repositori per a diversos projectes.
Ja es descriu una descripció detallada del mecanisme per publicar artefactes a Maven Central mitjançant el servei d'allotjament del repositori Sonatype OSS a Aquest article usuari Googleolplex, així que em referiré a aquest article als llocs adequats.
Preinscripció a Sonatip JIRA i inicieu un bitllet per obrir el repositori (per a més detalls, llegiu la secció Creeu un bitllet Sonatype JIRA). Després d'obrir el repositori, s'utilitzarà el parell d'inici de sessió/contrasenya de JIRA (d'ara endavant, el compte Sonatype) per carregar artefactes al nexe Sonatype.
Si utilitzeu la consola Linux per generar una clau GPG (gnupg/gnupg2), haureu d'instal·lar rng-tools per generar entropia. En cas contrari, la generació de claus pot trigar molt de temps.
Configuració d'un projecte de desplegament a GitLab
En primer lloc, heu de crear i configurar un projecte en el qual s'emmagatzemarà la canalització per al desplegament d'artefactes. Vaig anomenar el meu projecte senzillament i sense complicacions - desplegar
Després de crear el repositori, heu de restringir l'accés per canviar-lo.
Aneu al projecte -> Configuració -> Repositori -> Branques protegides. Suprimim totes les regles i afegim una única regla amb comodí * amb el dret d'impulsar i combinar només per als usuaris amb la funció de Mantenidors. Aquesta regla funcionarà per a tots els usuaris tant d'aquest projecte com del grup al qual pertany aquest projecte.
Si hi ha diversos mantenedors, la millor solució seria restringir l'accés al projecte en principi.
Aneu al projecte -> Configuració -> General -> Visibilitat, característiques del projecte, permisos i configureu la visibilitat del projecte a Privat.
Tinc un projecte en accés públic, ja que faig servir el meu propi GitLab Runner i només tinc accés per modificar el repositori. Bé, en realitat no és del meu interès mostrar informació privada als registres de canalització públics.
Enduriment de les regles per canviar el repositori
Aneu al projecte -> Configuració -> Repositori -> Regles Push i configureu la restricció de Committer de marques, comproveu si l'autor és un usuari de GitLab. També recomano la configuració signatura de compromís, i establiu el senyalador Rebutja les confirmacions sense signar.
A continuació, heu de configurar un activador per executar tasques
Aneu a Projecte -> Configuració -> CI / CD -> Activadors de Pipeline i creeu un nou token d'activació
Aquest testimoni es pot afegir immediatament a la configuració general de variables per a un grup de projectes.
Aneu al grup -> Configuració -> CI / CD -> Variables i afegiu una variable DEPLOY_TOKEN amb un token disparador al valor.
Aquesta secció descriu la configuració per executar tasques en desplegament mitjançant l'executor natiu (específic) i públic (compartit).
Corredor específic
Jo faig servir els meus propis corredors, perquè primer de tot és còmode, ràpid, barat.
Per als corredors, recomano Linux VDS amb 1 CPU, 2 GB de RAM, 20 GB de disc dur. Preu d'emissió ~ 3000₽ per any.
El meu corredor
Per al corredor vaig prendre VDS 4 CPU, 4 GB de RAM, 50 GB SSD. Va costar ~11000₽ i mai no es va penedir.
Tinc un total de 7 màquines. 5 a aruba i 2 a ihor.
Així doncs, tenim un corredor. Ara el configurarem.
Anem a la màquina mitjançant SSH i instal·lem java, git, maven, gnupg2.
Creeu un directori per a la memòria cau de maven i assigneu drets de grup runner
Podeu ometre aquest pas si no teniu previst executar diversos corredors a la mateixa màquina.
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!
Comprova que el corredor estigui inscrit. Aneu a gitlab.com -> deploy-project -> Configuració -> CI/CD -> Corredors -> Corredors específics -> Corredors activats per a aquest projecte
Generem una clau responent preguntes. Vaig utilitzar el meu propi nom i correu electrònic.
Assegureu-vos d'especificar la contrasenya de la clau. Els artefactes es signaran amb aquesta clau.
gpg --gen-key
Comprovació
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
Penjant la nostra clau pública al servidor de claus
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Creeu un directori maven repositori i enllaça amb la memòria cau (no t'equivoquis)
Aquest pas es pot saltar si no teniu previst executar diversos corredors a la mateixa màquina.
Afegiu el fitxer .gitlab-ci.yml a l'arrel del projecte de desplegament
L'script presenta dues tasques de desplegament mútuament exclusives. Corredor específic o corredor compartit respectivament.
.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
Si teniu un projecte de diversos mòduls i no necessiteu carregar un mòdul específic al repositori, haureu d'afegir-lo al pom.xml d'aquest mòdul. nexus-staging-maven-plugin amb bandera skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Més avantatges
Una llista molt rica d'objectius per treballar amb el repositori de nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Comprovació automàtica de la descàrrega a Maven Central
Quan s'estableix l'etiqueta, la tasca corresponent al projecte de desplegament s'activa automàticament per carregar la versió de llançament a nexus (exemple).
La millor part és que l'alliberament tancat s'activa automàticament a Nexus.
[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] ------------------------------------------------------------------------
I si alguna cosa va fallar, la tasca fallarà
[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] ------------------------------------------------------------------------
Com a resultat, només ens queda una opció. O suprimiu aquesta versió o publiqueu-la.
Després de l'alliberament, després d'un temps, els artefactes estaran dins
fora de tema
Va ser una revelació per a mi que Maven indexa altres dipòsits públics.
Vaig haver de pujar robots.txt perquè indexava el meu antic dipòsit.
Un projecte de desplegament independent en el qual podeu implementar diverses tasques de CI per carregar artefactes als repositoris públics per a diversos llenguatges de desenvolupament.
El projecte de desplegament està aïllat de les interferències externes i només el poden modificar els usuaris amb els rols de Propietari i Mantenidor.
Un corredor específic separat amb una memòria cau "calenta" per executar només tasques de desplegament.
Publicació de versions d'instantànies/alliberament en un repositori públic.
Comprovació automàtica de la versió de llançament per a la preparació per a la publicació a Maven Central.
Protecció contra la publicació automàtica de versions "crues" a maven central.
Creeu i publiqueu versions d'instantànies "al clic".
Repositori únic per obtenir versions d'instantànies/alliberament.
Canalització general per crear / provar / publicar un projecte java.
Configurar GitLab CI no és un tema tan complicat com sembla a primera vista. N'hi ha prou amb configurar CI clau en mà un parell de vegades, i ara estàs lluny de ser un aficionat en aquesta qüestió. A més, la documentació de GitLab és molt redundant. No tinguis por de fer el primer pas. El camí apareix sota els passos de la persona que camina (no recordo qui ho va dir :)
Estaré encantat de fer comentaris.
Al següent article, us mostraré com configurar GitLab CI per executar tasques de prova d'integració de manera competitiva (executant serveis de prova amb docker-compose) si només teniu un shell runner.