ProHoster > Blog > yönetim > Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu
Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu
Bu makale, ürünlerini GitLab kullanarak hızlı bir şekilde sonatype ve/veya maven merkezi depolarında yayınlaması gereken java geliştiricilerine yöneliktir. Bu yazımda bu sorunu çözmek için gitlab-runner, gitlab-ci ve maven-plugin kurulumundan bahsedeceğim.
Önkoşullar:
Mvn ve GPG anahtarlarının güvenli şekilde saklanması.
Genel CI görevlerinin güvenli bir şekilde yürütülmesi.
Yapıtların (yayın/anlık görüntü) genel depolara yüklenmesi.
Maven Central'da yayınlanmak üzere yayın sürümlerinin otomatik olarak kontrol edilmesi.
Birden fazla proje için yapıların bir havuza yüklenmesine yönelik genel bir çözüm.
Yapıtların Sonatype OSS Depo Barındırma Hizmeti aracılığıyla Maven Central'da yayınlanmasına yönelik mekanizmanın ayrıntılı bir açıklaması zaten şurada açıklanmıştır: bu makale kullanıcı googolplexbu yüzden bu makaleye doğru yerlerde başvuracağım.
Şu adreste ön kayıt yaptırın: Sonatip JIRA ve depoyu açmak için bir bilet açın (daha fazla ayrıntı için bölümü okuyun) Sonatype JIRA'da bir bilet oluşturun). Depoyu açtıktan sonra JIRA kullanıcı adı/şifre çifti (bundan sonra Sonatype hesabı olarak anılacaktır), eserleri Sonatype nexus'a yüklemek için kullanılacaktır.
GPG anahtarı (gnupg/gnupg2) oluşturmak için Linux konsolunu kullanıyorsanız, rng araçları entropi üretmek. Aksi takdirde anahtar üretimi çok uzun zaman alabilir.
Her şeyden önce, yapıtların dağıtımı için işlem hattının depolanacağı bir proje oluşturmanız ve yapılandırmanız gerekir. Projemi basit ve karmaşık olmayan bir şekilde adlandırdım - dağıtmak
Depoyu oluşturduktan sonra depoyu değiştirmek için erişimi kısıtlamanız gerekir.
Projeye gidin -> Ayarlar -> Depo -> Korumalı Dallar. Tüm kuralları siliyor ve yalnızca Bakımcı rolüne sahip kullanıcılar için aktarma ve birleştirme hakkına sahip Wildcard * ile tek bir kural ekliyoruz. Bu kural hem bu projenin hem de bu projenin ait olduğu grubun tüm kullanıcıları için geçerli olacaktır.
Birden fazla bakımcı varsa en iyi çözüm, prensipte projeye erişimi kısıtlamak olacaktır.
Projeye gidin -> Ayarlar -> Genel -> Görünürlük, proje özellikleri, izinler ve Proje görünürlüğünü şu şekilde ayarlayın: Özel Etkinlik.
Kendi GitLab Runner'ımı kullandığım ve depoyu değiştirme erişimine yalnızca benim sahip olduğum için, genel erişime açık bir projem var. Aslında özel bilgilerin halka açık boru hattı kayıtlarında gösterilmesi benim çıkarıma uygun değil.
Depoyu değiştirme kurallarının sıkılaştırılması
Projeye gidin -> Ayarlar -> Depo -> Push Kuralları ve Committer kısıtlamasını ayarlayın, Yazarın GitLab kullanıcı bayrakları olup olmadığını kontrol edin. Ayrıca kurulum yapmanızı da öneririm imzalamayı taahhüt etve İmzasız taahhütleri reddet bayrağını ayarlayın.
Daha sonra görevleri başlatmak için bir tetikleyici yapılandırmanız gerekir
Projeye gidin -> Ayarlar -> CI / CD -> İşlem hattı tetikleyicileri ve yeni bir tetikleyici belirteç oluşturun
Bu belirteç, bir grup proje için değişkenlerin genel yapılandırmasına hemen eklenebilir.
Gruba gidin -> Ayarlar -> CI / CD -> Değişkenler ve bir değişken ekleyin DEPLOY_TOKEN değerde tetikleyici belirteci ile.
Bu bölümde, yerel (Özel) ve genel (Paylaşılan) çalıştırıcıyı kullanarak dağıtımda görevleri çalıştırmaya yönelik yapılandırma açıklanmaktadır.
Spesifik Koşucu
Kendi koşucularımı kullanıyorum çünkü her şeyden önce kullanışlı, hızlı ve ucuz.
Bir koşucu için 1 CPU, 2 GB RAM, 20 GB HDD'li bir Linux VDS öneririm. İhraç fiyatı yıllık ~3000₽'dir.
Koşucum
Koşucu için VDS 4 CPU, 4 GB RAM, 50 GB SSD aldım. ~11000₽'ye mal oldu ve asla pişman olmadı.
Toplam 7 makinem var. Aruba'da 5 ve ihor'da 2.
Yani bir koşucumuz var. Şimdi onu ayarlayacağız.
Makineye SSH üzerinden gidip java, git, maven, gnupg2'yi kuruyoruz.
Maven önbelleği için bir dizin oluşturun ve grup haklarını atayın runner
Bir makinede birden fazla koşucu çalıştırmayı planlamıyorsanız bu noktayı atlayabilirsiniz.
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!
Koşucunun kayıtlı olup olmadığını kontrol ediyoruz. gitlab.com web sitesine gidin -> konuşlandırma projesi -> Ayarlar -> CI/CD -> Koşucular -> Belirli Koşucular -> Bu proje için etkinleştirilen koşucular
Ekran
ekleme ayrı hizmet /etc/systemd/system/gitlab-deployer.service
Soruları cevaplayarak bir anahtar oluşturuyoruz. Kendi adımı ve e-posta adresimi kullandım.
Anahtarın şifresini belirttiğinizden emin olun. Eserler bu anahtarla imzalanacak.
gpg --gen-key
kontrol
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
Genel anahtarımızı anahtar sunucusuna yükleme
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Bir maven dizini oluşturun Depo ve önbellekle bağlantı kurun (hata yapmayın)
Aynı makinede birden fazla koşucu çalıştırmayı planlamıyorsanız bu adım atlanabilir.
İstenilen Java sürümüyle dağıtım sırasında görevleri çalıştırmak için oldukça basit bir Docker dosyası oluşturuyoruz. Aşağıda alp için bir örnek verilmiştir.
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 dosyasını dağıtım projesinin köküne ekleyin
Komut dosyası, birbirini dışlayan iki dağıtım görevi sunar. Sırasıyla Belirli Koşucu veya Paylaşılan Koşucu.
.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>
Java içermeyen bir modülünüz varsa (örneğin yalnızca kaynaklar)
Veya prensipte javadoc oluşturmak istemiyorsanız, o zaman yardımcı olun maven-jar-plugin
Çok modüllü bir projeniz varsa ve depoya belirli bir modül yüklemeniz gerekmiyorsa bu modülün pom.xml dosyasına eklemeniz gerekir. nexus-staging-maven-plugin bayraklı skipNexusStagingDeployMojo
Anlık görüntü/yayın sürümleri yüklendikten sonra şurada mevcuttur: hazırlama depoları
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Daha fazla artı
Nexus deposuyla çalışmak için çok zengin bir hedef listesi (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Maven Central'da indirilebilirlik için otomatik sürüm kontrolü
Etiket ayarlandığında, dağıtım projesindeki ilgili görev, yayın sürümünü nexus'a yüklemek için otomatik olarak tetiklenir (örnek).
En iyi yanı, yakın serbest bırakmanın nexus'ta otomatik olarak tetiklenmesidir.
[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] ------------------------------------------------------------------------
Ve bir şeyler ters giderse görev başarısız olur
[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] ------------------------------------------------------------------------
Sonuç olarak elimizde tek bir seçenek kalıyor. Veya bu sürümü silin veya yayınlayın.
Serbest bırakıldıktan bir süre sonra eserler satışa sunulacak
oftop
Maven'in diğer halka açık depoları indekslemesi benim için bir keşifti.
Eski depomu indekslediği için robots.txt dosyasını eklemek zorunda kaldım.
Yapıları çeşitli geliştirme dilleri için genel depolara yüklemek için çeşitli CI görevlerini uygulayabileceğiniz ayrı bir dağıtım projesi.
Dağıtım projesi dış müdahalelerden yalıtılmıştır ve yalnızca Sahip ve Bakımcı rollerine sahip kullanıcılar tarafından değiştirilebilir.
Yalnızca dağıtım görevlerini çalıştırmak için "etkin" önbelleğe sahip ayrı bir Özel Çalıştırıcı.
Anlık görüntü/yayın sürümlerinin halka açık bir depoda yayınlanması.
Maven Central'da yayına hazır olup olmadığının otomatik olarak kontrol edilmesi.
Maven Central'da "ham" sürümlerin otomatik olarak yayınlanmasına karşı koruma.
"Tıklamayla" anlık görüntü sürümlerini oluşturun ve yayınlayın.
Anlık görüntü/yayın sürümlerini almak için tek depo.
Bir Java projesi oluşturmak/test etmek/yayınlamak için genel işlem hattı.
GitLab CI kurulumu ilk bakışta göründüğü kadar karmaşık bir konu değildir. CI'yi birkaç kez anahtar teslimi olarak kurmak yeterlidir ve artık bu konuda amatör olmaktan çok uzaktasınız. Üstelik GitLab dokümantasyonu oldukça gereksizdir. İlk adımı atmaktan korkmayın. Yürüyen kişinin adımları altında yol beliriyor (Kimin söylediğini hatırlamıyorum :)
Geri bildirim almaktan memnuniyet duyacağım.
Bir sonraki makalede, yalnızca bir kabuk çalıştırıcınız varsa, entegrasyon testi görevlerini rekabetçi bir şekilde (test hizmetlerini docker-compose ile çalıştırmak) çalıştırmak için GitLab CI'yı nasıl ayarlayacağınızı göstereceğim.