ProHoster > Blog > İdarə > java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması
java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması
Bu məqalə GitLab istifadə edərək sonatip və/və ya maven mərkəzi repozitoriyalarında öz məhsullarını tez dərc etməli olan java tərtibatçıları üçün nəzərdə tutulub. Bu yazıda mən bu problemi həll etmək üçün gitlab-runner, gitlab-ci və maven-plugin qurmaq haqqında danışacağam.
Ön şərtlər:
Mvn və GPG açarlarının təhlükəsiz saxlanması.
İctimai CI tapşırıqlarının təhlükəsiz icrası.
Artefaktların (buraxılış/snapshot) ictimai depolara yüklənməsi.
Maven center-də dərc üçün buraxılış versiyalarının avtomatik yoxlanılması.
Artefaktları çoxsaylı layihələr üçün depoya yükləmək üçün ümumi həll.
Sonatype OSS Repository Hosting Service vasitəsilə Maven Central-a artefaktların dərc edilməsi mexanizminin ətraflı təsviri artıq burada təsvir edilmişdir. bu məqalə istifadəçi Googolplex, buna görə də bu məqaləyə lazımi yerlərdə müraciət edəcəyəm.
Öncədən qeydiyyatdan keçin Sonatip JIRA və deponu açmaq üçün biletə başlayın (ətraflı məlumat üçün bölməni oxuyun Sonatype JIRA bileti yaradın). Repozitoriya açıldıqdan sonra JIRA giriş/parol cütü (bundan sonra Sonatype hesabı adlandırılacaq) Sonatype nexusuna artefaktları yükləmək üçün istifadə olunacaq.
Əgər siz GPG açarı (gnupg/gnupg2) yaratmaq üçün Linux konsolundan istifadə edirsinizsə, onda siz quraşdırmalısınız. rng-tools entropiya yaratmaq. Əks halda, açarın yaradılması çox uzun vaxt apara bilər.
İlk növbədə, artefaktların yerləşdirilməsi üçün boru kəmərinin saxlanacağı bir layihə yaratmalı və konfiqurasiya etməlisiniz. Layihəmi sadə və sadə adlandırdım - yerləşdirmək
Repozitoriya yaratdıqdan sonra repozitoriyanı dəyişdirmək üçün girişi məhdudlaşdırmalısınız.
Layihə -> Parametrlər -> Repozitoriya -> Qorunan Filiallara gedin. Biz bütün qaydaları silir və yalnız Maintainers rolu olan istifadəçilər üçün təkan və birləşmə hüququ ilə Wildcard * ilə bir qayda əlavə edirik. Bu qayda həm bu layihənin bütün istifadəçiləri, həm də bu layihənin aid olduğu qrup üçün işləyəcək.
Bir neçə baxıcı varsa, ən yaxşı həll prinsipcə layihəyə girişi məhdudlaşdırmaq olardı.
Layihə -> Parametrlər -> Ümumi -> Görünüş, layihə xüsusiyyətləri, icazələrə gedin və Layihənin görünməsini təyin edin Xüsusi.
Mən öz GitLab Runner-dən istifadə etdiyim üçün və yalnız deponu dəyişdirmək imkanım olduğu üçün ictimai çıxışda bir layihəm var. Əslində, ictimai boru kəməri jurnallarında şəxsi məlumatları göstərmək mənim maraqlarımda deyil.
Anbarın dəyişdirilməsi qaydalarının sərtləşdirilməsi
Layihə -> Parametrlər -> Repozitoriya -> Push Qaydalarına gedin və Komitent məhdudiyyətini təyin edin, Müəllifin GitLab istifadəçisi olub olmadığını yoxlayın. Mən də təyin etməyi məsləhət görürəm imza atmaq, və İmzasız öhdəliyi rədd et bayrağını təyin edin.
Sonra, tapşırıqları yerinə yetirmək üçün bir tətiyi konfiqurasiya etməlisiniz
Layihə -> Parametrlər -> CI / CD -> Boru kəməri tetikleyicilerine gedin və yeni trigger-token yaradın.
Bu işarə dərhal bir qrup layihələr üçün dəyişənlərin ümumi konfiqurasiyasına əlavə edilə bilər.
Qrupa gedin -> Parametrlər -> CI / CD -> Dəyişənlər və dəyişən əlavə edin DEPLOY_TOKEN dəyərdə trigger-token ilə.
Bu bölmə yerli (Xüsusi) və ictimai (Paylaşılan) qaçışçıdan istifadə edərək yerləşdirmə zamanı tapşırıqların icrası üçün konfiqurasiyanı təsvir edir.
Xüsusi Runner
Mən öz qaçışlarımdan istifadə edirəm, çünki ilk növbədə rahat, sürətli, ucuzdur.
Qaçış üçün mən 1 CPU, 2 GB RAM, 20 GB HDD ilə Linux VDS tövsiyə edirəm. Buraxılış qiyməti ~ illik 3000₽.
Mənim qaçışçım
Qaçış üçün VDS 4 CPU, 4 GB RAM, 50 GB SSD götürdüm. Qiyməti ~11000₽ və heç vaxt peşman deyiləm.
Cəmi 7 maşınım var. Arubada 5, İhorda 2.
Beləliklə, bir qaçışçımız var. İndi biz onu quracağıq.
SSH vasitəsilə maşına gedirik və java, git, maven, gnupg2 quraşdırırıq.
Maven keşi üçün kataloq yaradın və qrup hüquqları təyin edin runner
Eyni maşında birdən çox qaçış keçirməyi planlaşdırmırsınızsa, bu addımı atlaya bilərsiniz.
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!
Qaçışçının qeydiyyatdan keçdiyini yoxlayın. Get gitlab.com -> Deploy-project -> Parametrlər -> CI/CD -> Runners -> Spesifik Qaçışçılar -> Bu layihə üçün aktivləşdirilmiş qaçışçılar
Ekran
Əlavə edin ayrı xidmət /etc/systemd/system/gitlab-deployer.service
Suallara cavab verərək açar yaradırıq. Mən öz adımdan və e-poçtumdan istifadə etdim.
Açar üçün parol təyin etməyinizə əmin olun. Artefaktlar bu açarla imzalanacaq.
gpg --gen-key
Yoxlayın
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
Açıq açarımız açar serverə yüklənir
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
İstədiyiniz Java versiyası ilə yerləşdirmə zamanı tapşırıqları yerinə yetirmək üçün kifayət qədər sadə Dockerfile yaradırıq. Aşağıda alp üçün bir nümunə verilmişdir.
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 faylını yerləşdirmə layihəsinin kökünə əlavə edin
Skript bir-birini istisna edən iki yerləşdirmə tapşırığını təqdim edir. Müvafiq olaraq Xüsusi Runner və ya Paylaşılan Runner.
.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
Bu mövzu çox ətraflı təsvir edilmişdir. Googolplex в Avtomatik imzalamaq və artefaktları snapshot və səhnələşdirmə depolarına yükləmək üçün maven qurulması, buna görə də plaginlərdən istifadənin bəzi nüanslarını təsvir edəcəyəm. Nə qədər asan və təbii şəkildə istifadə edə biləcəyinizi də təsvir edəcəyəm nexus-staging-maven-pluginorg.sonatype.oss:oss-parent-i layihəniz üçün valideyn kimi istifadə etmək istəmirsinizsə və ya istifadə edə bilmirsinizsə.
maven-quraşdırma-plugin
Modulları yerli depoda quraşdırır.
Digər layihələrdə həllərin yerli yoxlanması, həmçinin yoxlama məbləği üçün çox faydalıdır.
<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>
Çox modullu layihəniz varsa və anbara xüsusi modul yükləməyinizə ehtiyac yoxdursa, bu modulun pom.xml-ə əlavə etməlisiniz. nexus-staging-maven-plugin bayraqla skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Daha çox üstünlüklər
Nexus repozitoriyası ilə işləmək üçün hədəflərin çox zəngin siyahısı (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Teq təyin edildikdə, buraxılış versiyasını Nexus-a yükləmək üçün yerləşdirmə layihəsində müvafiq tapşırıq avtomatik olaraq işə salınır (misal).
Ən yaxşısı odur ki, yaxın buraxılış avtomatik olaraq nexus-da işə salınır.
[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] ------------------------------------------------------------------------
Və bir şey səhv olarsa, tapşırıq uğursuz olacaq
[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] ------------------------------------------------------------------------
Nəticədə qarşımızda yalnız bir seçim qalır. Və ya bu versiyanı silin və ya dərc edin.
Buraxıldıqdan sonra bir müddət sonra əsərlər içəridə olacaq
mövzudan kənar
Maven'in digər ictimai depoları indeksləməsi mənə bir vəhy oldu.
Mən robots.txt faylını yükləməli oldum, çünki o, mənim köhnə depomu indeksləşdirdi.
Müxtəlif inkişaf dilləri üçün ictimai repozitoriyalara artefaktların yüklənməsi üçün bir neçə CI tapşırığını həyata keçirə biləcəyiniz ayrıca yerləşdirmə layihəsi.
Yerləşdirmə layihəsi kənar müdaxilədən təcrid olunub və yalnız Sahib və Təminatçı rolu olan istifadəçilər tərəfindən dəyişdirilə bilər.
Yalnız yerləşdirmə tapşırıqlarını yerinə yetirmək üçün "isti" keş ilə ayrıca Xüsusi Runner.
Snapshot/reliz versiyalarının ictimai depoda dərci.
Maven center-də nəşrə hazır olmaq üçün buraxılış versiyasının avtomatik yoxlanılması.
Maven center-də “xam” versiyaların avtomatik dərcinə qarşı qorunma.
Snapshot versiyalarını “kliklə” yaradın və dərc edin.
Snapshot/buraxılış versiyaları əldə etmək üçün tək depo.
Java layihəsinin qurulması / sınaqdan keçirilməsi / nəşri üçün ümumi boru kəməri.
GitLab CI-nin qurulması ilk baxışdan göründüyü qədər mürəkkəb bir mövzu deyil. Bir neçə dəfə açar təslim əsasında CI qurmaq kifayətdir və indi bu məsələdə həvəskardan uzaqsınız. Üstəlik, GitLab sənədləri çox lazımsızdır. İlk addımı atmaqdan qorxma. Yol gedən adamın addımlarının altında görünür (kimin dediyini xatırlamıram :)
Mən rəy bildirməkdən şad olaram.
Növbəti məqalədə mən sizə GitLab CI-ni inteqrasiya test tapşırıqlarını rəqabətli şəkildə yerinə yetirmək üçün necə quracağınızı göstərəcəyəm (docker-compose ilə test xidmətlərini yerinə yetirmək), əgər yalnız bir shell runneriniz varsa.