Sefydlu GitLab CI i uwchlwytho prosiect java i maven central
Mae'r erthygl hon wedi'i bwriadu ar gyfer datblygwyr java sydd angen cyhoeddi eu cynnyrch yn gyflym i ystorfeydd sonoteip a / neu maven canolog gan ddefnyddio GitLab. Yn yr erthygl hon, byddaf yn siarad am sefydlu gitlab-runner, gitlab-ci a maven-plugin i ddatrys y broblem hon.
Rhagofynion:
Storio allweddi mvn a GPG yn ddiogel.
Cyflawni tasgau CI cyhoeddus yn ddiogel.
Lanlwytho arteffactau (rhyddhau/ciplun) i gadwrfeydd cyhoeddus.
Gwiriad awtomatig o fersiynau rhyddhau i'w cyhoeddi yn maven ganolog.
Datrysiad cyffredinol ar gyfer uwchlwytho arteffactau i gadwrfa ar gyfer prosiectau lluosog.
Mae disgrifiad manwl o'r mecanwaith ar gyfer cyhoeddi arteffactau i Maven Central trwy'r Gwasanaeth Lletya Storfa Sonatype OSS eisoes wedi'i ddisgrifio yn yr erthygl hon defnyddiwr Googolplex, felly cyfeiriaf at yr erthygl hon yn y mannau cywir.
Rhag-gofrestru yn Sonatype JIRA a dechrau tocyn i agor y gadwrfa (am fwy o fanylion, darllenwch yr adran Creu tocyn JIRA Sonatype). Ar ôl agor yr ystorfa, bydd y pâr mewngofnodi / cyfrinair JIRA (y cyfeirir ato o hyn ymlaen fel y cyfrif Sonatype) yn cael ei ddefnyddio i uwchlwytho arteffactau i'r nexus Sonatype.
Os ydych chi'n defnyddio'r consol Linux i gynhyrchu allwedd GPG (gnupg/gnupg2), yna mae angen i chi osod rng-offer i gynhyrchu entropi. Fel arall, gall cynhyrchu allweddol gymryd amser hir iawn.
Yn gyntaf oll, mae angen i chi greu a ffurfweddu prosiect lle bydd y biblinell yn cael ei storio ar gyfer defnyddio arteffactau. Galwais fy mhrosiect yn syml ac yn syml - defnyddio
Ar ôl creu'r ystorfa, mae angen i chi gyfyngu mynediad i newid yr ystorfa.
Ewch i'r prosiect -> Gosodiadau -> Ystorfa -> Canghennau Gwarchodedig. Rydym yn dileu'r holl reolau ac yn ychwanegu un rheol gyda Wildcard * gyda'r hawl i wthio ac uno dim ond ar gyfer defnyddwyr â rôl y Cynhalwyr. Bydd y rheol hon yn gweithio i holl ddefnyddwyr y prosiect hwn a'r grŵp y mae'r prosiect hwn yn perthyn iddo.
Os oes sawl cynhaliwr, yna'r ateb gorau fyddai cyfyngu mynediad i'r prosiect mewn egwyddor.
Ewch i'r prosiect -> Gosodiadau -> Cyffredinol -> Gwelededd, nodweddion y prosiect, caniatâd a gosodwch welededd y Prosiect i Preifat.
Mae gen i brosiect mynediad cyhoeddus, gan fy mod yn defnyddio fy NgitLab Runner fy hun a dim ond gen i fynediad i addasu'r ystorfa. Wel, mewn gwirionedd nid yw o fudd i mi ddangos gwybodaeth breifat mewn logiau piblinellau cyhoeddus.
Tynhau'r rheolau ar gyfer newid yr ystorfa
Ewch i'r prosiect -> Gosodiadau -> Ystorfa -> Gwthiwch Reolau a gosodwch gyfyngiad y Committer baneri, Gwiriwch a yw'r awdur yn ddefnyddiwr GitLab. Rwyf hefyd yn argymell gosod ymrwymo arwyddo, a gosod y Faner Ymrwymiad Gwrthod heb ei harwyddo.
Nesaf, mae angen i chi ffurfweddu sbardun i redeg tasgau
Ewch i'r prosiect -> Gosodiadau -> CI / CD -> Piblinell yn sbarduno a chreu tocyn sbardun newydd
Gellir ychwanegu'r tocyn hwn ar unwaith at gyfluniad cyffredinol newidynnau ar gyfer grŵp o brosiectau.
Ewch i'r grŵp -> Gosodiadau -> CI / CD -> Newidynnau ac ychwanegu newidyn DEPLOY_TOKEN gyda sbardun-tocyn yn y gwerth.
Mae'r adran hon yn disgrifio'r ffurfweddiad ar gyfer rhedeg tasgau wrth ddefnyddio'r rhedwr brodorol (Penodol) a chyhoeddus (Rhannu).
Rhedwr Penodol
Rwy'n defnyddio fy rhedwyr fy hun, oherwydd yn gyntaf oll mae'n gyfleus, yn gyflym, yn rhad.
Ar gyfer rhedwr rwy'n argymell Linux VDS gyda 1 CPU, 2 GB RAM, 20 GB HDD. Pris cyhoeddi ~ 3000₽ y flwyddyn.
Fy rhedwr
Ar gyfer y rhedwr cymerais VDS 4 CPU, 4 GB RAM, 50 GB SSD. Costiodd ~11000₽ a byth yn difaru.
Mae gen i gyfanswm o 7 peiriant. 5 ar aruba a 2 ar ihor.
Felly, mae gennym rhedwr. Nawr byddwn yn ei sefydlu.
Rydyn ni'n mynd i'r peiriant trwy SSH ac yn gosod java, git, maven, gnupg2.
Creu cyfeiriadur ar gyfer y storfa maven a neilltuo hawliau grŵp runner
Gallwch hepgor y cam hwn os nad ydych yn bwriadu rhedeg rhedwyr lluosog ar yr un peiriant.
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!
Gwiriwch fod y rhedwr wedi'i gofrestru. Ewch i gitlab.com -> deploy-project -> Gosodiadau -> CI/CD -> Rhedwyr -> Rhedwyr Penodol -> Rhedwyr wedi'u gweithredu ar gyfer y prosiect hwn
Sgrin
Ychwanegu ar wahân gwasanaeth /etc/systemd/system/gitlab-deployer.service
Rydym yn cynhyrchu allwedd trwy ateb cwestiynau. Defnyddiais fy enw fy hun ac e-bost.
Byddwch yn siwr i nodi'r cyfrinair ar gyfer yr allwedd. Bydd arteffactau yn cael eu llofnodi gyda'r allwedd hon.
gpg --gen-key
Gwiriwch
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
Lanlwytho ein allwedd gyhoeddus i'r gweinydd allweddi
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Creu cyfeiriadur maven ystorfa a chysylltu â'r storfa (peidiwch â gwneud unrhyw gamgymeriad)
Gellir hepgor y cam hwn os nad ydych yn bwriadu rhedeg sawl rhedwr ar yr un peiriant.
Ychwanegu'r ffeil .gitlab-ci.yml at wraidd y prosiect defnyddio
Mae'r sgript yn cyflwyno dwy dasg lleoli sy'n annibynnol ar ei gilydd. Rhedwr Penodol neu Rhedwr a Rennir yn y drefn honno.
.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
Mewn prosiectau java sydd i fod i gael eu huwchlwytho i ystorfeydd cyhoeddus, mae angen ichi ychwanegu 2 gam i lawrlwytho'r fersiynau Rhyddhau a Ciplun.
.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}
Yn yr ateb hwn, es ychydig ymhellach a phenderfynais ddefnyddio un templed CI ar gyfer prosiectau java.
Mewn manylion
Creais brosiect ar wahân gitlab-ci lle gosododd y templed CI ar gyfer prosiectau java cyffredin.yml.
Disgrifir y pwnc hwn yn fanwl iawn. Googolplex в Sefydlu maven i lofnodi a lanlwytho arteffactau yn awtomatig i gadwrfeydd ciplun a llwyfannu, felly byddaf yn disgrifio rhai o'r naws o ddefnyddio ategion. Byddaf hefyd yn disgrifio pa mor hawdd a naturiol y gallwch chi ei ddefnyddio nexus-staging-maven-pluginos nad ydych chi eisiau neu os na allwch ddefnyddio org.sonatype.oss:oss-parent fel rhiant eich prosiect.
maven-install-ategyn
Yn gosod modiwlau yn y gadwrfa leol.
Defnyddiol iawn ar gyfer dilysu lleol o atebion mewn prosiectau eraill, yn ogystal â checksum.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-project</id>
<!-- Если у вас многомодульный проект с деплоем родительского помика -->
<phase>install</phase>
<!-- Явно указываем файлы для локальной установки -->
<configuration>
<file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
<pomFile>dependency-reduced-pom.xml</pomFile>
<!-- Принудительное обновление метаданных проекта -->
<updateReleaseInfo>true</updateReleaseInfo>
<!-- Контрольные суммы для проверки целостности -->
<createChecksum>true</createChecksum>
</configuration>
</execution>
</executions>
</plugin>
<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>
Os oes gennych fodiwl nad yw'n cynnwys java (er enghraifft adnoddau yn unig)
Neu nid ydych am gynhyrchu javadoc mewn egwyddor, yna i helpu maven-jar-plugin
Os oes gennych chi brosiect aml-fodiwl, ac nid oes angen i chi uwchlwytho modiwl penodol i'r gadwrfa, yna mae angen i chi ychwanegu at pom.xml y modiwl hwn nexus-staging-maven-plugin gyda baner skipNexusStagingDeployMojo
Ar ôl uwchlwytho ciplun/rhyddhau mae fersiynau ar gael yn storfeydd llwyfannu
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Mwy o fanteision
Rhestr gyfoethog iawn o dargedau ar gyfer gweithio gyda'r gadwrfa nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Gwiriad rhyddhau awtomatig ar gyfer llwytho i lawr yn maven ganolog
Pan fydd y tag wedi'i osod, mae'r dasg gyfatebol yn y prosiect lleoli yn cael ei sbarduno'n awtomatig i uwchlwytho'r fersiwn rhyddhau i nexus (enghraifft).
Y rhan orau yw bod rhyddhau agos yn sbarduno'n awtomatig mewn 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] ------------------------------------------------------------------------
Ac os aeth rhywbeth o'i le, yna bydd y dasg yn methu
[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] ------------------------------------------------------------------------
O ganlyniad, dim ond un dewis sydd gennym ar ôl. Neu dileu'r fersiwn hon neu ei chyhoeddi.
Ar ôl y rhyddhau, ar ôl peth amser, bydd yr arteffactau i mewn
offtopig
Roedd yn ddatguddiad i mi fod maven yn mynegeio cadwrfeydd cyhoeddus eraill.
Roedd yn rhaid i mi uwchlwytho robots.txt oherwydd ei fod yn mynegeio fy hen gadwrfa.
Prosiect defnyddio ar wahân lle gallwch chi weithredu sawl tasg CI ar gyfer uwchlwytho arteffactau i gadwrfeydd cyhoeddus ar gyfer ieithoedd datblygu amrywiol.
Mae'r prosiect lleoli wedi'i ynysu rhag ymyrraeth allanol a dim ond defnyddwyr sydd â rolau Perchennog a Chynhaliwr sy'n gallu ei addasu.
Отдельный Specific Runner с "горячим" кэшем для запуска только deploy задач.
Cyhoeddi fersiynau ciplun/rhyddhau mewn cadwrfa gyhoeddus.
Gwiriad awtomatig o'r fersiwn rhyddhau i weld a yw'n barod i'w gyhoeddi yn maven central.
Защита от автоматической публикации "сырых" версий в maven central.
Сборка и публикация snapshot версий "по клику".
Ystorfa sengl ar gyfer cael fersiynau ciplun/rhyddhau.
Piblinell gyffredinol ar gyfer adeiladu / profi / cyhoeddi prosiect java.
Настройка GitLab CI не такая сложная тема как кажется на первый взгляд. Достаточно пару раз настроить CI "под ключ" и вот, ты уже далеко не дилетант в этом деле. Тем более GitLab документация весьма избыточна. Не бойтесь делать первый шаг. Дорога возникает под шагами идущего (не помню кто сказал 🙂 ).
Byddaf yn falch o roi adborth.
Yn yr erthygl nesaf, byddaf yn dangos i chi sut i sefydlu GitLab CI i redeg tasgau prawf integreiddio yn gystadleuol (rhedeg gwasanaethau prawf gyda chyfansoddi docwyr) os mai dim ond un rhedwr cragen sydd gennych.