Agordante GitLab CI por alŝuti java projekton al maven central
Ĉi tiu artikolo estas destinita por java-programistoj, kiuj bezonas rapide publikigi siajn produktojn al sonataj kaj/aŭ maven-centraj deponejoj uzante GitLab. En ĉi tiu artikolo, mi parolos pri agordo de gitlab-runner, gitlab-ci kaj maven-plugin por solvi ĉi tiun problemon.
Antaŭkondiĉoj:
Sekura stokado de mvn kaj GPG-ŝlosiloj.
Sekura plenumo de publikaj CI-taskoj.
Alŝuto de artefaktoj (eldono/momentfoto) al publikaj deponejoj.
Aŭtomata kontrolo de eldonversioj por publikigo en Maven Central.
Ĝenerala solvo por alŝuti artefaktojn al deponejo por pluraj projektoj.
Detala priskribo de la mekanismo por publikigado de artefaktoj al Maven Central per la Sonatype OSS Repository Hosting Service jam estas priskribita en ĉi tiu artikolo uzanto Googlelplex, do mi referencos ĉi tiun artikolon en la ĝustaj lokoj.
Antaŭregistru por Sonatipo JIRA kaj komencu bileton por malfermi la deponejon (por pliaj detaloj, legu la sekcion Kreu Sonatype JIRA-bileton). Post malfermo de la deponejo, la JIRA-ensaluto/pasvortparo (ĉi-poste nomata Sonatype-konto) estos uzata por alŝuti artefaktojn al la Sonatype ligilo.
Se vi uzas la Linuksan konzolon por generi GPG-ŝlosilon (gnupg/gnupg2), tiam vi devas instali rng-iloj por generi entropion. Alie, ŝlosila generacio povas daŭri tre longan tempon.
Antaŭ ĉio, vi devas krei kaj agordi projekton, en kiu la dukto estos stokita por la disfaldiĝo de artefaktoj. Mi nomis mian projekton simple kaj nekomplika - disfaldi
Post kreado de la deponejo, vi devas limigi aliron por ŝanĝi la deponejon.
Iru al la projekto -> Agordoj -> Deponejo -> Protektitaj branĉoj. Ni forigas ĉiujn regulojn kaj aldonas ununuran regulon kun Wildcard * kun la rajto puŝi kaj kunfandi nur por uzantoj kun la rolo Prizorgantoj. Ĉi tiu regulo funkcios por ĉiuj uzantoj kaj de ĉi tiu projekto kaj de la grupo al kiu ĉi tiu projekto apartenas.
Se estas pluraj prizorgantoj, tiam la plej bona solvo estus principe limigi aliron al la projekto.
Iru al la projekto -> Agordoj -> Ĝenerala -> Videbleco, projektaj funkcioj, permesoj kaj agordu Projektan videblecon al privata.
Mi havas projekton en publika aliro, ĉar mi uzas mian propran GitLab Runner kaj nur mi havas aliron por modifi la deponejon. Nu, fakte ne estas en mia intereso montri privatajn informojn en publikaj protokoloj.
Streĉigi la regulojn por ŝanĝi la deponejon
Iru al la projekto -> Agordoj -> Deponejo -> Push Rules kaj starigu la flagojn Committer-limigo, Kontrolu ĉu aŭtoro estas GitLab-uzanto. Mi ankaŭ rekomendas agordi commit subskribo, kaj starigu la flagon Malakcepti nesubskribitajn.
Poste, vi devas agordi ellasilon por ruli taskojn
Iru al projekto -> Agordoj -> CI / KD -> Pipeline-eksiloj kaj kreu novan ellasilon
Ĉi tiu signo povas esti tuj aldonita al la ĝenerala agordo de variabloj por grupo de projektoj.
Iru al la grupo -> Agordoj -> CI / KD -> Variabloj kaj aldonu variablon DEPLOY_TOKEN kun ellasilo-ĵetono en la valoro.
Ĉi tiu sekcio priskribas la agordon por funkciigado de taskoj dum deplojo uzante la denaskan (Specifa) kaj publikan (Kundividita) kuristo.
Specifa Kuristo
Mi uzas miajn proprajn kuristojn ĉar, antaŭ ĉio, ĝi estas oportuna, rapida kaj malmultekosta.
Por kuristo mi rekomendas Linukson VDS kun 1 CPU, 2 GB RAM, 20 GB HDD. Eldonprezo ~ 3000₽ jare.
Mia kuristo
Por la kuristo mi prenis VDS 4 CPU, 4 GB RAM, 50 GB SSD. Ĝi kostis ~11000₽ kaj neniam bedaŭris ĝin.
Mi havas entute 7 maŝinojn. 5 sur arubo kaj 2 sur ihor.
Do, ni havas kuriston. Nun ni starigos ĝin.
Ni iras al la maŝino per SSH kaj instalas java, git, maven, gnupg2.
Kreu dosierujon por la kaŝmemoro de Maven kaj asignu grupajn permesojn runner
Vi povas preterlasi ĉi tiun paŝon se vi ne planas funkciigi plurajn kuristojn sur la sama maŝino.
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!
Kontrolu, ke la kuristo estas registrita. Iru al gitlab.com -> deploy-project -> Agordoj -> CI/CD -> Runners -> Specifaj Runners -> Runners aktivigitaj por ĉi tiu projekto
Ni generas ŝlosilon respondante demandojn. Mi uzis mian propran nomon kaj retpoŝton.
Nepre specifu la pasvorton por la ŝlosilo. Artefaktoj estos subskribitaj per ĉi tiu ŝlosilo.
gpg --gen-key
Kontrolante
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
Alŝutante nian publikan ŝlosilon al la ŝlosilservilo
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Kreu maven-dosierujon repositorio kaj ligu kun la kaŝmemoro (ne eraru)
Ĉi tiu paŝo povas esti preterlasita se vi ne planas funkciigi plurajn kuristojn sur la sama maŝino.
Aldonu la dosieron .gitlab-ci.yml al la radiko de la deploja projekto
La skripto prezentas du reciproke ekskluzivajn deplojajn taskojn. Specifa Kurulo aŭ Kunigita Kurulo respektive.
.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
Se vi havas multmodulan projekton, kaj vi ne bezonas alŝuti specifan modulon al la deponejo, tiam vi devas aldoni al la pom.xml de ĉi tiu modulo. nexus-staging-maven-plugin kun flago skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Pli da plusoj
Tre riĉa listo de celoj por labori kun la nexus-deponejo (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Aŭtomata liberigokontrolo por elŝutebleco en Maven Central
Kiam la etikedo estas agordita, la responda tasko en la deploja projekto aŭtomate ekfunkciiĝas por alŝuti la eldonan version al nexus (ekzemplo).
La plej bona parto estas, ke proksima liberigo aŭtomate ekfunkciigas en 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] ------------------------------------------------------------------------
Kaj se io misfunkciis, tiam la tasko malsukcesos
[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] ------------------------------------------------------------------------
Kiel rezulto, ni restas kun nur unu elekto. Aŭ forigu ĉi tiun version aŭ publikigu ĝin.
Post la liberigo, post iom da tempo, la artefaktoj estos enen
ekstertema
Estis revelacio por mi, ke Maven indeksas aliajn publikajn deponejojn.
Mi devis aldoni robots.txt ĉar ĝi indeksigis mian malnovan deponejon.
Aparta deploja projekto en kiu vi povas efektivigi plurajn CI-taskojn por alŝuti artefaktojn al publikaj deponejoj por diversaj evolulingvoj.
La deplojprojekto estas izolita de ekstera interfero kaj povas esti modifita nur de uzantoj kun la Posedanto kaj Prizorganto-roloj.
Aparta Specifa Kurilo kun "varma" kaŝmemoro por ruli nur deploji taskojn.
Publikigo de momentfoto/eldonaj versioj en publika deponejo.
Aŭtomata kontrolo de la eldonversio por preteco por publikigo en Maven Central.
Protekto kontraŭ aŭtomata publikigo de "krudaj" versioj en maven central.
Konstruu kaj publikigu momentajn versiojn "alklakante".
Ununura deponejo por akiri momentajn/eldonajn versiojn.
Ĝenerala dukto por konstrui / testi / publikigi java projekton.
Agordo de GitLab CI ne estas tiel komplika temo kiel ŝajnas unuavide. Sufiĉas agordi CI surŝlosilbaze kelkajn fojojn, kaj nun vi estas malproksime de amatoro en ĉi tiu afero. Plie, GitLab-dokumentado estas tre redunda. Ne timu fari la unuan paŝon. La vojo aperas sub la ŝtupoj de la marŝanto (mi ne memoras, kiu diris ĝin :)
Mi ĝojos respondi.
En la sekva artikolo, mi montros al vi kiel agordi GitLab CI por ruli integrajn testajn taskojn konkurencive (funkciigi testajn servojn kun docker-compose) se vi havas nur unu ŝelan kuriston.