ProHoster > Blog > Pentadbiran > Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven
Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven
Artikel ini ditujukan untuk pembangun java yang perlu menerbitkan produk mereka dengan cepat ke sonataip dan/atau membuat repositori pusat menggunakan GitLab. Dalam artikel ini, saya akan bercakap tentang menyediakan gitlab-runner, gitlab-ci dan maven-plugin untuk menyelesaikan masalah ini.
Prasyarat:
Penyimpanan selamat bagi kunci mvn dan GPG.
Pelaksanaan tugas CI awam yang selamat.
Memuat naik artifak (keluaran/gambar) ke repositori awam.
Semakan automatik versi keluaran untuk penerbitan di pusat maven.
Penyelesaian umum untuk memuat naik artifak ke repositori untuk berbilang projek.
Penerangan terperinci tentang mekanisme untuk menerbitkan artifak kepada Maven Central melalui Perkhidmatan Pengehosan Repositori Sonatype OSS telah diterangkan dalam artikel ini pengguna Googolplex, jadi saya akan merujuk artikel ini di tempat yang betul.
Pradaftar di Sonatype JIRA dan mulakan tiket untuk membuka repositori (untuk butiran lanjut, baca bahagian Buat tiket Sonatype JIRA). Selepas membuka repositori, pasangan log masuk/kata laluan JIRA (selepas ini dirujuk sebagai akaun Sonatype) akan digunakan untuk memuat naik artifak ke perhubungan Sonatype.
Jika anda menggunakan konsol Linux untuk menjana kunci GPG (gnupg/gnupg2), maka anda perlu memasang rng-tools untuk menghasilkan entropi. Jika tidak, penjanaan utama boleh mengambil masa yang sangat lama.
Pertama sekali, anda perlu mencipta dan mengkonfigurasi projek di mana saluran paip akan disimpan untuk penggunaan artifak. Saya memanggil projek saya secara ringkas dan tidak rumit - menggunakan
Selepas mencipta repositori, anda perlu menyekat akses untuk menukar repositori.
Pergi ke projek -> Tetapan -> Repositori -> Cawangan Dilindungi. Kami memadamkan semua peraturan dan menambah satu peraturan dengan Wildcard * dengan hak untuk menolak dan bergabung hanya untuk pengguna dengan peranan Maintainers. Peraturan ini akan berfungsi untuk semua pengguna projek ini dan kumpulan yang menjadi milik projek ini.
Jika terdapat beberapa penyelenggara, maka penyelesaian terbaik adalah untuk menyekat akses kepada projek pada dasarnya.
Pergi ke projek -> Tetapan -> Umum -> Keterlihatan, ciri projek, kebenaran dan tetapkan keterlihatan Projek kepada Swasta.
Saya mempunyai projek dalam akses awam, kerana saya menggunakan GitLab Runner saya sendiri dan hanya saya mempunyai akses untuk mengubah suai repositori. Sebenarnya, saya tidak berminat untuk menunjukkan maklumat peribadi dalam log saluran paip awam.
Mengetatkan peraturan untuk menukar repositori
Pergi ke projek -> Tetapan -> Repositori -> Peraturan Tolak dan tetapkan bendera Sekatan pemacu, Semak sama ada pengarang ialah pengguna GitLab. Saya juga mengesyorkan tetapan menandatangani komitmen, dan tetapkan bendera Tolak komit yang tidak ditandatangani.
Seterusnya, anda perlu mengkonfigurasi pencetus untuk menjalankan tugas
Pergi ke projek -> Tetapan -> CI / CD -> Pencetus saluran paip dan buat token pencetus baharu
Token ini boleh ditambah serta-merta pada konfigurasi umum pembolehubah untuk sekumpulan projek.
Pergi ke kumpulan -> Tetapan -> CI / CD -> Pembolehubah dan tambah pembolehubah DEPLOY_TOKEN dengan token pencetus dalam nilai.
Bahagian ini menerangkan konfigurasi untuk menjalankan tugasan menggunakan pelari asli (Khusus) dan awam (Dikongsi).
Pelari Khusus
Saya menggunakan pelari saya sendiri, kerana pertama sekali ia mudah, cepat, murah.
Untuk pelari saya cadangkan Linux VDS dengan 1 CPU, 2 GB RAM, 20 GB HDD. Harga terbitan ~ 3000₽ setahun.
pelari saya
Untuk pelari saya mengambil VDS 4 CPU, 4 GB RAM, 50 GB SSD. Ia berharga ~11000₽ dan tidak pernah menyesalinya.
Saya mempunyai 7 mesin. 5 pada aruba dan 2 pada ihor.
Jadi, kita ada pelari. Sekarang kita akan menetapkannya.
Kami pergi ke mesin melalui SSH dan memasang java, git, maven, gnupg2.
Buat direktori untuk cache maven dan tetapkan hak kumpulan runner
Anda boleh melangkau langkah ini jika anda tidak bercadang untuk menjalankan berbilang pelari pada mesin yang sama.
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!
Semak bahawa pelari telah didaftarkan. Pergi ke gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners diaktifkan untuk projek ini
Skrin
Tambah terpisah perkhidmatan /etc/systemd/system/gitlab-deployer.service
Kami menjana kunci dengan menjawab soalan. Saya menggunakan nama dan e-mel saya sendiri.
Pastikan anda menentukan kata laluan untuk kunci. Artifak akan ditandatangani dengan kunci ini.
gpg --gen-key
Memeriksa
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
Memuat naik kunci awam kami ke pelayan kunci
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Buat direktori maven repositori dan pautkan dengan cache (jangan silap)
Langkah ini boleh dilangkau jika anda tidak merancang untuk menjalankan beberapa pelari pada mesin yang sama.
Kami mencipta fail Docker yang agak mudah untuk menjalankan tugas pada penggunaan dengan versi Java yang dikehendaki. Di bawah adalah contoh untuk 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/
Tambahkan fail .gitlab-ci.yml pada akar projek letak
Skrip membentangkan dua tugas penggunaan yang saling eksklusif. Pelari Khusus atau Pelari Dikongsi masing-masing.
.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>
Jika anda mempunyai modul yang tidak mengandungi java (contohnya hanya sumber)
Atau anda tidak mahu menjana javadoc pada dasarnya, kemudian untuk membantu maven-jar-plugin
Jika anda mempunyai projek berbilang modul dan anda tidak perlu memuat naik modul tertentu ke repositori, maka anda perlu menambah pada pom.xml modul ini nexus-staging-maven-plugin dengan bendera skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Lebih banyak kelebihan
Senarai sasaran yang sangat kaya untuk bekerja dengan repositori nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Semakan keluaran automatik untuk keboleh muat turun di pusat maven
Apabila teg ditetapkan, tugasan yang sepadan dalam projek penggunaan dicetuskan secara automatik untuk memuat naik versi keluaran ke nexus (contoh).
Bahagian yang terbaik ialah pelepasan rapat secara automatik mencetuskan dalam perhubungan.
[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] ------------------------------------------------------------------------
Dan jika ada masalah, maka tugas itu akan 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] ------------------------------------------------------------------------
Akibatnya, kita hanya tinggal satu pilihan. Atau padam versi ini atau terbitkan.
Selepas dikeluarkan, selepas beberapa lama, artifak akan masuk
luar topik
Ia adalah satu pendedahan kepada saya bahawa maven mengindeks repositori awam yang lain.
Saya terpaksa memuat naik robots.txt kerana ia mengindeks repositori lama saya.
Projek penggunaan berasingan di mana anda boleh melaksanakan beberapa tugas CI untuk memuat naik artifak ke repositori awam untuk pelbagai bahasa pembangunan.
Projek pelaksanaan diasingkan daripada gangguan luar dan hanya boleh diubah suai oleh pengguna dengan peranan Pemilik dan Penyelenggara.
Pelari Spesifik yang berasingan dengan cache "panas" untuk menjalankan hanya mengatur tugas.
Penerbitan versi syot kilat/keluaran dalam repositori awam.
Semakan automatik versi keluaran untuk kesediaan untuk penerbitan di pusat maven.
Perlindungan terhadap penerbitan automatik versi "mentah" di pusat maven.
Bina dan terbitkan versi syot kilat "pada klik".
Repositori tunggal untuk mendapatkan versi syot kilat/keluaran.
Saluran paip umum untuk membina / menguji / menerbitkan projek java.
Menyediakan GitLab CI bukanlah topik yang rumit seperti yang kelihatan pada pandangan pertama. Ia cukup untuk menyediakan CI secara turnkey beberapa kali, dan kini anda jauh daripada seorang amatur dalam perkara ini. Selain itu, dokumentasi GitLab sangat berlebihan. Jangan takut untuk mengambil langkah pertama. Jalan kelihatan di bawah tangga orang yang berjalan (saya tidak ingat siapa yang mengatakannya :)
Saya akan gembira untuk maklum balas.
Dalam artikel seterusnya, saya akan menunjukkan kepada anda cara menyediakan GitLab CI untuk menjalankan tugas ujian integrasi secara kompetitif (menjalankan perkhidmatan ujian dengan docker-compose) jika anda hanya mempunyai satu shell runner.