GitLab CI konfiguratzea maven central-era java proiektu bat kargatzeko
Artikulu hau GitLab erabiliz beren produktuak sonatype eta/edo maven biltegi zentraletan azkar argitaratzeko beharra duten java garatzaileentzat da. Artikulu honetan arazo hau konpontzeko gitlab-runner, gitlab-ci eta maven-plugin konfiguratzeari buruz hitz egingo dut.
Sonatype OSS Repository Hosting Service-n Maven Central-en artefaktuak argitaratzeko mekanismoaren deskribapen zehatza dagoeneko deskribatu da. Artikulu hau erabiltzailea googolplex, beraz, artikulu hau leku egokietan aipatuko dut.
Aurrez izena eman Sonatype JIRA eta ireki txartel bat biltegia irekitzeko (irakur ezazu atala xehetasun gehiago lortzeko Sortu txartel bat Sonatype JIRA-n). Biltegia ireki ondoren, JIRAren saio-hasiera/pasahitz bikotea (aurrerantzean Sonatype kontua) erabiliko da Sonatype nexus-era artefaktuak kargatzeko.
Linux kontsola erabiltzen baduzu GPG gako bat sortzeko (gnupg/gnupg2), orduan instalatu behar duzu RNG-tresnak entropia sortzeko. Bestela, gakoak sortzea oso denbora luzea izan daiteke.
GitLab-en inplementazio-proiektu bat konfiguratzea
Lehenik eta behin, proiektu bat sortu eta konfiguratu behar duzu kanalizazioa artefaktuak hedatzeko gordeko den. Nire proiektuari izena jarri diot sinpleki eta konplexurik gabe - zabaldu
Biltegia sortu ondoren, sarbidea mugatu behar duzu biltegia aldatzeko.
Joan proiektua -> Ezarpenak -> Biltegira -> Adar babestuak. Arau guztiak ezabatzen ditugu eta arau bakarra gehitzen dugu Komodin * batekin, bultzatzeko eta batzeko eskubidearekin, Mantentzaileak rola duten erabiltzaileentzat soilik. Arau honek bai proiektu honetako erabiltzaile guztientzat eta baita proiektu hau dagokion taldearentzat ere.
Mantentzaile batzuk badaude, irtenbiderik onena proiekturako sarbidea mugatzea izango litzateke printzipioz.
Joan proiektua -> Ezarpenak -> Orokorra -> Ikusgarritasuna, proiektuaren ezaugarriak, baimenak eta ezarri Proiektuaren ikusgarritasuna Pribatua.
Jendaurrean sar daitekeen proiektu bat daukat, nire GitLab Runner erabiltzen dudalako eta nik bakarrik daukat sarbidea biltegia aldatzeko. Beno, egia esan, ez dago nire intereseko informazio pribatua kanalizazio-erregistro publikoetan erakustea.
Biltegia aldatzeko arauak gogortzea
Joan proiektua -> Ezarpenak -> Biltegia -> Push Arauak eta ezarri Committer murrizketa, Egiaztatu egilea GitLab erabiltzailea den ala ez. Konfiguratzea ere gomendatzen dut sinadura konpromisoa, eta ezarri Ukatu sinatu gabeko konpromezuen bandera.
Ondoren, abiarazle bat konfiguratu behar duzu zereginak abiarazteko
Joan proiektua -> Ezarpenak -> CI / CD -> Pipeline abiarazleak eta sortu trigger-token berri bat
Token hau berehala gehi daiteke proiektu talde bateko aldagaien konfigurazio orokorrera.
Joan taldera -> Ezarpenak -> CI / CD -> Aldagaiak eta gehitu aldagai bat DEPLOY_TOKEN trigger-token balioarekin.
Atal honek inplementazioan zereginak exekutatzeko konfigurazioa deskribatzen du zure korrikalari propioa (espezifikoa) eta publikoa (partekatua) erabiliz.
Korrikalari espezifikoa
Nire korrikalariak erabiltzen ditut, lehenik eta behin, erosoa, azkarra eta merkea delako.
Korrikalari batentzat, Linux VDS bat gomendatzen dut CPU 1, 2 GB RAM, 20 GB HDD dituena. Jaulkipenaren prezioa ~ 3000 ₽ da urtean.
Nire korrikalaria
Korrikalariarentzat VDS 4 CPU, 4 GB RAM, 50 GB SSD hartu nuen. ~11000₽ kostatu zen eta ez zen inoiz damutu.
Guztira 7 makina ditut. 5 aruba eta 2 ihor.
Beraz, korrikalari bat dugu. Orain konfiguratuko dugu.
SSH bidez makinara joaten gara eta java, git, maven, gnupg2 instalatzen ditugu.
Sortu direktorio bat maven cacherako eta esleitu talde-baimenak runner
Puntu hau salta dezakezu makina batean hainbat korrikalari exekutatzeko asmorik ez baduzu.
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!
Lasterkaria izena emanda dagoela egiaztatzen dugu. Joan gitlab.com webgunera -> deploy-project -> Ezarpenak -> CI/CD -> Korrikalariak -> Korrikalari espezifikoak -> Proiektu honetarako aktibatuta dauden korrikalariak
Pantaila
Gehitu Aparteko zerbitzu /etc/systemd/system/gitlab-deployer.service
Galderak erantzunez gako bat sortzen dugu. Nire izena eta posta elektronikoa erabili ditut.
Ziurtatu gakoaren pasahitza zehazten duzula. Artifaktuak gako honekin sinatuko dira.
gpg --gen-key
check
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
Gure gako publikoa gako zerbitzarira igotzen
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Sortu Maven direktorioa biltegiko eta estekatu cachera (ez egin akatsik)
Puntu hau salta dezakezu makina batean hainbat korrikalari exekutatzeko asmorik ez baduzu.
Dockerfile nahiko sinple bat sortzen dugu inplementatzeko zereginak Javaren beharrezko bertsioarekin exekutatzeko. Jarraian, alpinorako adibide bat dago.
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/
Gehitu .gitlab-ci.yml fitxategia hedapen proiektuaren erroan
Gidoiak elkarren artean esklusiboak diren bi inplementazio-zeregin aurkezten ditu. Korrikalari espezifikoa edo Korrikalari partekatua hurrenez hurren.
.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
Moduluak biltegi lokalean instalatzen ditu.
Oso erabilgarria beste proiektu batzuetako soluzioen tokian tokiko egiaztatzeko, baita checksum bat egiteko ere.
<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>
Modulu anitzeko proiektu bat baduzu eta ez baduzu modulu zehatz bat biltegira igo behar, orduan gehitu behar duzu nexus-staging-maven-plugin banderarekin skipNexusStagingDeployMojo
Deskargatu ondoren, argazki/argitalpen bertsioak eskuragarri daude eszenaratzea biltegiak
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Plus gehiago
Nexus biltegiarekin lan egiteko helburuen zerrenda oso aberatsa (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Etiketa bat instalatzen denean, inplementazio-proiektuan dagokion zeregina automatikoki abiarazten da kaleratze-bertsioa nexus-era deskargatzeko (Adibidez).
Zatirik onena da hurbileko askapena automatikoki abiarazten dela nexus-en.
[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] ------------------------------------------------------------------------
Eta zerbait gaizki ateratzen bada, zereginak behin betiko huts egingo du
[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] ------------------------------------------------------------------------
Ondorioz, aukera bakarra geratzen zaigu. Ezabatu bertsio hau edo argitaratu.
Askatu ondoren, denboraren buruan artefaktuak sartuko dira
offtopic
Niretzat aurkikuntza bat izan zen maven-ek beste biltegi publiko batzuk indexatzen dituela.
Robots.txt gehitu behar izan nuen nire biltegi zaharra indexatzen zuelako.
Inplementazio-proiektu bereizi bat, non hainbat CI zeregin inplementatu ditzakezun artefaktuak biltegi publikoetara kargatzeko hainbat garapen hizkuntzatarako.
Inplementatu proiektua kanpoko interferentziatik isolatuta dago eta Jabea eta Mantentzailea rolak dituzten erabiltzaileek soilik alda dezakete.
Lasterkari espezifiko bereizi bat, cache "beroa" duena, zereginak soilik inplementatzeko.
Argazki/argitalpen bertsioak biltegi publiko batean argitaratzea.
Maven central-en argitaratzeko prest dagoen bertsioaren egiaztapen automatikoa.
Maven central-en bertsio "gordinak" automatikoki argitaratzeko babesa.
Eraiki eta argitaratu argazkien bertsioak "klik eginez".
Snapshot/argitalpen bertsioak lortzeko biltegi bakarra.
Java proiektu bat eraikitzeko/probak/argitaratzeko kanalizazio orokorra.
GitLab CI konfiguratzea ez da lehen begiratuan dirudien bezain gai korapilatsua. Nahikoa da CI giltza eskuan konfiguratzea pare bat aldiz, eta orain afizionatutik urrun zaude gai honetan. Gainera, GitLab-en dokumentazioa oso erredundantea da. Ez izan beldurrik lehen urratsa emateko. Errepidea dabilenaren eskaileraren azpian agertzen da (ez dut gogoratzen nork esan zuen :)
Pozik jasoko dut iritzia.
Hurrengo artikuluan GitLab CI konfigurazioari buruz hitz egingo dut integrazio-probekin zereginak lehiakortasunean exekutatzeko (proban dauden zerbitzuak docker-compose erabiliz exekutatu) shell runner bakarra baduzu.