GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

See artikkel on mõeldud Java-arendajatele, kes peavad GitLabi kasutades kiiresti oma tooted Sonatype ja/või Maveni keskvaramutesse avaldama. Selles artiklis räägin gitlab-runneri, gitlab-ci ja maven-plugini seadistamisest selle probleemi lahendamiseks.

Eeltingimused:

  • Mvn ja GPG võtmete turvaline hoiustamine.
  • Avalike CI-ülesannete turvaline täitmine.
  • Artefaktide (väljalase/hetktõmmise) üleslaadimine avalikesse hoidlatesse.
  • Väljalaskeversioonide automaatne kontroll Maven Centralis avaldamiseks.
  • Üldine lahendus artefaktide hoidlasse üleslaadimiseks mitme projekti jaoks.
  • Lihtsus ja kasutusmugavus.

Sisu

Üldine teave

  • Üksikasjalik kirjeldus artefaktide avaldamise mehhanismi kohta Maven Centralis Sonatype OSS-i hoidla hostimisteenuse kaudu on juba kirjeldatud see artikkel kasutaja Googolplex, seega viitan sellele artiklile õigetes kohtades.
  • Eelregistreerimine kl Sonatüüp JIRA ja käivitage hoidla avamiseks pilet (lisateabe saamiseks lugege jaotist Looge Sonatype JIRA pilet). Pärast hoidla avamist kasutatakse JIRA sisselogimise/parooli paari (edaspidi Sonatype konto) artefaktide üleslaadimiseks Sonatype nexusesse.
  • Lisaks kirjeldatakse GPG-võtme genereerimise protsessi väga kuivalt. Täpsemalt vaadake jaotist. GnuPG seadistamine artefaktide allkirjastamiseks
  • Kui kasutate GPG-võtme genereerimiseks Linuxi konsooli (gnupg/gnupg2), peate installima rng-tööriistad entroopia tekitamiseks. Vastasel juhul võib võtme genereerimine võtta väga kaua aega.
  • Salvestusteenused avalik GPG võtmed

Sisu juurde

Juurutusprojekti seadistamine GitLabis

  • Kõigepealt peate looma ja konfigureerima projekti, milles konveier salvestatakse artefaktide juurutamiseks. Ma nimetasin oma projekti lihtsalt ja lihtsaks - juurutada
  • Pärast hoidla loomist peate hoidla muutmiseks juurdepääsu piirama.
    Avage projekt -> Seaded -> Hoidla -> Kaitstud filiaalid. Kustutame kõik reeglid ja lisame metamärgiga * ühe reegli, millel on tõuke- ja liitmisõigus ainult hooldaja rolliga kasutajatele. See reegel töötab nii selle projekti kui ka rühma, kuhu see projekt kuulub, kõigi kasutajate puhul.
    GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse
  • Kui hooldajaid on mitu, siis oleks parim lahendus piirata ligipääsu projektile põhimõtteliselt.
    Avage projekt -> Seaded -> Üldine -> Nähtavus, projekti funktsioonid, load ja määrake Projekti nähtavus väärtuseks Era-.
    Mul on projekt avalikult juurdepääsetav, kuna kasutan oma GitLabi Runnerit ja ainult mul on juurdepääs hoidla muutmiseks. Tegelikult ei ole minu huvides näidata avalikes torujuhtmete logides privaatset teavet.
  • Hoidla muutmise reeglite karmistamine
    Mine projekti -> Seaded -> Hoidla -> Tõukereeglid ja seadke lipud Committer limitation, Kontrollige, kas autor on GitLabi kasutaja. Soovitan ka sättida alla kirjutamaja määrake lipp Keeldu allkirjastamata kohustustest.
  • Järgmisena peate ülesannete käivitamiseks konfigureerima päästiku
    Avage projekt -> Seaded -> CI / CD -> Pipeline'i käivitajad ja looge uus käivitusluba
    Selle märgi saab kohe lisada projektirühma muutujate üldisesse konfiguratsiooni.
    Minge gruppi -> Settings -> CI / CD -> Variables ja lisage muutuja DEPLOY_TOKEN mille väärtuses on käivitusmärk.

Sisu juurde

GitLabi jooksja

Selles jaotises kirjeldatakse konfiguratsiooni toimingute käitamiseks juurutamisel, kasutades oma (spetsiifiline) ja avalikku (jagatud) käitajat.

Konkreetne jooksja

Kasutan enda jooksjaid, sest esiteks on see mugav, kiire, odav.
Jooksjale soovitan Linux VDS-i, millel on 1 protsessor, 2 GB muutmälu, 20 GB kõvaketas. Emissioonihind ~ 3000₽ aastas.

Minu jooksja

Jooksja jaoks võtsin VDS 4 CPU, 4 GB RAM, 50 GB SSD. See maksis ~11000₽ ja pole kunagi kahetsenud.
Mul on kokku 7 masinat. 5 arubal ja 2 ihoril.

Niisiis, meil on jooksja. Nüüd paneme selle paika.
Me läheme SSH kaudu masinasse ja installime java, git, maven, gnupg2.

Sisu juurde

Gitlab Runneri installimine

  • Looge uus grupp runner
    sudo groupadd runner
  • Looge Maveni vahemälu kataloog ja määrake rühma õigused runner
    Võite selle sammu vahele jätta, kui te ei kavatse samal masinal mitut jooksjat joosta.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Looge kasutaja gitlab-deployer ja lisage gruppi runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Lisa faili /etc/ssh/sshd_config järgmine rida
    AllowUsers root@* [email protected]
  • Taaskäivitage sshd
    systemctl restart sshd
  • Määra kasutajale parool gitlab-deployer (see võib olla lihtne, kuna localhostile on piirang)
    passwd gitlab-deployer
  • Installige 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
  • Minge saidile gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners ja kopeerige registreerimisluba

Ekraan

GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

  • Jooksja registreerimine
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

protsess

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!

  • Kontrollige, kas jooksja on registreeritud. Minge saidile gitlab.com -> juurutamise projekt -> Seaded -> CI/CD -> Jooksjad -> Konkreetsed jooksjad -> Selle projekti jaoks aktiveeritud jooksjad

Ekraan

GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

  • Lisage eraldi teenus /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
  • Alustame teenust.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Kontrollige, kas jooksja jookseb.

Näide

GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Sisu juurde

GPG võtme genereerimine

  • Samast masinast läheme kasutaja alla ssh kaudu gitlab-deployer (see on oluline GPG võtme genereerimiseks)

    ssh [email protected]

  • Loome võtme, vastates küsimustele. Kasutasin enda nime ja meiliaadressi.
    Määrake kindlasti võtme parool. Artefaktid allkirjastatakse selle võtmega.

    gpg --gen-key 

  • Kontrollige

    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

  • Meie avaliku võtme üleslaadimine võtmeserverisse

    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: sending key 00000000 to hkp server keys.gnupg.net

Sisu juurde

Maven seadistamine

  • Me läheme kasutaja alla gitlab-deployer
    su gitlab-deployer 
  • Looge maveni kataloog Hoidla ja link vahemäluga (ära tee viga)
    Selle sammu võib vahele jätta, kui te ei plaani mitut jooksjat samal masinal joosta.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Looge põhivõti
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Looge fail ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Parooli krüptimine Sonatype'i kontolt
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Looge fail ~/.m2/settings.xml
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

kus,
GPG_SECRET_KEY_PASSPHRASE – GPG võtme parool
SONATYPE_USERNAME – sonatype konto sisselogimine

See lõpetab jooksja seadistamise, võite jätkata jaotisega GitLab CI

Sisu juurde

Jagatud jooksja

GPG võtme genereerimine

  • Kõigepealt peate looma GPG-võtme. Selleks installige gnupg.

    yum install -y gnupg

  • Loome võtme, vastates küsimustele. Kasutasin enda nime ja meiliaadressi. Määrake kindlasti võtme parool.

    gpg --gen-key 

  • Hankige põhiteave

    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expires: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp <[email protected]>
    sub   rsa3072 2019-04-24 [E] [expires: none]

  • Meie avaliku võtme üleslaadimine võtmeserverisse

    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net

  • Privaatvõtme hankimine

    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----

  • Avage projekti seaded -> Seaded -> CI / CD -> Muutujad ja salvestage privaatvõti muutujasse GPG_SECRET_KEY
    GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Sisu juurde

Maven seadistamine

  • Looge põhivõti
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Avage projekti sätted -> Seaded -> CI / CD -> Muutujad ja salvestage muutujasse SETTINGS_SECURITY_XML järgmised read:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Parooli krüptimine Sonatype'i kontolt
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Avage projekti sätted -> Seaded -> CI / CD -> Muutujad ja salvestage muutujasse SETTINGS_XML järgmised read:
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

kus,
GPG_SECRET_KEY_PASSPHRASE – GPG võtme parool
SONATYPE_USERNAME – sonatype konto sisselogimine

Sisu juurde

Dockeri kujutise juurutamine

  • Loome üsna lihtsa Docker-faili, et käivitada ülesandeid juurutamisel soovitud Java versiooniga. Allpool on näide alpi kohta.

    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/

  • Oma projekti jaoks konteineri ehitamine

    docker build -t registry.gitlab.com/group/deploy .

  • Autentime ja laadime konteineri registrisse.

    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

Sisu juurde

GitLab CI

Projekti juurutamine

Lisage juurutusprojekti juure fail .gitlab-ci.yml
Skript esitab kaks üksteist välistavat juurutusülesannet. Konkreetne jooksja või jagatud jooksja.

.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

Sisu juurde

Java projekt

Java-projektides, mis tuleks üles laadida avalikesse hoidlatesse, peate versioonide Release ja Snapshot allalaadimiseks lisama 2 sammu.

.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}

Selles lahenduses läksin veidi kaugemale ja otsustasin kasutada Java projektide jaoks ühte CI malli.

Lisateave

Tegin eraldi projekti gitlab-ci kuhu ta pani Java projektide CI malli tavaline.yml.

tavaline.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

Selle tulemusel näeb .gitlab-ci.yml Java-projektides välja väga kompaktne ja mitte paljusõnaline

.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_deploy

Sisu juurde

pom.xml konfiguratsioon

Seda teemat kirjeldatakse väga üksikasjalikult. Googolplex в Maveni seadistamine artefaktide automaatseks allkirjastamiseks ja üleslaadimiseks hetktõmmiste ja lavastamishoidlatesse, seega kirjeldan mõningaid pistikprogrammide kasutamise nüansse. Samuti kirjeldan, kui lihtsalt ja loomulikult saate seda kasutada nexus-staging-maven-pluginkui te ei soovi või ei saa oma projekti vanemana kasutada org.sonatype.oss:oss-parent.

maven-install-plugin

Installib moodulid kohalikku hoidlasse.
Väga kasulik teiste projektide lahenduste kohalikuks kontrollimiseks ja ka kontrollsummaks.

<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>

Sisu juurde

maven-javadoc-plugin

Projekti jaoks javadoci genereerimine.

<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>

Kui teil on moodul, mis ei sisalda javat (näiteks ainult ressursid)
Või sa ei taha põhimõtteliselt javadoci genereerida, siis aita maven-jar-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>empty-javadoc-jar</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <classifier>javadoc</classifier>
        <classesDirectory>${basedir}/javadoc</classesDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Sisu juurde

maven-gpg-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- Сборка будет падать, если отсутствует GPG ключ -->
      <!-- Подписываем артефакты только на фазе deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Sisu juurde

nexus-staging-maven-plugin

Konfiguratsioon:

<project>
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <!-- Обновляем метаданные, чтобы пометить артефакт как release -->
            <!-- Не влияет на snapshot версии -->
            <updateReleaseInfo>true</updateReleaseInfo>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <configuration>
            <!-- Отключаем плагин -->
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <distributionManagement>
    <snapshotRepository>
      <id>sonatype</id>
      <name>Nexus Snapshot Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype</id>
      <name>Nexus Release Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

Kui teil on mitmest moodulist koosnev projekt ja te ei pea hoidlasse konkreetset moodulit üles laadima, peate selle mooduli faili pom.xml lisama. nexus-staging-maven-plugin lipuga skipNexusStagingDeployMojo

<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <configuration>
        <skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
      </configuration>
    </plugin>
  </plugins>
</build>

Pärast hetktõmmise/väljaande üleslaadimist on versioonid saadaval lavastushoidlad

<repositories>
  <repository>
    <id>SonatypeNexus</id>
    <url>https://oss.sonatype.org/content/groups/staging/</url>
    <!-- Не надо указывать флаги snapshot/release для репозитория -->
  </repository>
</repositories>

Veel plusse

  • Väga rikkalik sihtmärkide loend nexuse hoidlaga töötamiseks (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Automaatne väljalaskekontroll allalaaditavuse osas Maven Centralis

Sisu juurde

Tulemus

SNAPSHOTI versiooni avaldamine

Projekti ehitamisel on võimalik käsitsi käivitada ülesanne SNAPSHOTI versiooni nexusesse allalaadimiseks

GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Selle ülesande käivitamisel käivitatakse juurutusprojektis vastav ülesanne (näide).

kärbitud palk

Running with gitlab-runner 11.10.0 (3001a600)
  on Deploy runner JSKWyxUw
Using Shell executor...
Running on ih1174328.vds.myihor.ru...
Skipping Git repository setup
Skipping Git checkout
Skipping Git submodules setup
$ 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} .
Cloning into 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Note: checking out '850f86aa317194395c5387790da1350e437125a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
HEAD is now at 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # collapsed multi-line command
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # collapsed multi-line command
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Processing change of org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Processing org.touchbit.shields4j:shields4j-parent
[INFO]     Updating project org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:client
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:test-core
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:testng
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:client
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  0.992 s]
[INFO] test-core .......................................... SKIPPED
[INFO] Shields4J client ................................... SKIPPED
[INFO] TestNG listener 1.0.0 .............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.483 s
[INFO] Finished at: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO]  * Bulk deploy of locally gathered snapshot artifacts finished.
[INFO] Remote deploy finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUCCESS [  2.375 s]
[INFO] test-core .......................................... SUCCESS [  3.929 s]
[INFO] Shields4J client ................................... SUCCESS [  3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... SUCCESS [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.629 s
[INFO] Finished at: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Selle tulemusena laaditakse nexuse versioon 1.0.0-PIKKUS.

Kõik hetktõmmise versioonid saab saidi hoidlast eemaldada oss.sonatype.org teie konto all.

GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Sisu juurde

Väljalaske versiooni avaldamine

Kui silt on määratud, käivitatakse juurutusprojektis automaatselt vastav ülesanne, et laadida väljalaskeversioon nexusesse (näide).

GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Parim osa on see, et sulgemine vallandub Nexuses automaatselt.

[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] ------------------------------------------------------------------------

Ja kui midagi läks valesti, siis ülesanne ebaõnnestub

[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 &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. 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] ------------------------------------------------------------------------

Selle tulemusena jääb meile ainult üks valik. Või kustutage see versioon või avaldage.

GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Pärast vabastamist, mõne aja pärast, on artefaktid sees GitLabi CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

teemast mööda

See oli mulle ilmutus, et maven indekseerib teisi avalikke hoidlaid.
Pidin faili robots.txt üles laadima, kuna see indekseeris mu vana hoidla.

Sisu juurde

Järeldus

Mis meil on

  • Eraldi juurutusprojekt, milles saate rakendada mitmeid CI-ülesandeid artefaktide üleslaadimiseks avalikesse hoidlatesse erinevate arenduskeelte jaoks.
  • Juurutusprojekt on väliste häirete eest isoleeritud ja seda saavad muuta ainult omaniku ja hooldaja rolliga kasutajad.
  • Eraldi konkreetne jooksja, millel on "kuum" vahemälu ainult juurutamisülesannete käitamiseks.
  • Snapshot/Release versioonide avaldamine avalikus hoidlas.
  • Väljalaskeversiooni automaatne kontroll Maven Centralis avaldamiseks.
  • Kaitse "toores" versioonide automaatse avaldamise eest Maven Centralis.
  • Looge ja avaldage hetktõmmise versioone "klõpsuga".
  • Üks hoidla hetktõmmise/väljalase versioonide hankimiseks.
  • Java projekti ehitamise / testimise / avaldamise üldine torustik.

GitLabi CI seadistamine pole nii keeruline teema, kui esmapilgul tundub. Piisab, kui seadistate CI paar korda võtmed kätte põhimõttel ja nüüd pole te selles küsimuses kaugeltki amatöör. Lisaks on GitLabi dokumentatsioon väga üleliigne. Ärge kartke astuda esimest sammu. Tee paistab kõndiva inimese trepi alla (ma ei mäleta, kes seda ütles :)

Annan hea meelega tagasisidet.

Järgmises artiklis näitan teile, kuidas seadistada GitLabi CI integratsioonitesti ülesandeid konkurentsivõimeliselt käivitama (testteenuste käitamine koos docker-compose'iga), kui teil on ainult üks shell runner.

Sisu juurde

Allikas: www.habr.com

Lisa kommentaar