Подешавање ГитЛаб ЦИ за отпремање јава пројекта на мавен централ
Овај чланак је намењен Јава програмерима који имају потребу да брзо објаве своје производе у сонатипе и/или мавен централним репозиторијумима користећи ГитЛаб. У овом чланку ћу говорити о подешавању гитлаб-руннера, гитлаб-ци и мавен-плугин-а за решавање овог проблема.
Предуслови:
Сигурно складиштење мвн и ГПГ кључева.
Безбедно извршавање јавних ЦИ задатака.
Отпремање артефаката (издања/снимка) у јавна спремишта.
Аутоматска провера верзија издања за објављивање у мавен централу.
Опште решење за отпремање артефаката у спремиште за више пројеката.
Детаљан опис механизма за објављивање артефаката у Мавен Централ преко Сонатипе ОСС Репоситори Хостинг услуге је већ описан у Овај чланак корисника Гооголплек, па ћу се позивати на овај чланак на правим местима.
Региструјте се унапред за Сонатипе ЈИРА и отворите тикет да отворите спремиште (прочитајте одељак за више детаља Направите карту на Сонатипе ЈИРА). Након отварања спремишта, пар пријава/лозинка из ЈИРА-е (у даљем тексту Сонатипе налог) ће се користити за отпремање артефаката у Сонатипе некус.
Ако користите Линук конзолу за генерисање ГПГ кључа (гнупг/гнупг2), онда морате да инсталирате рнг-алати да генерише ентропију. У супротном, генерисање кључева може потрајати веома дуго.
Пре свега, потребно је да креирате и конфигуришете пројекат у коме ће цевовод бити ускладиштен за постављање артефаката. Свој пројекат сам назвао једноставно и некомпликовано - развити
Након креирања спремишта, потребно је да ограничите приступ да бисте променили спремиште.
Идите на пројекат -> Подешавања -> Репозиторијум -> Заштићене гране. Бришемо сва правила и додајемо једно правило са џокер знаком * са правом гурања и спајања само за кориснике са улогом одржаваоца. Ово правило ће функционисати за све кориснике и овог пројекта и групе којој овај пројекат припада.
Ако постоји неколико одржавалаца, онда би најбоље решење било да се у принципу ограничи приступ пројекту.
Идите на пројекат -> Подешавања -> Опште -> Видљивост, карактеристике пројекта, дозволе и подесите Видљивост пројекта на Приватан.
Имам јавно доступан пројекат, пошто користим свој ГитЛаб Руннер и само ја имам приступ да променим спремиште. Па, заправо, није у мом интересу да приказујем приватне информације у јавним евиденцијама цевовода.
Пооштравање правила за промену спремишта
Идите на пројекат -> Сеттингс -> Репоситори -> Пусх Рулес и поставите ограничење Цоммиттер-а, Проверите да ли је аутор корисник ГитЛаб-а. Такође препоручујем постављање потпис за урезивање, и поставите ознаку Одбаци непотписано урезивање.
Затим морате да конфигуришете окидач за покретање задатака
Идите на пројекат -> Подешавања -> ЦИ / ЦД -> Окидачи цевовода и креирајте нови окидач-токен
Овај токен се може одмах додати општој конфигурацији варијабли за групу пројеката.
Идите на групу -> Подешавања -> ЦИ / ЦД -> Променљиве и додајте променљиву DEPLOY_TOKEN са окидачем-токеном у вредности.
Овај одељак описује конфигурацију за извршавање задатака при постављању помоћу сопственог (специфичног) и јавног (дељеног) покретача.
Специфиц Руннер
Користим своје тркаче јер су, пре свега, згодне, брзе и јефтине.
За тркаче, препоручујем Линук ВДС са 1 ЦПУ, 2 ГБ РАМ-а, 20 ГБ ХДД-ом. Цена емисије је ~3000₽ годишње.
Мој тркач
За тркач сам узео ВДС 4 ЦПУ, 4 ГБ РАМ-а, 50 ГБ ССД. Коштао је ~11000₽ и никада нисам пожалио.
Имам укупно 7 машина. 5 на аруби и 2 на ихору.
Дакле, имамо тркача. Сада ћемо га конфигурисати.
Идемо на машину преко ССХ-а и инсталирамо јава, гит, мавен, гнупг2.
Креирајте директоријум за мавен кеш и доделите групне дозволе runner
Можете прескочити ову тачку ако не планирате да покренете неколико тркача на једној машини.
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!
Проверавамо да ли је тркач регистрован. Идите на веб локацију гитлаб.цом -> деплои-пројецт -> Сеттингс -> ЦИ/ЦД -> Руннерс -> Специфиц Руннерс -> Руннерс активирани за овај пројекат
Направите мавен директоријум Складиште и линк до кеша (не грешите)
Можете прескочити ову тачку ако не планирате да покренете неколико тркача на једној машини.
Додајте датотеку .гитлаб-ци.имл у корен пројекта постављања
Скрипта представља два међусобно искључива задатка постављања. Специфиц Руннер или Схаред Руннер.
.гитлаб-ци.имл
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
Ако имате пројекат са више модула и не морате да отпремате одређени модул у спремиште, онда морате да додате nexus-staging-maven-plugin са заставом skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Више плусева
Веома богата листа циљева за рад са некус репозиторијумом (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Аутоматска провера отпуштања за отпремање на мавен централ
Када је ознака инсталирана, аутоматски се покреће одговарајући задатак у пројекту имплементације за преузимање верзије издања на некус (пример).
Најбољи део је што се затварање ослобађања аутоматски покреће у некусу.
[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] ------------------------------------------------------------------------
А ако нешто крене наопако, задатак ће сигурно пропасти
[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] ------------------------------------------------------------------------
Као резултат тога, остаје нам само један избор. Или избришите ову верзију или је објавите.
Након пуштања, након неког времена, артефакти ће бити унутра
оффтопиц
За мене је било откриће да Мавен индексира друга јавна спремишта.
Морао сам да додам роботс.ткт јер је индексирао моје старо спремиште.
Засебан пројекат имплементације у којем можете имплементирати неколико ЦИ задатака за отпремање артефаката у јавна спремишта за различите развојне језике.
Пројекат Деплои је изолован од спољних сметњи и могу га мењати само корисници са улогама власника и одржаваоца.
Одвојени Специфиц Руннер са „врућом“ кеш меморијом за покретање само задатака за примену.
Објављивање снимака/верзија издања у јавном спремишту.
Аутоматска провера спремности верзије издања за објављивање у мавен централу.
Заштита од аутоматског објављивања „сирових“ верзија у мавен централу.
Направите и објавите верзије снимака „на клик“.
Једно спремиште за добијање снимака/издања верзија.
Општи цевовод за прављење/тестирање/објављивање јава пројекта.
Подешавање ГитЛаб ЦИ није тако компликована тема као што изгледа на први поглед. Довољно је неколико пута поставити ЦИ по принципу „кључ у руке“, а сада сте далеко од аматера у овој ствари. Штавише, ГитЛаб документација је веома сувишна. Немојте се плашити да направите први корак. Пут се појављује испод степеница особе која хода (не сећам се ко је то рекао :)
Биће ми драго да добијем повратне информације.
У следећем чланку ћу говорити о томе како да конфигуришем ГитЛаб ЦИ да конкурентно покреће задатке са интеграцијским тестовима (покретање услуга које се тестирају помоћу доцкер-цомпосе) ако имате само један покретач љуске.