ProHoster > Блог > басқарма > maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату
maven center жүйесіне java жобасын жүктеп салу үшін GitLab CI орнату
Бұл мақала GitLab көмегімен sonatype және/немесе maven орталық репозиторийлеріне өнімдерін жылдам жариялауды қажет ететін java әзірлеушілеріне арналған. Бұл мақалада мен бұл мәселені шешу үшін gitlab-runner, gitlab-ci және maven-plugin орнату туралы айтатын боламын.
Пререквизиттер:
mvn және GPG кілттерін қауіпсіз сақтау.
Қоғамдық CI тапсырмаларын қауіпсіз орындау.
Жалпы репозитарийлерге артефактілерді жүктеп салу (шығару/сурет).
maven center жүйесінде жариялау үшін шығарылым нұсқаларын автоматты түрде тексеру.
Бірнеше жобалар үшін репозиторийге артефактілерді жүктеп салуға арналған жалпы шешім.
Sonatype OSS Repository хостинг қызметі арқылы Maven Central жүйесінде артефактілерді жариялау механизмінің егжей-тегжейлі сипаттамасы қазірдің өзінде сипатталған. Бұл мақала пайдаланушы Googolplex, сондықтан мен бұл мақалаға қажетті жерлерде сілтеме жасаймын.
мекен-жайында алдын ала тіркелу JIRA сонатипі және репозиторийді ашу үшін билетті бастаңыз (толығырақ ақпарат алу үшін бөлімді оқыңыз Sonatype JIRA билетін жасаңыз). Репозиторийді ашқаннан кейін JIRA логин/құпия сөз жұбы (бұдан әрі Sonatype тіркелгісі деп аталады) артефактілерді Sonatype nexus жүйесіне жүктеп салу үшін пайдаланылады.
GPG кілтін (gnupg/gnupg2) жасау үшін Linux консолін пайдалансаңыз, орнатуыңыз керек. құрал-жабдықтар энтропия құру үшін. Әйтпесе, кілттерді құру өте ұзақ уақыт алуы мүмкін.
Ең алдымен, артефактілерді орналастыру үшін құбыр сақталатын жобаны жасау және конфигурациялау қажет. Мен өз жобамды қарапайым және оңай атадым - орналастыру
Репозиторийді жасағаннан кейін репозиторийді өзгерту үшін кіруді шектеу керек.
Жоба -> Параметрлер -> Репозиторий -> Қорғалған тармақтарға өтіңіз. Біз барлық ережелерді жоямыз және Wildcard * бар жалғыз ережені тек Техникалық қызмет көрсетуші рөлі бар пайдаланушылар үшін басу және біріктіру құқығымен қосамыз. Бұл ереже осы жобаның және осы жоба тиесілі топтың барлық пайдаланушылары үшін жұмыс істейді.
Егер бірнеше жөндеушілер болса, ең жақсы шешім жобаға қол жеткізуді шектеу болады.
Жоба -> Параметрлер -> Жалпы -> Көріну, жоба мүмкіндіктері, рұқсаттар бөліміне өтіп, Жобаның көріну мүмкіндігін орнатыңыз. жеке.
Менде жалпыға қолжетімді жоба бар, өйткені мен өзімнің GitLab Runner-ді пайдаланамын және репозиторийді өзгертуге тек менде рұқсат бар. Шын мәнінде, жалпыға ортақ құбыр журналдарында жеке ақпаратты көрсету менің мүддемде емес.
Репозиторийді өзгерту ережелерін қатайту
Жоба -> Параметрлер -> Репозиторий -> Push ережелері бөліміне өтіп, Committer шектеуі жалаушаларын орнатыңыз, Автордың GitLab пайдаланушысы екенін тексеріңіз. Мен де орнатуды ұсынамын қол қоюға міндеттенеді, және Қол қойылмаған тапсырудан бас тарту жалаушасын орнатыңыз.
Әрі қарай, тапсырмаларды орындау үшін триггерді конфигурациялау қажет
Жоба -> Параметрлер -> CI / CD -> Құбыр триггерлеріне өтіңіз және жаңа триггер-токен жасаңыз
Бұл таңбалауышты жобалар тобы үшін айнымалылардың жалпы конфигурациясына бірден қосуға болады.
Топ -> Параметрлер -> CI / CD -> Айнымалылар тармағына өтіп, айнымалыны қосыңыз DEPLOY_TOKEN мәндегі триггер-таңбалауышпен.
Бұл бөлім жергілікті (арнайы) және жалпы (ортақ) жүгіргішті пайдаланып орналастыру кезінде орындалатын тапсырмаларға арналған конфигурацияны сипаттайды.
Арнайы жүгіруші
Мен өзімнің жүгірушілерімді қолданамын, себебі бұл ең алдымен ыңғайлы, жылдам, арзан.
Жүгірушілерге 1 процессоры, 2 ГБ жедел жады, 20 ГБ қатты дискі бар Linux VDS ұсынамын. Шығару бағасы жылына ~ 3000₽.
Менің жүгірушім
Жүгіруші үшін мен VDS 4 CPU, 4 ГБ жедел жады, 50 ГБ 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 -> Параметрлер -> CI/CD -> Жүгірушілер -> Арнайы жүгірушілер -> Осы жоба үшін белсендірілген жүгірушілер
Экран
қосу бөлек қызмет көрсету /etc/systemd/system/gitlab-deployer.service
Сұрақтарға жауап беру арқылы кілт жасаймыз. Мен өз атымды және электрондық поштамды пайдаландым.
Кілт үшін құпия сөзді көрсетуді ұмытпаңыз. Артефактілерге осы кілтпен қол қойылады.
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
maven каталогын жасаңыз репозиторий және кэшпен байланыстыру (қате жасамаңыз)
Бір машинада бірнеше жүгіргішті іске қосуды жоспарламасаңыз, бұл қадамды өткізіп жіберуге болады.
Біз Java тілінің қалаған нұсқасымен орналастыру кезінде тапсырмаларды орындау үшін өте қарапайым Dockerfile жасаймыз. Төменде альпі үшін мысал келтірілген.
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/
.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
Бұл тақырып өте егжей-тегжейлі сипатталған. Googolplex в Артефактілерге автоматты түрде қол қою және жүктеп салу үшін maven орнату және репозиторийлерді қою, сондықтан мен плагиндерді пайдаланудың кейбір нюанстарын сипаттаймын. Мен сондай-ақ қаншалықты оңай және табиғи түрде қолдануға болатынын сипаттаймын nexus-staging-maven-pluginегер сіз жобаңыздың ата-анасы ретінде org.sonatype.oss:oss-parent қолданбасын қаламасаңыз немесе пайдалана алмасаңыз.
maven-install-plugin
Модульдерді жергілікті репозиторийге орнатады.
Басқа жобалардағы шешімдерді жергілікті тексеру үшін, сондай-ақ бақылау сомасы үшін өте пайдалы.
<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>
Егер сізде java жоқ модуль болса (мысалы, тек ресурстар)
Немесе сіз негізінен javadoc генерациялауды қаламайсыз, содан кейін көмектесу үшін maven-jar-plugin
Егер сізде көп модульді жоба болса және репозиторийге нақты модульді жүктеп салу қажет болмаса, онда осы модульдің 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 орталығында жүктеп алу мүмкіндігін автоматты түрде шығаруды тексеру
Тег орнатылған кезде, 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] ------------------------------------------------------------------------
Нәтижесінде бізде бір ғана таңдау қалды. Немесе осы нұсқаны жойыңыз немесе жариялаңыз.
Шығарылғаннан кейін, біраз уақыттан кейін артефактілер болады
тақырыптан тыс
Мавеннің басқа қоғамдық репозиторийлерді индекстейтіні маған аян болды.
Мен robots.txt файлын жүктеп салуға тура келді, себебі ол менің ескі репозиторийімді индекстеген.
Әртүрлі әзірлеу тілдеріне арналған жалпы репозиторийлерге артефактілерді жүктеп салуға арналған бірнеше CI тапсырмаларын орындауға болатын бөлек орналастыру жобасы.
Орналастыру жобасы сыртқы кедергілерден оқшауланған және оны тек Ие және Техникалық қызмет көрсетуші рөлдері бар пайдаланушылар өзгерте алады.
Тек орналастыру тапсырмаларын іске қосу үшін «ыстық» кэші бар бөлек арнайы жүгіруші.
Жалпы репозиторийде сурет/шығару нұсқаларын жариялау.
Шығарылым нұсқасын maven center-те жариялауға дайын болу үшін автоматты тексеру.
maven center жүйесінде «шикі» нұсқаларды автоматты түрде жариялаудан қорғау.
«Басу арқылы» сурет нұсқаларын жасаңыз және жариялаңыз.
Суретті/шығару нұсқаларын алуға арналған жалғыз репозиторий.
Java жобасын құруға / тестілеуге / жариялауға арналған жалпы құбыр.
GitLab CI орнату бірінші көзқараста көрінетіндей күрделі тақырып емес. CI-ді кілт тапсыру негізінде бірнеше рет орнату жеткілікті, енді сіз бұл мәселеде әуесқойдан алыссыз. Сонымен қатар, GitLab құжаттамасы өте артық. Бірінші қадам жасаудан қорықпаңыз. Жол жүрген адамның баспалдақтары астында пайда болады (кім айтқаны есімде жоқ :)
Мен кері байланыс алуға қуаныштымын.
Келесі мақалада мен GitLab CI жүйесін интеграциялық сынақтармен тапсырмаларды бәсекеге қабілетті түрде орындау үшін қалай конфигурациялау керектігі туралы айтатын боламын (докер-композит көмегімен сынақтан өтіп жатқан қызметтерді іске қосу), егер сізде тек бір қабықша жүгіргіші болса.