Поставување на GitLab CI за прикачување на java проект на maven central
Оваа статија е наменета за развивачите на Java кои треба брзо да ги објават своите производи во централните складишта сонатип и/или мавен користејќи GitLab. Во оваа статија, ќе зборувам за поставување gitlab-runner, gitlab-ci и maven-plugin за да се реши овој проблем.
Предуслови:
Безбедно складирање на клучеви mvn и GPG.
Безбедно извршување на јавни CI задачи.
Поставување артефакти (издание/снимка) во јавни складишта.
Автоматска проверка на верзиите за објавување во maven central.
Општо решение за поставување артефакти во складиште за повеќе проекти.
Детален опис на механизмот за објавување артефакти на Maven Central преку услугата за хостирање на складиштето Sonatype OSS е веќе опишан во Оваа статија корисник Гуголплекс, па затоа ќе се осврнам на оваа статија на вистинските места.
Регистрирајте се однапред на Сонатип ЈИРА и започнете билет за отворање на складиштето (за повеќе детали, прочитајте го делот Направете билет за Sonatype JIRA). По отворањето на складиштето, парот за најава/лозинка JIRA (во натамошниот текст како сметка на Sonatype) ќе се користи за поставување артефакти во врската Sonatype.
Ако ја користите конзолата на Linux за да генерирате клуч GPG (gnupg/gnupg2), тогаш треба да инсталирате rng-алатки да генерира ентропија. Во спротивно, генерирањето клучеви може да потрае многу долго.
Пред сè, треба да креирате и конфигурирате проект во кој гасоводот ќе се складира за распоредување на артефакти. Го нареков мојот проект едноставно и некомплицирано - распоредување
По креирањето на складиштето, треба да го ограничите пристапот за да го промените складиштето.
Одете во проектот -> Поставки -> Репозиториум -> Заштитени гранки. Ги бришеме сите правила и додаваме едно правило со Wildcard * со право на туркање и спојување само за корисниците со улогата Одржувачи. Ова правило ќе работи за сите корисници и на овој проект и на групата на која припаѓа овој проект.
Ако има неколку одржувачи, тогаш најдобро решение би било во принцип да се ограничи пристапот до проектот.
Одете во проектот -> Поставки -> Општо -> Видливост, карактеристики на проектот, дозволи и поставете ја видливоста на проектот на Приватен.
Имам проект во јавен пристап, бидејќи го користам мојот сопствен GitLab Runner и само јас имам пристап да го менувам складиштето. Па, всушност, не е во мој интерес да прикажувам приватни информации во јавните дневници на гасоводот.
Заострување на правилата за промена на складиштето
Одете до проектот -> Поставки -> Репозиториум -> Правила за притиснување и поставете го ограничувањето на Committer, Проверете дали авторот е кориснички знаменца на GitLab. Јас исто така препорачувам поставување заложат потпишување, и поставете го знамето Reject unsigned commits.
Следно, треба да конфигурирате активирач за извршување на задачите
Одете до проект -> Поставки -> CI / CD -> Активатори на гасоводот и креирајте нов токен за активирање
Овој токен може веднаш да се додаде во општата конфигурација на променливи за група проекти.
Одете во групата -> Поставки -> CI / CD -> Променливи и додадете променлива DEPLOY_TOKEN со тригер-токен во вредноста.
Овој дел ја опишува конфигурацијата за извршување задачи при распоредување со користење на мајчин (Специфичен) и јавен (Споделен) тркач.
Специфичен тркач
Јас користам свои тркачи, затоа што пред сè е погодно, брзо, евтино.
За ранер препорачувам Linux VDS со 1 процесор, 2 GB RAM, 20 GB HDD. Цена на издавање ~ 3000₽ годишно.
Мојот тркач
За ранер земав VDS 4 CPU, 4 GB RAM, 50 GB SSD. Чинеше ~ 11000₽ и никогаш не зажалив.
Имам вкупно 7 машини. 5 на Аруба и 2 на ихор.
Значи, имаме тркач. Сега ќе го поставиме.
Одиме до машината преку SSH и инсталираме java, git, maven, gnupg2.
Направете директориум за кешот на Maven и доделете групни права 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!
Проверете дали тркачот е регистриран. Одете на gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners активирани за овој проект
Ние генерираме клуч со одговарање на прашања. Го користев моето име и е-пошта.
Не заборавајте да ја наведете лозинката за клучот. Артефактите ќе бидат потпишани со овој клуч.
gpg --gen-key
Проверка
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
Поставување на нашиот јавен клуч на серверот за клучеви
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Креирај мавен директориум складиштето и поврзете се со кешот (не правете грешка)
Овој чекор може да се прескокне ако не планирате да стартувате неколку тркачи на иста машина.
Додадете ја датотеката .gitlab-ci.yml во коренот на проектот за распоредување
Сценариото претставува две взаемно ексклузивни задачи за распоредување. Специфичен тркач или споделен тркач соодветно.
.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
Ако имате проект со повеќе модули и не треба да прикачувате одреден модул во складиштето, тогаш треба да додадете во pom.xml на овој модул nexus-staging-maven-plugin со знаме skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Повеќе плус
Многу богата листа на цели за работа со складиштето на nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Автоматска проверка на ослободување за можност за преземање во Maven Central
Кога ознаката е поставена, соодветната задача во проектот за распоредување автоматски се активира за да се постави верзијата за издавање на nexus (пример).
Најдобриот дел е што затворањето автоматски се активира во 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] ------------------------------------------------------------------------
И ако нешто тргна наопаку, тогаш задачата ќе пропадне
[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] ------------------------------------------------------------------------
Како резултат на тоа, ни останува само еден избор. Или избришете ја оваа верзија или објавете.
По пуштањето, по некое време, артефактите ќе бидат внатре
надвор од темата
За мене беше откритие дека Maven индексира други јавни складишта.
Морав да подигнам robots.txt бидејќи го индексираше моето старо складиште.
Посебен проект за распоредување во кој можете да имплементирате неколку CI задачи за поставување артефакти во јавни складишта за различни јазици за развој.
Проектот за распоредување е изолиран од надворешни пречки и може да се менува само од корисници со улоги Сопственик и Одржувач.
Посебен Специфичен тркач со „жешка“ кеш за извршување само распоредување задачи.
Објавување на верзии на слика/издание во јавно складиште.
Автоматска проверка на верзијата за пуштање за подготвеност за објавување во maven central.
Заштита од автоматско објавување на „суровини“ верзии во maven central.
Изградете и објавувајте верзии на снимки „на кликнување“.
Единечно складиште за добивање верзии на слики/изданија.
Генерален цевковод за градење / тестирање / објавување на java проект.
Поставувањето на GitLab CI не е толку комплицирана тема како што изгледа на прв поглед. Доволно е неколку пати да поставите CI на клуч на рака, а сега сте далеку од аматер во ова прашање. Покрај тоа, GitLab документацијата е многу излишна. Не плашете се да го направите првиот чекор. Патот се појавува под чекорите на човекот што оди (не се сеќавам кој го кажа тоа :)
Ќе ми биде драго да имам повратни информации.
Во следната статија, ќе ви покажам како да го поставите GitLab CI за конкурентно да ги извршува задачите за тестирање на интеграцијата (водење услуги за тестирање со docker-compose) ако имате само еден ранер на школка.