ProHoster > Блог > Pagdumala > Pag-set up sa GitLab CI aron mag-upload og java project sa maven central
Pag-set up sa GitLab CI aron mag-upload og java project sa maven central
Kini nga artikulo gituyo alang sa mga developer sa java nga kinahanglan nga dali nga imantala ang ilang mga produkto sa sonatype ug/o maven central repository gamit ang GitLab. Niini nga artikulo, maghisgot ako bahin sa pag-set up sa gitlab-runner, gitlab-ci ug maven-plugin aron masulbad kini nga problema.
Kinahanglanon:
Luwas nga pagtipig sa mvn ug GPG nga mga yawe.
Luwas nga pagpatuman sa mga buluhaton sa publiko nga CI.
Pag-upload sa mga artifact (release/snapshot) sa mga public repository.
Awtomatikong pagsusi sa mga bersyon sa pagpagawas alang sa pagmantala sa sentro sa maven.
Usa ka kinatibuk-ang solusyon sa pag-upload sa mga artifact sa usa ka repository alang sa daghang mga proyekto.
Ang usa ka detalyado nga paghulagway sa mekanismo sa pagmantala sa mga artifact sa Maven Central pinaagi sa Sonatype OSS Repository Hosting Service gihulagway na sa niini nga artikulo tiggamit Googolplex, mao nga akong hisgotan kining artikuloha sa hustong mga dapit.
Pre-register sa Sonatype nga JIRA ug pagsugod og tiket para maablihan ang repository (para sa dugang detalye, basaha ang seksyon Paghimo og tiket sa Sonatype JIRA). Human sa pag-abli sa repository, ang JIRA login/password pares (gitawag nga Sonatype account) gamiton sa pag-upload sa mga artifact sa Sonatype nexus.
Kung naggamit ka sa Linux console aron makamugna og GPG key (gnupg/gnupg2), nan kinahanglan nimo nga i-install rng-tools aron makamugna og entropy. Kay kon dili, ang yawe nga henerasyon mahimong magdugay kaayo.
Pag-set up sa usa ka proyekto sa pag-deploy sa GitLab
Una sa tanan, kinahanglan ka nga maghimo ug mag-configure sa usa ka proyekto diin ang pipeline itago alang sa pag-deploy sa mga artifact. Gitawag nako ang akong proyekto nga yano ug dili komplikado - i-deploy
Pagkahuman sa paghimo sa repository, kinahanglan nimo nga higpitan ang pag-access aron mabag-o ang repository.
Lakaw ngadto sa proyekto -> Settings -> Repository -> Gipanalipdan nga mga Sanga. Among tangtangon ang tanang lagda ug idugang ang usa ka lagda nga adunay Wildcard * nga adunay katungod sa pagduso ug paghiusa alang lamang sa mga tiggamit nga adunay papel sa mga Maintainer. Kini nga lagda magamit alang sa tanan nga tiggamit niini nga proyekto ug sa grupo diin kini nga proyekto nahisakop.
Kung adunay daghang mga tigmentinar, nan ang labing kaayo nga solusyon mao ang pagpugong sa pag-access sa proyekto sa prinsipyo.
Lakaw ngadto sa proyekto -> Mga Setting -> Kinatibuk-an -> Pagtan-aw, mga bahin sa proyekto, mga permiso ug itakda ang visibility sa Proyekto sa Private.
Naa koy proyekto sa publiko nga pag-access, tungod kay gigamit nako ang akong kaugalingon nga GitLab Runner ug ako ra ang adunay access aron mabag-o ang repository. Aw, sa tinuud dili sa akong interes ang pagpakita sa pribado nga kasayuran sa mga log sa publiko nga pipeline.
Paghugot sa mga lagda alang sa pagbag-o sa repository
Lakaw ngadto sa proyekto -> Settings -> Repository -> Push Rules ug ibutang ang mga bandila Pagdili sa Committer, Susiha kung ang tagsulat usa ka tiggamit sa GitLab. Girekomenda usab nako ang setting pasalig sa pagpirma, ug ibutang ang Isalikway ang wala gipirmahan nga mga pasalig nga bandila.
Sunod, kinahanglan nimo nga i-configure ang usa ka gatilyo aron makadagan ang mga buluhaton
Adto sa project -> Settings -> CI / CD -> Pipeline triggers ug paghimo og bag-ong trigger-token
Kini nga timaan mahimong idugang dayon sa kinatibuk-ang pag-configure sa mga variable alang sa usa ka grupo sa mga proyekto.
Adto sa grupo -> Mga Setting -> CI / CD -> Mga Variable ug pagdugang usa ka variable DEPLOY_TOKEN nga adunay trigger-token sa kantidad.
Kini nga seksyon naghulagway sa configuration alang sa pagpadagan sa mga buluhaton sa pag-deploy gamit ang lumad (Piho) ug publiko (Gipaambit) nga runner.
Piho nga Runner
Gigamit nako ang akong kaugalingon nga mga runner, tungod kay una sa tanan kini sayon, paspas, barato.
Alang sa runner girekomenda ko ang Linux VDS nga adunay 1 CPU, 2 GB RAM, 20 GB HDD. Presyo sa isyu ~ 3000₽ kada tuig.
Akong runner
Alang sa runner gikuha nako ang VDS 4 CPU, 4 GB RAM, 50 GB SSD. Nagkantidad kini og ~11000₽ ug wala gayud magbasol niini.
Ako adunay total nga 7 ka makina. 5 sa aruba ug 2 sa ihor.
Busa, kami adunay usa ka runner. Karon atong ibutang kini.
Moadto kami sa makina pinaagi sa SSH ug i-install ang java, git, maven, gnupg2.
Paghimo og direktoryo alang sa maven cache ug pag-assign sa mga katungod sa grupo runner
Mahimo nimong laktawan kini nga lakang kung wala ka nagplano nga magpadagan og daghang mga runner sa parehas nga makina.
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!
Susiha nga ang runner narehistro. Adto sa gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners activated for this project
Naghimo kami usa ka yawe pinaagi sa pagtubag sa mga pangutana. Gigamit nako ang akong kaugalingon nga ngalan ug email.
Siguroha nga ipiho ang password alang sa yawe. Ang mga artifact mapirmahan gamit kini nga yawe.
gpg --gen-key
Pagsusi
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
Pag-upload sa among publikong yawe sa keyserver
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Paghimo usa ka direktoryo sa maven repository ug sumpay sa cache (ayaw masayop)
Kini nga lakang mahimong laktawan kung wala ka nagplano nga modagan og daghang mga runner sa parehas nga makina.
Una sa tanan, kinahanglan nimo nga maghimo usa ka yawe sa GPG. Aron mahimo kini, i-install ang gnupg.
yum install -y gnupg
Naghimo kami usa ka yawe pinaagi sa pagtubag sa mga pangutana. Gigamit nako ang akong kaugalingon nga ngalan ug email. Siguroha nga ipiho ang password alang sa yawe.
Lakaw ngadto sa mga setting sa proyekto -> Mga Setting -> CI / CD -> Mga Variable ug i-save sa usa ka variable SETTINGS_SECURITY_XML sa mosunod nga mga linya:
Naghimo kami og usa ka yano nga Dockerfile aron sa pagpadagan sa mga buluhaton sa pag-deploy gamit ang gusto nga bersyon sa Java. Sa ubos usa ka pananglitan sa alpine.
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/
Idugang ang file .gitlab-ci.yml sa gamut sa deploy project
Gipresentar sa script ang duha nga eksklusibo nga mga buluhaton sa pag-deploy. Piho nga Runner o Shared Runner matag usa.
.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
Sa mga proyekto sa java nga kinahanglan nga i-upload sa mga pampublikong repositoryo, kinahanglan nimo nga idugang ang 2 nga mga lakang aron ma-download ang mga bersyon sa Release ug Snapshot.
.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}
Niini nga solusyon, mipadayon ko og gamay ug nakahukom nga gamiton ang usa ka template sa CI alang sa mga proyekto sa java.
Sa mga detalye
Naghimo ako usa ka lahi nga proyekto gitlab-ci diin iyang gibutang ang template sa CI alang sa mga proyekto sa java komon.yml.
Pag-instalar sa mga module sa lokal nga repositoryo.
Mapuslanon kaayo alang sa lokal nga pag-verify sa mga solusyon sa ubang mga proyekto, ingon man usa ka 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>
Kung naa kay module nga walay java (pananglitan mga resources lang)
O dili nimo gusto nga makamugna og javadoc sa prinsipyo, unya sa pagtabang maven-jar-plugin
Kung ikaw adunay usa ka multi-module nga proyekto, ug dili nimo kinahanglan nga mag-upload sa usa ka piho nga module sa repository, nan kinahanglan nimo nga idugang sa pom.xml niini nga module nexus-staging-maven-plugin uban sa bandila skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Dugang nga mga plus
Usa ka dato kaayo nga lista sa mga target alang sa pagtrabaho kauban ang nexus repository (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Awtomatikong pagpagawas nga pagsusi alang sa pag-download sa sentro sa maven
Kung gitakda ang tag, ang katugbang nga buluhaton sa proyekto sa pag-deploy awtomatiko nga ma-trigger aron ma-upload ang bersyon sa pagpagawas sa nexus (usa ka panig-ingnan).
Ang labing kaayo nga bahin mao nga ang hapit nga pagpagawas awtomatiko nga nag-trigger sa koneksyon.
[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] ------------------------------------------------------------------------
Ug kung adunay sayup, nan ang buluhaton mapakyas
[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] ------------------------------------------------------------------------
Ingon usa ka sangputanan, usa ra ang nahabilin nga kapilian. O kuhaa kini nga bersyon o imantala.
Pagkahuman sa pagpagawas, pagkahuman sa pila ka oras, ang mga artifact masulod
sa hilisgutan
Usa kadto ka pagpadayag kanako nga ang maven nag-indeks sa ubang mga publikong repositoryo.
Kinahanglan nako nga i-upload ang robots.txt tungod kay kini nag-index sa akong daan nga repository.
Usa ka bulag nga proyekto sa pag-deploy diin mahimo nimong ipatuman ang daghang mga buluhaton sa CI alang sa pag-upload sa mga artifact sa mga pampublikong repositoryo alang sa lainlaing mga pinulongan sa pag-uswag.
Ang proyekto sa pag-deploy nahimulag gikan sa pagpanghilabot sa gawas ug mahimo ra nga usbon sa mga tiggamit nga adunay mga tahas sa Tag-iya ug Pagmentinar.
Usa ka bulag nga Piho nga Runner nga adunay "init" nga cache aron modagan lamang ang mga buluhaton.
Pagpublikar sa snapshot/release nga mga bersyon sa usa ka publikong repository.
Awtomatikong pagsusi sa bersyon sa pagpagawas alang sa pagkaandam alang sa pagmantala sa sentro sa maven.
Proteksyon batok sa awtomatikong pagmantala sa "hilaw" nga mga bersyon sa maven central.
Paghimo ug pagmantala sa mga bersyon sa snapshot "sa pag-klik".
Usa ka repository alang sa pagkuha sa mga bersyon sa snapshot / pagpagawas.
Kinatibuk-ang pipeline alang sa pagtukod / pagsulay / pagmantala sa usa ka proyekto sa java.
Ang pag-set up sa GitLab CI dili ingon ka komplikado sa usa ka hilisgutan sama sa una nga pagtan-aw. Igo na ang pag-set up sa CI sa usa ka turnkey nga basehan sa pipila ka mga higayon, ug karon layo ka sa usa ka amateur niini nga butang. Dugang pa, ang dokumentasyon sa GitLab sobra kaayo. Ayaw kahadlok sa paghimo sa unang lakang. Ang dalan makita sa ilawom sa mga lakang sa tawo nga naglakaw (wala ko kahinumdom kung kinsa ang nagsulti niini :)
Malipay ko sa feedback.
Sa sunod nga artikulo, ipakita ko kanimo kung giunsa ang pag-set up sa GitLab CI aron mapadagan ang mga buluhaton sa pagsulay sa panagsama nga kompetisyon (pagpadagan sa mga serbisyo sa pagsulay nga adunay docker-compose) kung adunay usa ra ka shell runner.