ProHoster > Blog > Ma'muriyat > Maven centerga java loyihasini yuklash uchun GitLab CI o'rnatilmoqda
Maven centerga java loyihasini yuklash uchun GitLab CI o'rnatilmoqda
Ushbu maqola GitLab-dan foydalangan holda o'z mahsulotlarini sonatip va/yoki maven markaziy omborlarida tezda nashr etishga muhtoj bo'lgan java dasturchilari uchun mo'ljallangan. Ushbu maqolada men ushbu muammoni hal qilish uchun gitlab-runner, gitlab-ci va maven-pluginni o'rnatish haqida gapiraman.
Old shartlar:
mvn va GPG kalitlarini xavfsiz saqlash.
Ommaviy CI vazifalarini xavfsiz bajarish.
Ommaviy omborlarga artefaktlarni yuklash (reliz/snapshot).
Maven markazida chop etish uchun versiya versiyalarini avtomatik tekshirish.
Bir nechta loyihalar uchun repozitoriyga artefaktlarni yuklash uchun umumiy yechim.
Maven Central-da Sonatype OSS Repository Hosting xizmati orqali artefaktlarni nashr qilish mexanizmining batafsil tavsifi allaqachon tasvirlangan. Ushbu maqola foydalanuvchi Googolplex, shuning uchun men ushbu maqolaga kerakli joylarda murojaat qilaman.
Oldindan ro'yxatdan o'ting JIRA sonatipi va omborni ochish uchun chiptani oching (batafsil ma'lumot uchun bo'limni o'qing Sonatype JIRA-da chipta yarating). Repozitoriy ochilgandan so'ng JIRA login/parol juftligi (keyingi o'rinlarda Sonatype hisobi deb yuritiladi) Sonatype nexus-ga artefaktlarni yuklash uchun ishlatiladi.
Agar siz GPG kalitini (gnupg/gnupg2) yaratish uchun Linux konsolidan foydalansangiz, o'rnatishingiz kerak. rng-vositalari entropiya hosil qilish uchun. Aks holda, kalit yaratish juda uzoq vaqt talab qilishi mumkin.
Avvalo, siz artefaktlarni joylashtirish uchun quvur liniyasi saqlanadigan loyihani yaratishingiz va sozlashingiz kerak. Men o'z loyihamni oddiy va sodda tarzda nomladim - tarqatish
Omborni yaratgandan so'ng, omborni o'zgartirish uchun kirishni cheklashingiz kerak.
Loyiha -> Sozlamalar -> Repository -> Himoyalangan filiallarga o'ting. Biz barcha qoidalarni o'chirib tashlaymiz va faqat Maintainers roliga ega foydalanuvchilar uchun surish va birlashtirish huquqiga ega Wildcard * bilan bitta qoida qo'shamiz. Ushbu qoida ushbu loyihaning barcha foydalanuvchilari va ushbu loyiha tegishli bo'lgan guruh uchun ishlaydi.
Agar bir nechta texnik xizmat ko'rsatuvchi bo'lsa, unda eng yaxshi yechim printsipial jihatdan loyihaga kirishni cheklash bo'ladi.
Loyiha -> Sozlamalar -> Umumiy -> Koʻrinish, loyiha xususiyatlari, ruxsatnomalar boʻlimiga oʻting va Loyiha koʻrinishini oʻrnating shaxsiy.
Menda hammaga ochiq loyiha bor, chunki men o'zimning GitLab Runner-dan foydalanaman va faqat men omborni o'zgartirish huquqiga egaman. Xo'sh, aslida, jamoat quvurlari jurnallarida shaxsiy ma'lumotlarni ko'rsatish mening manfaatlarimga mos kelmaydi.
Omborni o'zgartirish qoidalarini kuchaytirish
Loyiha -> Sozlamalar -> Repository -> Push Rules-ga o'ting va Committer cheklovini o'rnating, muallif GitLab foydalanuvchi bayroqlari ekanligini tekshiring. Men ham sozlashni tavsiya qilaman imzo qo'yish, va "Reject unsigned commits" belgisini o'rnating.
Keyin vazifalarni ishga tushirish uchun triggerni sozlashingiz kerak
Loyiha -> Sozlamalar -> CI / CD -> Quvur liniyasi triggerlariga o'ting va yangi trigger-token yarating.
Ushbu token darhol loyihalar guruhi uchun o'zgaruvchilarning umumiy konfiguratsiyasiga qo'shilishi mumkin.
Guruhga o'ting -> Sozlamalar -> CI / CD -> O'zgaruvchilar va o'zgaruvchini qo'shing DEPLOY_TOKEN qiymatida trigger-token bilan.
Ushbu bo'limda o'zingizning (Maxsus) va umumiy (Umumiy) yuguruvchingiz yordamida tarqatish bo'yicha vazifalarni bajarish konfiguratsiyasi tasvirlangan.
Maxsus yuguruvchi
Men o'zimning yuguruvchilarmdan foydalanaman, chunki, birinchi navbatda, bu qulay, tez va arzon.
Yuguruvchi uchun men 1 protsessor, 2 GB RAM, 20 GB HDD bilan Linux VDS ni tavsiya qilaman. Chiqarilish narxi yiliga ~3000₽.
Mening yuguruvchim
Yuguruvchi uchun men VDS 4 protsessor, 4 GB operativ xotira, 50 GB SSD oldim. Narxi ~11000 XNUMX₽ va hech qachon afsuslanmadi.
Menda jami 7 ta mashina bor. Arubada 5 ta va Ihorda 2 ta.
Shunday qilib, bizda yuguruvchi bor. Endi biz uni sozlaymiz.
Biz SSH orqali mashinaga o'tamiz va java, git, maven, gnupg2 ni o'rnatamiz.
Maven keshi uchun katalog yarating va guruh ruxsatlarini tayinlang runner
Agar siz bir mashinada bir nechta yuguruvchilarni yugurishni rejalashtirmasangiz, bu nuqtani o'tkazib yuborishingiz mumkin.
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!
Yuguruvchining ro'yxatdan o'tganligini tekshiramiz. Gitlab.com veb-saytiga o'ting -> deploy-project -> Sozlamalar -> CI/CD -> Yuguruvchilar -> Maxsus yuguruvchilar -> Ushbu loyiha uchun faollashtirilgan yuguruvchilar
Ekran
Qo'shing alohida xizmat ko'rsatish /etc/systemd/system/gitlab-deployer.service
Savollarga javob berish orqali kalitni yaratamiz. Men o'z ismim va elektron pochtamdan foydalandim.
Kalit uchun parolni ko'rsatganingizga ishonch hosil qiling. Artefaktlar ushbu kalit bilan imzolanadi.
gpg --gen-key
Tekshirish
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
Ochiq kalitimiz kalit serverga yuklanmoqda
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Foydalanuvchi sifatida tizimga kiring gitlab-deployer
su gitlab-deployer
maven katalogini yarating omborxona va keshga havola (xato qilmang)
Agar siz bir mashinada bir nechta yuguruvchilarni yugurishni rejalashtirmasangiz, bu nuqtani o'tkazib yuborishingiz mumkin.
Avvalo, siz GPG kalitini yaratishingiz kerak. Buning uchun gnupg-ni o'rnating.
yum install -y gnupg
Savollarga javob berish orqali kalitni yaratamiz. Men o'z ismim va elektron pochtamdan foydalandim. Kalit uchun parolni ko'rsatganingizga ishonch hosil qiling.
Biz Java-ning kerakli versiyasi bilan joylashtirish vazifalarini bajarish uchun juda oddiy Dockerfile yaratamiz. Quyida alp tog'lari uchun misol keltirilgan.
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 faylini joylashtirish loyihasining ildiziga qo'shing
Skript ikkita o'zaro eksklyuziv joylashtirish vazifasini taqdim etadi. Maxsus yuguruvchi yoki umumiy yuguruvchi.
.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
<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>
Agar sizda java bo'lmagan modul bo'lsa (masalan, faqat resurslar)
Yoki printsipial ravishda javadoc yaratishni xohlamaysiz, keyin yordam bering maven-jar-plugin
Agar sizda ko'p modulli loyihangiz bo'lsa va siz ma'lum modulni omborga yuklashingiz shart bo'lmasa, unda siz qo'shishingiz kerak. nexus-staging-maven-plugin bayroq bilan skipNexusStagingDeployMojo
Yuklab olingandan so'ng, oniy rasm/reliz versiyalari mavjud saqlash omborlari
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Ko'proq ortiqcha
Nexus repository bilan ishlash uchun juda boy maqsadlar ro'yxati (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Maven markaziga yuklash uchun avtomatik reliz tekshiruvi
Teg o'rnatilganda, tarqatish loyihasidagi tegishli vazifa avtomatik ravishda nexus-ga reliz versiyasini yuklab olish uchun ishga tushiriladi (misol).
Eng yaxshi tomoni shundaki, yaqin chiqarish avtomatik ravishda nexusda ishga tushadi.
[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] ------------------------------------------------------------------------
Va agar biror narsa noto'g'ri bo'lsa, vazifa, albatta, muvaffaqiyatsiz bo'ladi
[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] ------------------------------------------------------------------------
Natijada bizda faqat bitta tanlov qoladi. Ushbu versiyani o'chiring yoki nashr qiling.
Chiqarilganidan keyin, bir muncha vaqt o'tgach, artefaktlar ichkariga kiradi
mavzudan tashqari
Maven boshqa ommaviy omborlarni indekslashi men uchun kashfiyot bo'ldi.
Men robots.txt ni qo'shishim kerak edi, chunki u mening eski omborimni indeksladi.
Alohida joylashtirish loyihasi bo'lib, unda siz turli xil tillar uchun ommaviy omborlarga artefaktlarni yuklash uchun bir nechta CI vazifalarini bajarishingiz mumkin.
Deploy loyihasi tashqi aralashuvdan ajratilgan va uni faqat Egasi va Ta'minotchi roliga ega foydalanuvchilar o'zgartirishi mumkin.
Faqat tarqatish vazifalarini bajarish uchun "issiq" keshga ega alohida maxsus yuguruvchi.
Snapshot/reliz versiyalarini ommaviy omborda nashr qilish.
Maven markazida nashrga tayyorligi uchun reliz versiyasini avtomatik tekshirish.
Maven markazida "xom" versiyalarning avtomatik nashr etilishidan himoya.
Snapshot versiyalarini “bosish orqali” yarating va nashr eting.
Snapshot/reliz versiyalarini olish uchun yagona ombor.
Java loyihasini qurish/sinov/nashr qilish uchun umumiy quvur liniyasi.
GitLab CI-ni sozlash birinchi qarashda ko'rinadigan darajada murakkab mavzu emas. CI ni bir necha marta kalit asosida o'rnatish kifoya va endi siz bu masalada havaskorlikdan yiroqsiz. Bundan tashqari, GitLab hujjatlari juda ortiqcha. Birinchi qadamni qo'yishdan qo'rqmang. Yo'l yurgan odamning zinapoyasi ostida paydo bo'ladi (kim aytgani esimda yo'q :)
Fikr-mulohazalarni qabul qilishdan xursand bo'laman.
Keyingi maqolada men GitLab CI-ni integratsiya testlari bilan vazifalarni raqobatdosh tarzda bajarish uchun qanday sozlash haqida gapiraman (docker-compose yordamida sinov ostidagi xizmatlarni ishga tushirish), agar sizda faqat bitta qobiq bo'lsa.