Ta publikacija je namenjena java razvijalcem, ki potrebujejo hitro objavo svojih izdelkov v repozitorijih sonatype in/ali maven central z uporabo GitLab-a. V tem članku bom opisal nastavitev gitlab-runnerja, gitlab-ci in maven-plugin-a za reševanje te naloge.
Predpogoji:
- Varno shranjevanje mvn in GPG ključev.
- Varna izvedba javnih CI nalog.
- Nalaganje artefaktov (release/snapshot) v javne repozitorije.
- Avtomatska preverba release različic za objavo v maven central.
- Skupna rešitev za nalaganje artefaktov v repozitorij za več projektov.
- Enostavnost in uporabnost.
Vsebina
Opšte informacije
- Podrobno opisani mehanizem objave artefaktov v Maven Central preko Sonatype OSS Repository Hosting Service je že opisan v uporabnika , zato bom na ustreznih mestih skliceval na ta članek.
- Prej se registriramo na in odpiramo tiket za odprtje repozitorija (več o tem v razdelku ). Po odprtju repozitorija bo par uporabniškega imena/gesla iz JIRA (pozneje Sonatype račun) uporabljen za nalaganje artefaktov v Sonatype nexus.
- Nato je postopek generiranja GPG ključev opisan precej suho. Več podrobnosti si oglejte v razdelku
- Če uporabljate Linux konzolo za generiranje GPG ključa (gnupg/gnupg2), morate namestiti za generiranje entropije. V nasprotnem primeru lahko generiranje ključa traja zelo dolgo.
- Storitev za shranjevanje javnih GPG ključev
Nastavitev deploy projekta v GitLab-u
- Najprej morate ustvariti in nastaviti projekt, v katerega bo shranjen pipeline za nalaganje artefaktov. Moj projekt sem poimenoval preprosto in nezapleteno —
- Po ustvarjanju repozitorija je treba omejiti dostop do spreminjanja repozitorija.
Prejdimo na projekt -> Nastavitve -> Repozitorij -> Varovane veje. Izbrišimo vse pravila in dodamo edino pravilo z Wildcard * z pravicami za push in merge samo za uporabnike z vlogo vzdrževalcev. To pravilo bo delovalo za vse uporabnike tega projekta ter za skupino, v katero ta projekt spada.
- Če je več vzdrževalcev, je najboljša rešitev omejiti dostop do projekta na splošno.
Prejdimo na projekt -> Nastavitve -> Splošno -> Vidnost, funkcije projekta, dovoljenja in nastavimo vidnost projekta na Private.
Imam projekt v javnem dostopu, ker uporabljam svoj GitLab Runner in dostop do sprememb v repozitoriju imam samo jaz. Zame ni v interesu razkrivati zasebnih informacij v javnih pipelin-logih. - Zaostritev pravil za spreminjanje repozitorija
Prejdimo na projekt -> Nastavitve -> Repozitorij -> Pravila za push in nastavimo zastavice omejitve za zaveznik, Preveri, ali je avtor uporabnik GitLaba. Prav tako priporočam nastavitev , in nastavimo zastavico za zavrnitev nepodpisanih obveznic. - Nato je potrebno nastaviti sprožilec za zagon nalog
Prejdimo na projekt -> Nastavitve -> CI / CD -> Sprožilci pipeline in ustvarimo nov trigger-token
Ta token lahko takoj dodamo v skupno konfiguracijo spremenljivk za skupino projektov.
Prejdimo na skupino -> Nastavitve -> CI / CD -> Spremenljivke in dodamo spremenljivkoDEPLOY_TOKENs trigger-tokenom v vrednosti.
GitLab Runner
V tem razdelku je opisana konfiguracija za zagon nalog za deploy z uporabo lastnega (Specific) in javnega (Shared) runnerja.
Specifični Runner
Uporabljam lastne runnerje, ker je to v prvi vrsti priročno, hitro, poceni.
Za runner priporočam Linux VDS s 1 CPU, 2 GB RAM, 20 GB HDD. Cena vprašanja je ~3000₽ na leto.
Moj runner
Za runner sem vzel VDS 4 CPU, 4 GB RAM, 50 GB SSD. Stal je ~11000₽ in nikoli nisem obžaloval.
Imam skupno 7 naprav. 5 na arubi in 2 na ihorju.
Torej, imamo runner. Zdaj ga bomo nastavili.
Prijavimo se na napravo prek SSH in namestimo java, git, maven, gnupg2.
Namestimo gitlab runner
- Ustvarimo novo skupino
runnersudo groupadd runner - Ustvarimo imenik za maven predpomnilnik in dodelimo pravice skupini
runner
Ta korak lahko preskočite, če ne nameravate zagnati več runnerjev na eni napravi.mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache - Ustvarimo uporabnika
gitlab-deployerin dodamo v skupinorunneruseradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer - Dodamo v datoteko
/etc/ssh/sshd_confignato vrsticoAllowUsers root@* gitlab-deployer@127.0.0.1 - Ponovno pokrećemo
sshdsystemctl restart sshd - Postavljamo lozinku za korisnika
gitlab-deployer(može biti jednostavna, jer važi ograničenje za localhost)passwd gitlab-deployer - Instaliramo GitLab Runner (Linux x86-64)
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 sudo chmod +x /usr/local/bin/gitlab-runner ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner - Idemo na sajt gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners i kopiramo registration token
Screenshot
- Registrujemo runner
gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml
Postopek
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!- Proveravamo da li je runner registrovan. Idemo na sajt gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners activated for this project
Screenshot
- Dodajemo posebno servis
/etc/systemd/system/gitlab-deployer.service[Unit] Description=GitLab Deploy Runner After=syslog.target network.target ConditionFileIsExecutable=/usr/local/bin/gitlab-runner [Service] StartLimitInterval=5 StartLimitBurst=10 ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer" Restart=always RestartSec=120 [Install] WantedBy=multi-user.target - Pokrećemo servis.
systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service - Proveravamo da li je runner pokrenut.
Primer
Generiranje GPG ključev
- Sa iste mašine ulazimo putem ssh kao korisnik
gitlab-deployer(to je važno za generisanje GPG ključa)ssh gitlab-deployer@127.0.0.1 - Generišemo ključ odgovarajući na pitanja. Koristio sam svoje ime i e-mail.
Obavezno navodimo lozinku za ključ. Ovim ključem će se potpisivati artefakti.gpg --gen-key - Proveravamo.
gpg --list-keys -a /home/gitlab-deployer/.gnupg/pubring.gpg ---------------------------------------- pub 4096R/00000000 2019-04-19 uid Petruha Petrov sub 4096R/11111111 2019-04-19 - Učitavamo naš javni ključ na server ključeva
gpg --keyserver keys.gnupg.net --send-key 00000000 gpg: sending key 00000000 to hkp server keys.gnupg.net
Nastavitev Maven
- Ulažemo kao korisnik
gitlab-deployersu gitlab-deployer - Kreiramo direktorijum maven repository i povezujemo s kešom (ne grešite)
Ovu tačku možete preskočiti ako ne planirate pokretati više runnera na jednoj mašini.mkdir -p ~/ .m2 / repository ln -s /usr / cache / .m2 / repository / home / gitlab-deployer / .m2 / repository - Ustvarjamo glavni ključ
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Ustvarjamo datoteko ~/ .m2 / settings-security.xml
{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Šifriramo geslo za račun Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - Ustvarjamo datoteko ~/ .m2 / settings.xml
env true GPG_SECRET_KEY_PASSPHRASE sonatype SONATYPE_USERNAME {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
kjer je,
GPG_SECRET_KEY_PASSPHRASE — geslo za GPG ključ
SONATYPE_USERNAME — prijavno ime računa sonatype
S tem je nastavitev izvajalca končana, lahko preidete na oddelek
Shared Runner
Generiranje GPG ključev
- Najprej je treba ustvariti GPG ključ. Za to namestimo gnupg.
yum install -y gnupg - Generiramo ključ, ko odgovarjamo na vprašanja. Uporabil sem svoje ime in e-pošto. Obvezno navedite geslo za ključ.
gpg --gen-key - Prikazujemo informacije o ključu
gpg --list-keys -a pub rsa3072 2019-04-24 [SC] [expires: 2021-04-23] 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 uid [ultimate] tttemp sub rsa3072 2019-04-24 [E] [expires: none] - Učitavamo naš javni ključ na server ključeva
gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net - Prejmite zasebni ključ
gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 -----BEGIN PGP PRIVATE KEY BLOCK----- lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5 ... =2Wd2 -----END PGP PRIVATE KEY BLOCK----- - Prejdite na nastavitve projekta -> Nastavitve -> CI / CD -> Spremenljivke in shranite zasebni ključ v spremenljivki
GPG_SECRET_KEY
Nastavitev Maven
- Ustvarjamo glavni ključ
mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Prejdite na nastavitve projekta -> Nastavitve -> CI / CD -> Spremenljivke in shranite v spremenljivki
SETTINGS_SECURITY_XMLnaslednje vrstice:{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} - Šifriramo geslo za račun Sonatype
mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} - Prejdite na nastavitve projekta -> Nastavitve -> CI / CD -> Spremenljivke in shranite v spremenljivki
SETTINGS_XMLnaslednje vrstice:env true GPG_SECRET_KEY_PASSPHRASE sonatype sonatype_username {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
kjer je,
GPG_SECRET_KEY_PASSPHRASE — geslo za GPG ključ
SONATYPE_USERNAME — prijavno ime računa sonatype
Deploy docker slike
- Ustvarimo dovolj preprost Dockerfile za zagon nalog na deploy z željeno različico Jave. Spodaj je predstavljen primer za 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/ - Создаем контейнер для вашего проекта
docker build -t registry.gitlab.com/group/deploy . - Аутентифицируемся и загружаем контейнер в реестр.
docker login -u USER -p PASSWORD registry.gitlab.com docker push registry.gitlab.com/group/deploy
GitLab CI
Deploy projekta
Добавляем файл .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 "Файл $pom содержит запрещенную настройку: ";
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=trueJava projekt
V java projektih, ki jih nameravate nalagati v javne repozitorije, je treba dodati 2 koraka za nalaganje različic Release in Snapshot.
.gitlab-ci.yml
stages:
- build
- test
- verify
- deploy
Release:
extends: .trigger_deploy
# Zagon naloge samo po oznaki.
only:
- tags
Snapshot:
extends: .trigger_deploy
# Začnemo nalogo za objavo različice SNAPSHOT ročno
when: manual
# Ne zagon naloge, če je nastavljena oznaka.
except:
- tags
.trigger_deploy:
stage: deploy
variables:
# Onemogočimo kloniranje trenutnega projekta
GIT_STRATEGY: none
# Povezava do sprožilca naloge za deploy
URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
# Spremenljivke naloge za 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:
# Ne uporabljam cURL, ker z zastavicami --fail --show-error
# ne izpiše telesa odgovora, če je HTTP koda 400 ali višja
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}V tej rešitvi sem šel nekoliko dlje in se odločil uporabiti eno CI predlogo za java projekte.
Podrobneje
Ustvaril sem ločen projekt v katerem sem umestil CI predlogo za java projekte .
common.yml
stages:
- build
- test
- verify
- deploy
variables:
SONAR_ARGS: "
-Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA}
-Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME}
"
.build_java_project:
stage: build
tags:
- touchbit-shell
variables:
SKIP_TEST: "false"
script:
- mvn clean
- mvn package -DskipTests=${SKIP_TEST}
artifacts:
when: always
expire_in: 30 day
paths:
- "*\/target\/reports"
.build_sphinx_doc:
stage: build
tags:
- touchbit-shell
variables:
DOCKERFILE: .indirect\/docs\/Dockerfile
script:
- docker build --no-cache -t ${CI_PROJECT_NAME}\/doc -f ${DOCKERFILE} .
.junit_module_test_run:
stage: test
tags:
- touchbit-shell
variables:
MODULE: ""
script:
- cd ${MODULE}
- mvn test
artifacts:
when: always
expire_in: 30 day
paths:
- "*\/target\/reports"
.junit_test_run:
stage: test
tags:
- touchbit-shell
script:
- mvn test
artifacts:
when: always
expire_in: 30 day
paths:
- "*\/target\/reports"
.sonar_review:
stage: verify
tags:
- touchbit-shell
dependencies: []
script:
- >
if [ "$CI_BUILD_REF_NAME" == "master" ]; then
mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
else
mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
fi
.trigger_deploy:
stage: deploy
tags:
- touchbit-shell
variables:
URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
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:
- wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}
.trigger_release_deploy:
extends: .trigger_deploy
only:
- tags
.trigger_snapshot_deploy:
extends: .trigger_deploy
when: manual
except:
- tags
Zato je v java projektih datoteka .gitlab-ci.yml precej kompaktna in brez odvečnega besedila.
.gitlab-ci.yml
include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml
Shields4J:
extends: .build_java_project
Sphinx doc:
extends: .build_sphinx_doc
variables:
DOCKERFILE: .docs/Dockerfile
Sonar review:
extends: .sonar_review
dependencies:
- Shields4J
Release:
extends: .trigger_release_deploy
Snapshot:
extends: .trigger_snapshot_deployKonfiguracija pom.xml
Ta tema je zelo podrobno opisana. u , zato bom opisal nekatere posebnosti uporabe vtičnikov. Tudi opisal bom, kako lahko enostavno in brez težav uporabite nexus-staging-maven-plugin, če ne želite ali ne morete uporabiti org.sonatype.oss:oss-parent kot starša za svoj projekt.
maven-install-plugin
Namesti module v lokalni repozitorij.
Izjemno koristno za lokalno preverjanje rešitev v drugih projektih, prav tako za preverjanje kontrolne vsote.
org.apache.maven.plugins
maven-install-plugin
install-project
install
target/${project.artifactId}-${project.version}.jar
target/${project.artifactId}-${project.version}-sources.jar
dependency-reduced-pom.xml
true
truemaven-javadoc-plugin
Generiranje javadoc-a za projekt.
org.apache.maven.plugins
maven-javadoc-plugin
jar
prepare-package
true
true
falseAko imate modul koji ne sadrži java (na primjer samo resurse)
Ili ako ne želite uopće generirati javadoc, evo pomoći maven-jar-plugin
org.apache.maven.plugins
maven-jar-plugin
empty-javadoc-jar
generate-resources
jar
javadoc
${basedir}/javadocmaven-gpg-plugin
org.apache.maven.plugins
maven-gpg-plugin
sign-artifacts
deploy
signnexus-staging-maven-plugin
Konfiguracija:
org.sonatype.plugins
nexus-staging-maven-plugin
org.sonatype.plugins
nexus-staging-maven-plugin
true
sonatype
https://oss.sonatype.org/
true
org.apache.maven.plugins
maven-deploy-plugin
true
sonatype
Nexus Snapshot Repository
https://oss.sonatype.org/content/repositories/snapshots/
sonatype
Nexus Release Repository
https://oss.sonatype.org/service/local/staging/deploy/maven2/Če imate večstopenjski projekt in ni potrebe za nalaganje določenega modula v repozitorij, morate v pom.xml tega modula dodati nexus-staging-maven-plugin z zastavico skipNexusStagingDeployMojo
org.sonatype.plugins
nexus-staging-maven-plugin
truePo nalaganju so snapshot/release različice dostopne v
SonatypeNexus
https://oss.sonatype.org/content/groups/staging/
Še dodatne koristi
- Zelo širok seznam ciljev za delo z nexus repozitorijem (
mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin). - Samodejna preverba izdaje za možnost nalaganja v maven central
Результат.
Objava SNAPSHOT različice
Pri sestavljanju projekta obstaja možnost ročnega zagonanja naloge za nalaganje SNAPSHOT različice v nexus
Ob zagonu te naloge se sproži ustrezna naloga v projektu deploy ().
Kratek dnevnik
Срабатывание с gitlab-runner 11.10.0 (3001a600)
на Deploy runner JSKWyxUw
Использование Shell executor...
Работа на ih1174328.vds.myihor.ru...
Пропускаем настройку репозитория Git
Пропускаем проверку Git
Пропускаем настройку подсистем Git
$ rm -rf .* *
$ git config --global credential.helper store
$ echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/ .git-credentials
$ git clone ${DEPLOY_CI_REPOSITORY_URL} .
Клонирование в 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Примечание: выполняем checkout '850f86aa317194395c5387790da1350e437125a7'.
Вы находитесь в состоянии 'отсоединенной HEAD'. Вы можете осмотреться, вносить экспериментальные
изменения и фиксировать их, а также можете отменить любые коммиты, которые вы создаете в этом
состоянии, не повлияв на какие-либо ветки, выполнив другую проверку.
Если вы хотите создать новую ветку для сохранения коммитов, которые вы создаете, вы можете
это сделать (сейчас или позже), используя -b с командой checkout снова. Пример:
git checkout -b new_branch_name
HEAD сейчас на 850f86a... пропустить тест развертывания core
$ for pom in $(find . -name pom.xml); do # сокращенная многострочная команда
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # сокращенная многострочная команда
[INFO] Поиск проектов...
[INFO] Проверка сборки с общим количеством 4 модуля...
[INFO] Установка функций Nexus Staging:
[INFO] ... всего 4 выполнения maven-deploy-plugin заменены на nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Порядок сборки реактора:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Клиент Shields4J [jar]
[INFO] Слушатель TestNG [jar]
[INFO]
[INFO] -----------------------------
[INFO] Сборка Shields4J 1.0.0 [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Поиск локального корня агрегатора...
[INFO] Локальный корень агрегации: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Обработка изменения org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Обработка org.touchbit.shields4j:shields4j-parent
[INFO] Обновление проекта org.touchbit.shields4j:shields4j-parent
[INFO] с версии 1.0.0 до 1.0.0-SNAPSHOT
[INFO]
[INFO] Обработка org.touchbit.shields4j:client
[INFO] Обновление родителя org.touchbit.shields4j:shields4j-parent
[INFO] с версии 1.0.0 до 1.0.0-SNAPSHOT
[INFO] Обновление зависимости org.touchbit.shields4j:test-core
[INFO] с версии 1.0.0 до 1.0.0-SNAPSHOT
[INFO]
[INFO] Обработка org.touchbit.shields4j:test-core
[INFO] Обновление родителя org.touchbit.shields4j:shields4j-parent
[INFO] с версии 1.0.0 до 1.0.0-SNAPSHOT
[INFO]
[INFO] Обработка org.touchbit.shields4j:testng
[INFO] Обновление родителя org.touchbit.shields4j:shields4j-parent
[INFO] с версии 1.0.0 до 1.0.0-SNAPSHOT
[INFO] Обновление зависимости org.touchbit.shields4j:client
[INFO] с версии 1.0.0 до 1.0.0-SNAPSHOT
[INFO] Обновление зависимости org.touchbit.shields4j:test-core
[INFO] с версии 1.0.0 до 1.0.0-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Резюме реактора:
[INFO]
[INFO] Shields4J 1.0.0 .................................... УСПЕХ [ 0.992 с]
[INFO] test-core .......................................... ПРОПУЩЕНО
[INFO] Клиент Shields4J ................................... ПРОПУЩЕНО
[INFO] Слушатель TestNG 1.0.0 .............................. ПРОПУЩЕНО
[INFO] ------------------------------------------------------------------------
[INFO] СТРОИТЕЛЬНЫЙ УСПЕХ
[INFO] ------------------------------------------------------------------------
[INFO] Общее время: 2.483 с
[INFO] Завершено в: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Поиск проектов...
[INFO] Проверка сборки с общим количеством 4 модуля...
[INFO] Установка функций Nexus Staging:
[INFO] ... всего 4 выполнения maven-deploy-plugin заменены на nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Порядок сборки реактора:
[INFO]
[INFO] Shields4J [pom]
[INFO] test-core [jar]
[INFO] Клиент Shields4J [jar]
[INFO] Слушатель TestNG [jar]
[INFO]
[INFO] -----------------------------
[INFO] Сборка Shields4J 1.0.0-SNAPSHOT [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
УДАЛЕНО
...
[INFO] * Массовая отправка локально собранных артефактов снимка завершена.
[INFO] Удаленная отправка завершена успешно.
[INFO] ------------------------------------------------------------------------
[INFO] Резюме реактора:
[INFO]
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... УСПЕХ [ 2.375 с]
[INFO] test-core .......................................... УСПЕХ [ 3.929 с]
[INFO] Клиент Shields4J ................................... УСПЕХ [ 3.815 с]
[INFO] Слушатель TestNG 1.0.0-SNAPSHOT ..................... УСПЕХ [ 36.134 с]
[INFO] ------------------------------------------------------------------------
[INFO] СТРОИТЕЛЬНЫЙ УСПЕХ
[INFO] ------------------------------------------------------------------------
[INFO] Общее время: 47.629 с
[INFO] Завершено в: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------Kot rezultata, je bil v nexus naložen različica .
Vse snapshot različice je mogoče izbrisati iz repozitorija na strani pod svojim računom.
Objava release različice
Ko je oznaka nameščena, se samodejno sproži ustrezna naloga v projektu deploy za nalaganje različice na nexus ().
Najboljše je, da se samodejno izvede close release v nexus.
[INFO] Izvaja se oddaljeno upravljanje...
[INFO]
[INFO] * Oddaljeno upravljanje v profil upravljanja ID "9043b43f77dcc9"
[INFO] * Ustvarjen repozitorij upravljanja s ID "orgtouchbit-1037".
[INFO] * Repozitorij upravljanja na https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO] * Nalaganje lokalno upravljanih artefaktov v profil org.touchbit
[INFO] * Nalaganje lokalno upravljanih artefaktov je končano.
[INFO] * Zapiranje repozitorija upravljanja z ID "orgtouchbit-1037".
Čakanje na dokončanje operacije...
.........
[INFO] Oddaljeno upravljanih 1 repozitorijev, končano s uspehom.
[INFO] ------------------------------------------------------------------------
[INFO] Povzetek reaktorja:
[INFO]
[INFO] Shields4J 1.0.0 .................................... USPEH [ 9.603 s]
[INFO] test-core .......................................... USPEH [ 3.419 s]
[INFO] Shields4J client ................................... USPEH [ 9.793 s]
[INFO] TestNG listener 1.0.0 .............................. USPEH [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] GRADNJA USPEH
[INFO] ------------------------------------------------------------------------
[INFO] Skupni čas: 01:47 min
[INFO] Končano ob: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------In če je šlo kaj narobe, se naloga zagotovo neuspešno zaključi
[INFO] Izvršavanje udaljenog staginga...
[INFO]
[INFO] * Udaljeni staging u profil za staging ID "9043b43f77dcc9"
[INFO] * Kreiran staging repozitorij sa ID "orgtouchbit-1038".
[INFO] * Staging repozitorij na https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO] * Učitavanje lokalno postavljenih artefakata u profil org.touchbit
[INFO] * Učitavanje lokalno postavljenih artefakata završeno.
[INFO] * Zatvaranje staging repozitorija sa ID "orgtouchbit-1038".
Čekanje na završetak operacije...
.......
[ERROR] Neuspeh pravila prilikom pokušaja zatvaranja staging repozitorija sa ID "orgtouchbit-1039".
[ERROR]
[ERROR] Izveštaj o neuspehu pravila Nexus Staging
[ERROR] ==================================
[ERROR]
[ERROR] Neuspehi repozitorija "orgtouchbit-1039"
[ERROR] Neuspehi pravila "signature-staging"
[ERROR] * Nema javnog ključa: Ključ sa id: (1f42b618d1cbe1b5) nije mogao biti lociran na http://keys.gnupg.net:11371/. Učitajte svoj javni ključ i pokušajte operaciju ponovo.
...
[ERROR] Čišćenje lokalnog direktorijuma za stage nakon neuspeha pravila tokom zatvaranja staging repozitorija: [orgtouchbit-1039]
[ERROR] * Brisanje konteksta 9043b43f77dcc9.properties
[ERROR] Čišćenje udaljenih staging repozitorija nakon neuspeha pravila tokom zatvaranja staging repozitorija: [orgtouchbit-1039]
[ERROR] * Odbacivanje neuspešnog staging repozitorija sa ID "orgtouchbit-1039" (Neuspeh pravila tokom zatvaranja staging repozitorija: [orgtouchbit-1039]).
[ERROR] Udaljeni staging završen sa neuspehom: Neuspeh pravila za staging!
[INFO] ------------------------------------------------------------------------
[INFO] Rezime reaktora:
[INFO]
[INFO] Shields4J 1.0.0 .................................... USPEH [ 4.073 s]
[INFO] test-core .......................................... USPEH [ 2.788 s]
[INFO] Shields4J klijent ................................... USPEH [ 3.962 s]
[INFO] TestNG slušalac 1.0.0 .............................. NEUSPEH [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] NEUSPEH GRADNJE
[INFO] ------------------------------------------------------------------------Na kraju, imamo samo jedan izbor. Ili da obrišemo ovu verziju ili da je objavimo.
Nakon objavljivanja, nakon nekog vremena artefakti će se naći u
off-topic
Bilo mi je iznenađenje da maven indeksira druge javne repozitorije.
Morao sam da dodam robots.txt, jer je indeksirao moj stari repozitorij.
Zaključek
Šta imamo
- Odvojeni deploy-projekat u kojem se mogu realizovati više CI zadataka za učitavanje artefakata u javne repozitorije za različite programske jezike.
- Deploy-projekat je izolovan od spoljnog mešanja i može ga menjati samo korisnici sa ulogom Owner i Maintainer.
- Odvojeni Specific Runner sa ‘vrućim’ cache-om za pokretanje samo deploy zadataka.
- Objavljivanje snapshot/release verzija u javnom repozitoriju.
- Automatska provera release verzije na spremnost za objavljivanje u maven central.
- Zaštita od automatskog objavljivanja ‘sirovih’ verzija u maven central.
- Gradnja i objavljivanje snapshot verzija ‘jednim klikom’.
- Konsolidovani repozitorij za preuzimanje snapshot/release verzija.
- Skupni tok za gradnjo/testiranje/publikacijo java projekta.
Nastavitev GitLab CI ni tako zapletena tema, kot se zdi na prvi pogled. Dovolj je, da nekajkrat nastavite CI "ključ do konca" in že niste več začetnik na tem področju. Poleg tega je dokumentacija GitLab precej obsežna. Ne bojte se narediti prvega koraka. Pot se odvija pod koraki tistega, ki hodi (ne spomnim se, kdo je to rekel 🙂 ).
Vesel bom povratnih informacij.
V naslednjem članku bom govoril o tem, kako nastaviti GitLab CI za hkratno izvajanje nalog z integracijskimi testi (s sprožitvijo testiranih storitev z docker-compose), če imate samo en shell runner.
Izvor: habr.com
