Stel GitLab CI op om 'n java-projek na maven central op te laai
Hierdie artikel is bedoel vir Java-ontwikkelaars wat hul produkte vinnig moet publiseer na sonatype en/of sentrale bewaarplekke met GitLab. In hierdie artikel sal ek praat oor die opstel van gitlab-runner, gitlab-ci en maven-plugin om hierdie probleem op te los.
Voorvereistes:
Veilige berging van mvn- en GPG-sleutels.
Veilige uitvoering van openbare GI-take.
Laai artefakte (vrystelling/snapshot) op na publieke bewaarplekke.
Outomatiese kontrolering van vrystelling weergawes vir publikasie in Maven Central.
'n Algemene oplossing vir die oplaai van artefakte na 'n bewaarplek vir veelvuldige projekte.
'n Gedetailleerde beskrywing van die meganisme vir die publisering van artefakte na Maven Central via die Sonatype OSS Repository Hosting Service word reeds beskryf in Hierdie artikel gebruiker googolplex, so ek sal op die regte plekke na hierdie artikel verwys.
Registreer vooraf by Sonatipe JIRA en begin 'n kaartjie om die bewaarplek oop te maak (vir meer besonderhede, lees die afdeling Skep 'n Sonatype JIRA-kaartjie). Nadat die bewaarplek oopgemaak is, sal die JIRA-aanmelding/wagwoordpaar (hierna verwys as die Sonatype-rekening) gebruik word om artefakte na die Sonatype-nexus op te laai.
As jy die Linux-konsole gebruik om 'n GPG-sleutel (gnupg/gnupg2) te genereer, dan moet jy installeer rng-gereedskap om entropie te genereer. Andersins kan sleutelgenerering baie lank neem.
Eerstens moet u 'n projek skep en opstel waarin die pyplyn gestoor sal word vir die ontplooiing van artefakte. Ek het my projek eenvoudig en ongekompliseerd genoem - ontplooi
Nadat u die bewaarplek geskep het, moet u toegang beperk om die bewaarplek te verander.
Gaan na die projek -> Instellings -> Bewaarplek -> Beskermde takke. Ons vee alle reëls uit en voeg 'n enkele reël by met Wildcard * met die reg om slegs te druk en saam te voeg vir gebruikers met die Onderhouer-rol. Hierdie reël sal werk vir alle gebruikers van beide hierdie projek en die groep waaraan hierdie projek behoort.
As daar verskeie instandhouers is, sal die beste oplossing wees om toegang tot die projek in beginsel te beperk.
Gaan na die projek -> Instellings -> Algemeen -> Sigbaarheid, projekkenmerke, toestemmings en stel Projeksigbaarheid na Privaat.
Ek het 'n projek in publieke toegang, aangesien ek my eie GitLab Runner gebruik en net ek toegang het om die bewaarplek te wysig. Wel, eintlik is dit nie in my belang om private inligting in openbare pyplynlogboeke te wys nie.
Verskerping van die reëls vir die verandering van die bewaarplek
Gaan na die projek -> Instellings -> Bewaarplek -> Druk reëls en stel die vlae Committer beperking, Kontroleer of outeur 'n GitLab gebruiker is. Ek beveel ook instelling aan pleeg ondertekening, en stel die Reject unsigned commits-vlag.
Vervolgens moet u 'n sneller instel om take uit te voer
Gaan na projek -> Instellings -> CI / CD -> Pyplyn snellers en skep 'n nuwe sneller-token
Hierdie teken kan onmiddellik by die algemene konfigurasie van veranderlikes vir 'n groep projekte gevoeg word.
Gaan na die groep -> Instellings -> CI / CD -> Veranderlikes en voeg 'n veranderlike by DEPLOY_TOKEN met sneller-token in die waarde.
Hierdie afdeling beskryf die opstelling vir die uitvoer van take tydens ontplooiing deur die oorspronklike (Spesifieke) en publieke (Gedeelde) hardloper te gebruik.
Spesifieke hardloper
Ek gebruik my eie hardlopers, want eerstens is dit gerieflik, vinnig, goedkoop.
Vir hardlopers beveel ek Linux VDS aan met 1 SVE, 2 GB RAM, 20 GB HDD. Uitreikingsprys ~ 3000₽ per jaar.
My hardloper
Vir die hardloper het ek VDS 4 CPU, 4 GB RAM, 50 GB SSD geneem. Dit het ~11000₽ gekos en was nooit spyt daaroor nie.
Ek het altesaam 7 masjiene. 5 op aruba en 2 op ihor.
So, ons het 'n hardloper. Nou sal ons dit opstel.
Ons gaan na die masjien via SSH en installeer java, git, maven, gnupg2.
Skep 'n gids vir die maven-kas en ken groepregte toe runner
Jy kan hierdie stap oorslaan as jy nie van plan is om verskeie hardlopers op dieselfde masjien te hardloop nie.
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!
Maak seker dat die hardloper geregistreer is. Gaan na gitlab.com -> ontplooi-projek -> Instellings -> CI/CD -> Hardlopers -> Spesifieke hardlopers -> Hardlopers geaktiveer vir hierdie projek
Skerm
en bygevoeg afsonderlike diens /etc/systemd/system/gitlab-deployer.service
Ons genereer 'n sleutel deur vrae te beantwoord. Ek het my eie naam en e-posadres gebruik.
Maak seker dat jy die wagwoord vir die sleutel spesifiseer. Artefakte sal met hierdie sleutel onderteken word.
gpg --gen-key
Nagaan
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
Laai tans ons publieke sleutel op na die sleutelbediener
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Skep 'n maven-gids repository en skakel met die kas (maak geen fout nie)
Hierdie stap kan oorgeslaan word as jy nie van plan is om verskeie hardlopers op dieselfde masjien te hardloop nie.
Ons skep 'n redelik eenvoudige Dockerfile om take uit te voer tydens implementering met die verlangde weergawe van Java. Hieronder is 'n voorbeeld vir alpiene.
FROM java:8u111-jdk-alpine
RUN apk add gnupg maven git --update-cache
--repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted &&
mkdir ~/.m2/
Voeg die lêer .gitlab-ci.yml by die wortel van die ontplooiingsprojek
Die draaiboek bied twee onderling uitsluitende ontplooiingstake aan. Spesifieke hardloper of gedeelde hardloper onderskeidelik.
.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
In java-projekte wat veronderstel is om na publieke bewaarplekke opgelaai te word, moet jy 2 stappe byvoeg om die Vrystelling- en Snapshot-weergawes af te laai.
.gitlab-ci.yml
stages:
- build
- test
- verify
- deploy
<...>
Release:
extends: .trigger_deploy
# Запускать задачу только пo тегу.
only:
- tags
Snapshot:
extends: .trigger_deploy
# Запускаем задачу на публикацию SNAPSHOT версии вручную
when: manual
# Не запускать задачу, если проставлен тег.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# Отключаем клонирование текущего проекта
GIT_STRATEGY: none
# Ссылка на триггер deploy-задачи
URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
# Переменные deploy-задачи
POST_DATA: "
token=${DEPLOY_TOKEN}&
ref=master&
variables[DEPLOY]=${DEPLOY}&
variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
"
script:
# Не использую cURL, так как с флагами --fail --show-error
# он не выводит тело ответа, если HTTP код 400 и более
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}
In hierdie oplossing het ek 'n bietjie verder gegaan en besluit om een CI-sjabloon vir java-projekte te gebruik.
Meer besonderhede
Ek het 'n aparte projek geskep gitlab-ci waarin hy die CI-sjabloon vir java-projekte geplaas het algemeen.yml.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<!-- Генерация javadoc должна быть после фазы генерации ресурсов -->
<phase>prepare-package</phase>
<configuration>
<!-- Очень помогает в публичных проектах -->
<failOnError>true</failOnError>
<failOnWarnings>true</failOnWarnings>
<!-- Убирает ошибку поиска документации в target директории -->
<detectOfflineLinks>false</detectOfflineLinks>
</configuration>
</execution>
</executions>
</plugin>
As jy 'n module het wat nie Java bevat nie (byvoorbeeld net hulpbronne)
Of jy wil nie in beginsel javadoc genereer nie, dan om te help maven-jar-plugin
As jy 'n multi-module projek het, en jy hoef nie 'n spesifieke module na die bewaarplek op te laai nie, dan moet jy by die pom.xml van hierdie module voeg nexus-staging-maven-plugin met vlag skipNexusStagingDeployMojo
Na die oplaai van momentopname/vrystelling is weergawes beskikbaar in opstel van bewaarplekke
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Meer pluspunte
'n Baie ryk lys teikens om met die nexus-bewaarplek te werk (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Outomatiese vrystellingkontrole vir aflaaibaarheid in Maven Central
Wanneer die merker gestel is, word die ooreenstemmende taak in die ontplooiingsprojek outomaties geaktiveer om die vrystellingweergawe na nexus op te laai (Byvoorbeeld).
Die beste deel is dat nouvrystelling outomaties in nexus aktiveer.
[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] ------------------------------------------------------------------------
En as iets verkeerd geloop het, sal die taak misluk
[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] ------------------------------------------------------------------------
Gevolglik het ons net een keuse oor. Of vee hierdie weergawe uit of publiseer.
Na die vrystelling, na 'n geruime tyd, sal die artefakte in wees
offtopic
Dit was vir my 'n openbaring dat Maven ander openbare bewaarplekke indekseer.
Ek moes robots.txt oplaai omdat dit my ou bewaarplek geïndekseer het.
'n Afsonderlike ontplooiingsprojek waarin jy verskeie CI-take kan implementeer vir die oplaai van artefakte na openbare bewaarplekke vir verskeie ontwikkelingstale.
Die ontplooiingsprojek is geïsoleer van inmenging van buite en kan slegs deur gebruikers met die Eienaar- en Onderhouer-rolle gewysig word.
Отдельный Specific Runner с "горячим" кэшем для запуска только deploy задач.
Publikasie van momentopname/vrystelling weergawes in 'n publieke bewaarplek.
Outomatiese kontrolering van die vrystelling weergawe vir gereedheid vir publikasie in Maven Central.
Защита от автоматической публикации "сырых" версий в maven central.
Сборка и публикация snapshot версий "по клику".
Enkele bewaarplek vir die kry van momentopname/vrystelling weergawes.
Algemene pyplyn vir die bou / toets / publisering van 'n java-projek.
Настройка GitLab CI не такая сложная тема как кажется на первый взгляд. Достаточно пару раз настроить CI "под ключ" и вот, ты уже далеко не дилетант в этом деле. Тем более GitLab документация весьма избыточна. Не бойтесь делать первый шаг. Дорога возникает под шагами идущего (не помню кто сказал 🙂 ).
Ek sal met graagte terugvoer gee.
In die volgende artikel sal ek jou wys hoe om GitLab CI op te stel om integrasietoetstake mededingend uit te voer (die uitvoering van toetsdienste met docker-compose) as jy net een doploper het.