Nggawe GitLab CI kanggo ngunggah proyek java menyang pusat maven
Artikel iki dimaksudaké kanggo pangembang java sing kudu cepet nerbitaké produk ing sonatype lan / utawa repositori pusat maven nggunakake GitLab. Ing artikel iki aku bakal ngomong babagan nyetel gitlab-runner, gitlab-ci lan maven-plugin kanggo ngatasi masalah iki.
Prasyarat:
Panyimpenan aman tombol mvn lan GPG.
Aman eksekusi tugas CI umum.
Ngunggah artefak (rilis / snapshot) menyang repositori umum.
Priksa otomatis versi rilis kanggo publikasi ing pusat maven.
Solusi umum kanggo ngunggah artefak menyang gudang kanggo macem-macem proyek.
Katrangan rinci babagan mekanisme kanggo nerbitake artefak ing Maven Central liwat Sonatype OSS Repository Hosting Service wis diterangake ing wacana iki pangguna Googolplex, mula aku bakal ngrujuk menyang artikel iki ing panggonan sing bener.
Pra-registrasi kanggo Sonatype JIRA lan mbukak tiket kanggo mbukak repositori (waca bagean kanggo rincian liyane Nggawe tiket ing Sonatype JIRA). Sawise mbukak repositori, pasangan login / sandhi saka JIRA (sabanjuré diarani akun Sonatype) bakal digunakake kanggo ngunggah artefak menyang Sonatype nexus.
Yen sampeyan nggunakake konsol Linux kanggo ngasilake kunci GPG (gnupg/gnupg2), sampeyan kudu nginstal. rng-alat kanggo ngasilake entropi. Yen ora, generasi kunci bisa uga butuh wektu sing suwe.
Kaping pisanan, sampeyan kudu nggawe lan ngatur proyek ing ngendi pipa bakal disimpen kanggo nyebarake artefak. Aku menehi jeneng proyekku kanthi gampang lan ora rumit - nyebarke
Sawise nggawe repositori, sampeyan kudu matesi akses kanggo ngganti repositori.
Pindhah menyang project -> Setelan -> Repositori -> Cabang sing Dilindungi. Kita mbusak kabeh aturan lan nambah aturan siji karo Wildcard * karo hak push lan nggabung mung kanggo pangguna karo peran Maintainers. Aturan iki bakal bisa digunakake kanggo kabeh pangguna proyek iki lan grup sing dadi proyek iki.
Yen ana sawetara maintainers, banjur solusi sing paling apik bakal kanggo matesi akses menyang project ing asas.
Pindhah menyang proyek -> Setelan -> Umum -> Visibilitas, fitur proyek, ijin lan atur visibilitas Proyek menyang Private.
Aku duwe proyek sing bisa diakses umum, amarga aku nggunakake GitLab Runner dhewe lan mung duwe akses kanggo ngganti repositori. Ya, sejatine, ora ana kepentinganku kanggo nuduhake informasi pribadi ing log pipa umum.
Ngencengi aturan kanggo ngganti repositori
Pindhah menyang proyek -> Setelan -> Repositori -> Aturan Push lan atur watesan Committer, Priksa manawa penulis minangka panji pangguna GitLab. Aku uga nyaranake nyetel menehi tandha tangan, lan setel gendera Tolak sing ora ditandatangani.
Sabanjure sampeyan kudu ngatur pemicu kanggo miwiti tugas
Pindhah menyang proyek -> Setelan -> CI / CD -> Pemicu Pipeline lan gawe token pemicu anyar
Token iki bisa langsung ditambahake menyang konfigurasi umum variabel kanggo klompok proyek.
Pindhah menyang grup -> Setelan -> CI / CD -> Variabel lan tambahake variabel DEPLOY_TOKEN kanthi nilai pemicu-token.
Bagean iki njlèntrèhaké konfigurasi kanggo mbukak tugas ing penyebaran nggunakake dhewe (Spesifik) lan umum (Dibagi) runner.
Runner Spesifik
Aku nggunakake pelari dhewe amarga, pisanan, trep, cepet, lan murah.
Kanggo runner, Aku menehi saran Linux VDS karo 1 CPU, 2 GB RAM, 20 GB HDD. Rega penerbitan yaiku ~3000₽ saben taun.
pelariku
Kanggo runner aku njupuk VDS 4 CPU, 4 GB RAM, 50 GB SSD. Regane ~11000₽ lan ora tau nyesel.
Aku duwe total 7 mesin. 5 ing aruba lan 2 ing ihor.
Dadi kita duwe pelari. Saiki kita bakal ngatur.
Kita menyang mesin liwat SSH lan nginstal java, git, maven, gnupg2.
Gawe direktori kanggo cache maven lan wenehake ijin grup runner
Sampeyan bisa ngliwati titik iki yen sampeyan ora rencana kanggo mbukak sawetara balapan mlayu ing siji mesin.
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!
We mriksa sing runner wis kedhaftar. Bukak situs web gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Runners Spesifik -> Runners diaktifake kanggo proyek iki
Layar
Tambah pisah layanan /etc/systemd/system/gitlab-deployer.service
Kita nggawe kunci kanthi mangsuli pitakon. Aku nggunakake jeneng lan email dhewe.
Priksa manawa sampeyan nemtokake sandhi kanggo kunci kasebut. Artefak bakal ditandatangani nganggo kunci iki.
gpg --gen-key
Mriksa
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
Ngunggah kunci umum kita menyang server kunci
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Nggawe direktori maven repository lan pranala menyang cache (ora salah)
Sampeyan bisa ngliwati titik iki yen sampeyan ora rencana kanggo mbukak sawetara balapan mlayu ing siji mesin.
Kita nggawe Dockerfile sing cukup prasaja kanggo mbukak tugas penyebaran kanthi versi Java sing dibutuhake. Ing ngisor iki minangka conto kanggo alpine.
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/
Tambah file .gitlab-ci.yml kanggo ROOT saka project nyebarke
Skrip kasebut nyedhiyakake rong tugas panyebaran sing eksklusif. Runner Spesifik utawa Runner Shared.
.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
Topik iki diterangake kanthi rinci. Googolplex в Nyetel maven kanthi otomatis mlebu lan ngunggah artefak menyang repositori snapshot lan pementasan, mula aku bakal nerangake sawetara nuansa nggunakake plugin. Aku uga bakal njlèntrèhaké carane gampang lan anteng sampeyan bisa nggunakake nexus-staging-maven-pluginyen sampeyan ora pengin utawa ora bisa nggunakake org.sonatype.oss:oss-parent minangka wong tuwa kanggo proyek sampeyan.
maven-instal-plugin
Nginstal modul menyang repositori lokal.
Banget migunani kanggo verifikasi lokal solusi ing proyek liyane, uga checksum.
<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>
<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>
Yen sampeyan duwe modul sing ora ngemot java (umpamane mung sumber daya)
Utawa sampeyan ora pengin generate javadoc ing asas, banjur bantuan maven-jar-plugin
Yen sampeyan duwe proyek multi-modul lan sampeyan ora perlu ngunggah modul tartamtu menyang repositori, sampeyan kudu nambah nexus-staging-maven-plugin karo gendera skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
plus liyane
Dhaptar tujuan sing sugih banget kanggo nggarap repositori nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Priksa release otomatis kanggo ngunggah menyang pusat maven
Nalika tag diinstal, tugas sing cocog ing proyek nyebarake kanthi otomatis micu kanggo ndownload versi rilis menyang nexus (conto).
Sisih paling apik yaiku rilis cedhak kanthi otomatis dipicu ing 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] ------------------------------------------------------------------------
Lan yen ana sing salah, tugas kasebut mesthi bakal gagal
[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] ------------------------------------------------------------------------
Akibaté, kita mung duwe siji pilihan. Mbusak versi iki utawa nerbitake.
Sawise diluncurake, sawise sawetara wektu artefak bakal mlebu
offtopic
Iki minangka panemuan kanggo aku manawa maven ngindeks repositori umum liyane.
Aku kudu nambah robots.txt amarga ngindeks repositori lawasku.
Proyèk penyebaran kapisah ing ngendi sampeyan bisa ngleksanakake sawetara tugas CI kanggo ngunggah artefak menyang repositori umum kanggo macem-macem basa pangembangan.
Proyek Deploy diisolasi saka gangguan njaba lan mung bisa diganti dening pangguna sing nduweni peran Pemilik lan Penyelenggara.
Runner Spesifik sing kapisah kanthi cache "panas" kanggo mbukak mung tugas.
Nerbitake versi snapshot/rilis ing repositori umum.
Priksa otomatis versi release kanggo siyap kanggo publikasi ing tengah maven.
Perlindhungan marang publikasi otomatis versi "mentah" ing pusat maven.
Gawe lan nerbitake versi snapshot "on klik".
Repositori siji kanggo entuk versi snapshot / rilis.
Pipa umum kanggo mbangun / nguji / nerbitake proyek java.
Nyiyapake GitLab CI ora kaya topik sing rumit kaya sing katon sepisanan. Cukup kanggo nyiyapake CI ing basis turnkey kaping pindho, lan saiki sampeyan adoh saka amatir ing perkara iki. Kajaba iku, dokumentasi GitLab akeh banget. Aja wedi njupuk langkah pisanan. Dalan katon ing ngisor undhak-undhakan wong sing mlaku (aku ora kelingan sing ngomong :)
Aku bakal seneng nampa umpan balik.
Ing artikel sabanjure aku bakal ngomong babagan carane ngatur GitLab CI kanggo mbukak tugas kanthi tes integrasi kanthi kompetitif (nglakokake layanan sing diuji nggunakake docker-compose) yen sampeyan mung duwe siji pelari cangkang.