ProHoster > Blog > διαχείριση > Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central
Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central
Αυτό το άρθρο προορίζεται για προγραμματιστές java που έχουν την ανάγκη να δημοσιεύσουν γρήγορα τα προϊόντα τους σε κεντρικά αποθετήρια sonatype ή/και maven χρησιμοποιώντας το GitLab. Σε αυτό το άρθρο θα μιλήσω για τη ρύθμιση του gitlab-runner, του gitlab-ci και του maven-plugin για την επίλυση αυτού του προβλήματος.
Προαπαιτούμενα:
Ασφαλής αποθήκευση κλειδιών mvn και GPG.
Ασφαλής εκτέλεση εργασιών δημόσιας CI.
Μεταφόρτωση αντικειμένων (έκδοση/στιγμιότυπο) σε δημόσια αποθετήρια.
Αυτόματος έλεγχος των εκδόσεων έκδοσης για δημοσίευση στο maven central.
Μια γενική λύση για τη μεταφόρτωση τεχνουργημάτων σε ένα αποθετήριο για πολλαπλά έργα.
Μια λεπτομερής περιγραφή του μηχανισμού για τη δημοσίευση αντικειμένων στο Maven Central μέσω της υπηρεσίας φιλοξενίας αποθετηρίου Sonatype OSS έχει ήδη περιγραφεί στο αυτό το άρθρο χρήστης Googolplex, οπότε θα αναφερθώ σε αυτό το άρθρο στα σωστά σημεία.
Προεγγραφή για Sonatype JIRA και ανοίξτε ένα εισιτήριο για να ανοίξετε το αποθετήριο (διαβάστε την ενότητα για περισσότερες λεπτομέρειες Δημιουργήστε ένα εισιτήριο στο Sonatype JIRA). Μετά το άνοιγμα του αποθετηρίου, το ζεύγος σύνδεσης/κωδικού πρόσβασης από το JIRA (στο εξής θα αναφέρεται ως λογαριασμός Sonatype) θα χρησιμοποιηθεί για τη μεταφόρτωση τεχνουργημάτων στο Sonatype nexus.
Εάν χρησιμοποιείτε την κονσόλα Linux για να δημιουργήσετε ένα κλειδί GPG (gnupg/gnupg2), τότε πρέπει να εγκαταστήσετε rng-εργαλεία για τη δημιουργία εντροπίας. Διαφορετικά, η δημιουργία κλειδιών μπορεί να διαρκέσει πολύ.
Πρώτα απ 'όλα, πρέπει να δημιουργήσετε και να διαμορφώσετε ένα έργο στο οποίο ο αγωγός θα αποθηκευτεί για την ανάπτυξη τεχνουργημάτων. Ονόμασα το έργο μου απλά και χωρίς περίπλοκα - παρατάσσω
Μετά τη δημιουργία του αποθετηρίου, πρέπει να περιορίσετε την πρόσβαση για να αλλάξετε το αποθετήριο.
Μεταβείτε στο έργο -> Ρυθμίσεις -> Αποθετήριο -> Προστατευμένα Υποκαταστήματα. Διαγράφουμε όλους τους κανόνες και προσθέτουμε έναν κανόνα με το χαρακτήρα μπαλαντέρ * με το δικαίωμα προώθησης και συγχώνευσης μόνο για χρήστες με ρόλο Συντηρητές. Αυτός ο κανόνας θα λειτουργεί για όλους τους χρήστες τόσο αυτού του έργου όσο και της ομάδας στην οποία ανήκει αυτό το έργο.
Εάν υπάρχουν πολλοί συντηρητές, τότε η καλύτερη λύση θα ήταν να περιοριστεί κατ' αρχήν η πρόσβαση στο έργο.
Μεταβείτε στο έργο -> Ρυθμίσεις -> Γενικά -> Ορατότητα, δυνατότητες έργου, δικαιώματα και ορίστε την ορατότητα έργου σε Private.
Έχω ένα έργο προσβάσιμο στο κοινό, αφού χρησιμοποιώ το δικό μου GitLab Runner και μόνο εγώ έχω πρόσβαση για να αλλάξω το αποθετήριο. Λοιπόν, στην πραγματικότητα, δεν είναι προς το συμφέρον μου να εμφανίζω ιδιωτικές πληροφορίες σε δημόσια αρχεία καταγραφής αγωγών.
Αυστηροποίηση των κανόνων για την αλλαγή του αποθετηρίου
Μεταβείτε στο έργο -> Ρυθμίσεις -> Αποθετήριο -> Κανόνες Push και ορίστε τον περιορισμό Committer, Ελέγξτε εάν ο συγγραφέας είναι σημαίες χρήστη του GitLab. Προτείνω επίσης τη ρύθμιση δέσμευση υπογραφήςκαι ορίστε τη σημαία Απόρριψη ανυπόγραφων δεσμεύσεων.
Στη συνέχεια, πρέπει να διαμορφώσετε ένα έναυσμα για την εκκίνηση εργασιών
Μεταβείτε στο έργο -> Ρυθμίσεις -> CI / CD -> Ενεργοποιήσεις αγωγών και δημιουργήστε ένα νέο διακριτικό ενεργοποίησης
Αυτό το διακριτικό μπορεί να προστεθεί αμέσως στη γενική διαμόρφωση των μεταβλητών για μια ομάδα έργων.
Μεταβείτε στην ομάδα -> Ρυθμίσεις -> CI / CD -> Μεταβλητές και προσθέστε μια μεταβλητή DEPLOY_TOKEN με το trigger-token σε αξία.
Αυτή η ενότητα περιγράφει τη διαμόρφωση για την εκτέλεση εργασιών κατά την ανάπτυξη χρησιμοποιώντας τον δικό σας (Συγκεκριμένο) και δημόσιο (Κοινόχρηστο) δρομέα.
Συγκεκριμένος δρομέας
Χρησιμοποιώ τους δικούς μου δρομείς γιατί, πρώτα απ 'όλα, είναι βολικό, γρήγορο και φθηνό.
Για runner, προτείνω ένα Linux VDS με 1 CPU, 2 GB RAM, 20 GB HDD. Η τιμή έκδοσης είναι ~3000₽ ανά έτος.
Ο δρομέας μου
Για το runner πήρα VDS 4 CPU, 4 GB RAM, 50 GB SSD. Κόστος ~11000₽ και δεν το μετάνιωσα ποτέ.
Έχω συνολικά 7 μηχανήματα. 5 στην αρούμπα και 2 στο ihor.
Έχουμε λοιπόν έναν δρομέα. Τώρα θα το ρυθμίσουμε.
Πηγαίνουμε στο μηχάνημα μέσω SSH και εγκαθιστούμε java, git, maven, gnupg2.
Δημιουργήστε έναν κατάλογο για την κρυφή μνήμη maven και εκχωρήστε δικαιώματα ομάδας runner
Μπορείτε να παραλείψετε αυτό το σημείο εάν δεν σκοπεύετε να εκτελέσετε πολλούς δρομείς σε ένα μηχάνημα.
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!
Ελέγχουμε ότι ο δρομέας είναι εγγεγραμμένος. Μεταβείτε στον ιστότοπο gitlab.com -> deploy-project -> Ρυθμίσεις -> CI/CD -> Runners -> Specific Runners -> Runners που ενεργοποιήθηκαν για αυτό το έργο
Δημιουργούμε ένα κλειδί απαντώντας σε ερωτήσεις. Χρησιμοποίησα το δικό μου όνομα και email.
Βεβαιωθείτε ότι έχετε καθορίσει τον κωδικό πρόσβασης για το κλειδί. Τα τεχνουργήματα θα υπογράφονται με αυτό το κλειδί.
gpg --gen-key
Ελέγξτε
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
Μεταφόρτωση του δημόσιου κλειδιού μας στον διακομιστή κλειδιών
gpg --keyserver keys.gnupg.net --send-key 00000000
gpg: sending key 00000000 to hkp server keys.gnupg.net
Δημιουργήστε έναν κατάλογο maven Αποθήκη και σύνδεση με την προσωρινή μνήμη (μην κάνετε λάθος)
Μπορείτε να παραλείψετε αυτό το σημείο εάν δεν σκοπεύετε να εκτελέσετε πολλούς δρομείς σε ένα μηχάνημα.
Πρώτα απ 'όλα, πρέπει να δημιουργήσετε ένα κλειδί GPG. Για να το κάνετε αυτό, εγκαταστήστε το gnupg.
yum install -y gnupg
Δημιουργούμε ένα κλειδί απαντώντας σε ερωτήσεις. Χρησιμοποίησα το δικό μου όνομα και email. Βεβαιωθείτε ότι έχετε καθορίσει τον κωδικό πρόσβασης για το κλειδί.
Δημιουργούμε ένα αρκετά απλό Dockerfile για την εκτέλεση εργασιών ανάπτυξης με την απαιτούμενη έκδοση της Java. Παρακάτω είναι ένα παράδειγμα για τα αλπικά.
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 στη ρίζα του έργου ανάπτυξης
Το σενάριο παρουσιάζει δύο αμοιβαία αποκλειστικές εργασίες ανάπτυξης. Specific Runner ή Shared 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
Σε έργα java που υποτίθεται ότι θα μεταφορτωθούν σε δημόσια αποθετήρια, πρέπει να προσθέσετε 2 βήματα για τη λήψη των εκδόσεων Έκδοσης και Στιγμιότυπου.
.gitlab-ci.yml
stages:
- build
- test
- verify
- deploy
<...>
Release:
extends: .trigger_deploy
# Запускать задачу только пo тегу.
only:
- tags
Snapshot:
extends: .trigger_deploy
# Запускаем задачу на публикацию SNAPSHOT версии вручную
when: manual
# Не запускать задачу, если проставлен тег.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# Отключаем клонирование текущего проекта
GIT_STRATEGY: none
# Ссылка на триггер deploy-задачи
URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
# Переменные deploy-задачи
POST_DATA: "
token=${DEPLOY_TOKEN}&
ref=master&
variables[DEPLOY]=${DEPLOY}&
variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
"
script:
# Не использую cURL, так как с флагами --fail --show-error
# он не выводит тело ответа, если HTTP код 400 и более
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}
Σε αυτή τη λύση, προχώρησα λίγο πιο πέρα και αποφάσισα να χρησιμοποιήσω ένα πρότυπο CI για έργα java.
Λεπτομερώς
Δημιούργησα ένα ξεχωριστό έργο gitlab-ci στο οποίο τοποθέτησα ένα πρότυπο CI για έργα java κοινά.yml.
<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 (για παράδειγμα μόνο πόρους)
Ή δεν θέλετε να δημιουργήσετε javadoc κατ 'αρχήν, τότε βοηθήστε maven-jar-plugin
Εάν έχετε ένα έργο πολλών ενοτήτων και δεν χρειάζεται να ανεβάσετε μια συγκεκριμένη ενότητα στο αποθετήριο, τότε πρέπει να προσθέσετε nexus-staging-maven-plugin με σημαία skipNexusStagingDeployMojo
<repositories>
<repository>
<id>SonatypeNexus</id>
<url>https://oss.sonatype.org/content/groups/staging/</url>
<!-- Не надо указывать флаги snapshot/release для репозитория -->
</repository>
</repositories>
Περισσότερα συν
Μια πολύ πλούσια λίστα στόχων για εργασία με το αποθετήριο nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
Αυτόματος έλεγχος απελευθέρωσης για μεταφόρτωση στο maven central
Όταν εγκατασταθεί μια ετικέτα, η αντίστοιχη εργασία στο έργο ανάπτυξης ενεργοποιείται αυτόματα για λήψη της έκδοσης έκδοσης στο nexus (παράδειγμα).
Το καλύτερο μέρος είναι ότι το κλείσιμο της απελευθέρωσης ενεργοποιείται αυτόματα στο 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] ------------------------------------------------------------------------
Και αν κάτι πάει στραβά, το έργο σίγουρα θα αποτύχει
[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] ------------------------------------------------------------------------
Ως αποτέλεσμα, μας μένει μόνο μία επιλογή. Είτε διαγράψτε αυτήν την έκδοση είτε δημοσιεύστε την.
Μετά την απελευθέρωση, μετά από κάποιο χρονικό διάστημα τα αντικείμενα θα είναι μέσα
εκτός θέματος
Ήταν μια ανακάλυψη για μένα ότι το maven ευρετηριάζει άλλα δημόσια αποθετήρια.
Έπρεπε να προσθέσω το robots.txt επειδή ευρετηρίασε το παλιό μου αποθετήριο.
Ένα ξεχωριστό έργο ανάπτυξης στο οποίο μπορείτε να εφαρμόσετε πολλές εργασίες CI για τη μεταφόρτωση τεχνουργημάτων σε δημόσιους χώρους αποθήκευσης για διάφορες γλώσσες ανάπτυξης.
Το έργο Deploy είναι απομονωμένο από εξωτερικές παρεμβολές και μπορεί να αλλάξει μόνο από χρήστες με τους ρόλους Κάτοχος και Συντηρητής.
Ένα ξεχωριστό Specific Runner με μια «καυτή» κρυφή μνήμη για την εκτέλεση μόνο εργασιών ανάπτυξης.
Δημοσίευση στιγμιότυπου/εκδόσεων εκδόσεων σε δημόσιο αποθετήριο.
Αυτόματος έλεγχος της έκδοσης κυκλοφορίας για ετοιμότητα για δημοσίευση στο maven central.
Προστασία από την αυτόματη δημοσίευση «ακατέργαστων» εκδόσεων στο maven central.
Δημιουργήστε και δημοσιεύστε εκδόσεις στιγμιότυπων "με κλικ".
Ένα ενιαίο αποθετήριο για τη λήψη εκδόσεων στιγμιότυπου/έκδοσης.
Γενικός αγωγός για την κατασκευή/δοκιμή/δημοσίευση ενός έργου java.
Η ρύθμιση του GitLab CI δεν είναι τόσο περίπλοκο θέμα όσο φαίνεται με την πρώτη ματιά. Αρκεί να ρυθμίσετε το CI με το κλειδί στο χέρι μερικές φορές και τώρα δεν είστε ερασιτέχνης σε αυτό το θέμα. Επιπλέον, η τεκμηρίωση του GitLab είναι πολύ περιττή. Μην φοβάστε να κάνετε το πρώτο βήμα. Ο δρόμος εμφανίζεται κάτω από τα βήματα του ατόμου που περπατάει (δεν θυμάμαι ποιος το είπε :)
Θα χαρώ να λάβω σχόλια.
Στο επόμενο άρθρο θα μιλήσω για το πώς να ρυθμίσετε το GitLab CI για να εκτελείτε εργασίες με δοκιμές ενοποίησης ανταγωνιστικά (εκτελώντας τις υπό δοκιμή υπηρεσίες χρησιμοποιώντας το docker-compose) εάν έχετε μόνο ένα πρόγραμμα εκτέλεσης φλοιού.