GitLab CI erigens ut Java project ad maven centrale upload

Articulus hic destinatur tincidunt Javae qui opus est ut cito edat res suas ad sonatypum et/vel maven repositoria centralis utens GitLab. In hoc articulo, de cursore gitlab-ci, gitlab-ci et maven-plugin ad solvendum problemate colloquebor.

PRAEREQUISITIS:

  • Tuta tabularia clavium mvn et GPG.
  • Secura exsecutio publicorum ci officiorum.
  • Discas artificia (release/snapshot) ad repositoria publica.
  • Automatic repressio versionum emissionis pro publicatione in maven centralis.
  • Solutio generalis de artificiis impositionis ad repositio pro multis inceptis.
  • De simplicitate et facilitate usus.

contentus

General information

  • Descriptio mechanismi explicandi artificia ad Maven Central via Sonatype OSS Repositorium Hosting Service iam in hoc Commentarium user googolplexsic in locis rectis ad hunc articulum referam.
  • Pre-subcriptio ad Sonatype JIRA et tessera incipere repositio aperire (pro magis details, sectionem legere Creare tessera in Sonatype JIRA). Repositorium aperiens, par login/password ab JIRA (infra ad rationem sonatypi referatur) artificia ad nexus Sonatypi imponenda adhibebitur.
  • Praeterea, siccissime describitur processus generandi clavis GPG. Vide in sectione ad plura. Vestibulum GnuPG artificia subscribere
  • Si Linux consolatorium uteris ad rationem GPG clavis (gnupg/gnupg2) generandam, debes ad institutionem RNG instrumenta, entropy generare. Alioquin amet generatio diutissime potest.
  • Repono servicia public GPG claves

Radiant

Profecti sunt in deploy project in GitLab

  • Imprimis, consilium debes creare et configurare in quo pipeline reponetur ad artificia instruenda. Proiectum meum vocavi simpliciter et simplex - explicandi
  • Post repositorium creavisti, accessum restringere debes mutandi repositio.
    Vade ad propositum -> Occasus -> Repositorium -> Protectus rami. Omnes regulas delemus et unam regulam cum Wildcard * addimus cum iure impulsus et confundendi solum pro usoribus cum manutenentibus partes. Haec regula operabitur omnibus utentibus utriusque incepti et coetus ad quem hoc consilium pertinet.
    GitLab CI erigens ut Java project ad maven centrale upload
  • Si plures sint assertores, optima solutio esset restringere accessum ad propositum in principio.
    Vade ad propositum -> Occasus -> General -> Visibilitas, project features, permissiones et pone visibilitatem Project to Secretum.
    Consilium in publico accessu habeo, quia meo proprio GitLab Cursor utor et solus aditus ad repositorium mutandum habeo. Bene, revera non est in mea utilitate privatas informationes in publicis lignis pipelines ostendere.
  • Constringens praecepta mutandi repositio
    Vade ad propositum -> Occasus -> Repositorium -> Regulas ventilabis et restrictionem pone vexilla Committere, Perspice num auctor sit a GitLab usor. Ego quoque commendare occasum committere subscriptionisconstituitque rejice signum Vexillum.
  • Deinde, opus est felis configurare ad munia currere
    Vade ad proiciendum -> Occasus -> CI / CD -> triggers Pipeline et novum trigger signum crea
    Hoc signum statim adscribi potest ad configurationem generalem variabilium pro circulo inceptorum.
    Perge ad globum -> Occasus -> CI / CD -> Variabiles et variabiles adde DEPLOY_TOKEN felis in pignus, in valorem.

Radiant

GitLab Cursor

Haec sectio describit configurationem ad operas currendi explicandas utendo tuo (Imprimis) et cursore publico (Shared).

Imprimis Cursor

Utor cursoribus meis, quod ante omnia commodum, ieiunium et vile.
Pro cursore commendo Linux VDS cum 1 CPU, 2 GB RAM, 20 GB HDD. Exitus pretium est ~MMM₽ per annum.

cursor meus

Pro currenti cepi VDS 4 CPU, 4 GB RAM, 50 GB SSD. Constat ~11000 et numquam paenituit.
Habeo summa 7 machinis. 5 in aruba et 2 in ihor.

Sic habemus cursorem. Nunc id felis quam.
Ad machinam per SSH imus et instituimus java, git, maven, gnupg2.

Radiant

Installing gitlab cursor

  • Novam group runner
    sudo groupadd runner
  • Creare directorium pro maven cache et iura coetus assign runner
    Hunc gradum transilire potes si plures cursores in eadem machina currere non cogitas.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Creare a user gitlab-deployer et adde in coetus runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Add to file /etc/ssh/sshd_config altera linea
    AllowUsers root@* [email protected]
  • Reboot sshd
    systemctl restart sshd
  • Profecta password pro usuario gitlab-deployer (simplex esse potest, cum sit restrictio localhost)
    passwd gitlab-deployer
  • Install GitLab Cursor (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
  • Vade ad website gitlab.com -> explica-project -> Occasus -> CI/CD -> Cursores -> Imprimis Cursores et exemplum adnotatione signum

Screen

GitLab CI erigens ut Java project ad maven centrale upload

  • Perscriptum cursor
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

processus

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!

  • Reprehendo quod cursor relatus est. Ire ad gitlab.com -> explicandam project -> Occasus -> CI/CD -> Cursores -> Imprimis Cursores -> Cursores ad hoc project reducuntur

Screen

GitLab CI erigens ut Java project ad maven centrale upload

  • addere separatum officium /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
  • Incipimus in servitio.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Reprehendo ut cursus cursus.

exempli gratia

GitLab CI erigens ut Java project ad maven centrale upload

Radiant

GPG key generation

  • Ex eadem machina imus per ssh sub usoris gitlab-deployer (Hoc est momenti pro GPG clavis generationis)

    ssh [email protected]

  • Clavem generamus respondendo quaestiones. Nomine meo usus sum et email.
    Vide ut tesseram clavem designet. Artificia hac clavi signabuntur.

    gpg --gen-key 

  • represserat

    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

  • Publica nostra clavis ad keyserver discas

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

Radiant

Profecta Maven

  • Sub itur usor gitlab-deployer
    su gitlab-deployer 
  • Crea virens presul Reconditorium et liga cum cache (nolite errare)
    Hic gradus omitti potest si plures cursores in eadem machina currere non cogitas.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Creare dominum clavem
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Facere limam ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Encrypting password pro Sonatype rationem
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Facere limam ~/.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>

ubi,
GPG_SECRET_KEY_PASSPHRASE - GPG clavis password
SONATYPE_USERNAME — sonatype rationis login

Hoc cursorem setup complet, ad sectionem procedere potes C. GitLab

Radiant

Shared Currens

GPG key generation

  • Primum, GPG creare debes clavis. Facere, instituere gnupg.

    yum install -y gnupg

  • Clavem generamus respondendo quaestiones. Nomine meo usus sum et email. Vide ut tesseram clavem designet.

    gpg --gen-key 

  • Ostendens informationes in clavem

    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]

  • Publica nostra clavis ad keyserver discas

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

  • Privata key ad nos adepto

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

  • Vade ad occasus project -> Occasus -> CI / CD -> Variabiles et clavis privatas serva in variabili GPG_SECRET_KEY
    GitLab CI erigens ut Java project ad maven centrale upload

Radiant

Profecta Maven

  • Creare dominum clavem
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Vade ad occasus project -> Occasus -> CI / CD -> Variabiles et nisi in variabili SETTINGS_SECURITY_XML versus sequentes;
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Encrypting password pro Sonatype rationem
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Vade ad occasus project -> Occasus -> CI / CD -> Variabiles et nisi in variabili SETTINGS_XML versus sequentes;
    <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>

ubi,
GPG_SECRET_KEY_PASSPHRASE - GPG clavis password
SONATYPE_USERNAME — sonatype rationis login

Radiant

Deploy docker imaginem

  • Dockerfile satis simplicem efficimus ut munera explicamus cum versione Javae desiderata. Infra exemplum alpinum.

    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/

  • Aedificationem vas in project

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

  • Nos authenticitatis signo munire et vas in registro onerare.

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

Radiant

C. GitLab

Deploy project

Adde lima .gitlab-ci.yml ad radicem explicandi
Scriptum exhibet duo munera instruere mutuo repugnare. Imprimis Cursor vel Cursor Communes respectively.

.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

Radiant

Java project

In Java inceptis quae ad repositoria publica impositi supponuntur, debes addere 2 gradus ad solutionem et versiones Snapshots detrahendas.

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

In hac solutione paulo longius accessi et unum CI templates pro Java inceptis uti decrevi.

In details

Separatum project sum creatus gitlab-ci in quo collocavit CI templates Java inceptis common.yml.

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

Quam ob rem in Java se projicit, .gitlab-ci.yml valde compactus et non verbosus spectat.

.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

Radiant

Pom.xml configuration

Hic locus copiose describitur. googolplex в Erexit maven ut sponte signum et fasciculos artificiorum ad snapshot et choragium repositoriasic nonnullas enucleationes adhibendi describemus. Etiam describere quam facile et naturaliter uti possis nexus-staging-maven-pluginsi non vis vel non potes utere org.sonatype.oss:oss-parentem ut parentem ad propositum tuum.

maven-install-plugin

Moduli moduli in promptuario locali.
Perutile est ad verificationem localem solutionum in aliis inceptis, necnon checksum.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-project</id>
      <!-- Если у вас многомодульный проект с деплоем родительского помика -->
      <phase>install</phase>
      <!-- Явно указываем файлы для локальной установки -->
      <configuration>
        <file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
        <pomFile>dependency-reduced-pom.xml</pomFile>
        <!-- Принудительное обновление метаданных проекта -->
        <updateReleaseInfo>true</updateReleaseInfo>
        <!-- Контрольные суммы для проверки целостности -->
        <createChecksum>true</createChecksum>
      </configuration>
    </execution>
  </executions>
</plugin>

Radiant

maven-javadoc-plugin

Generans javadoc pro documentum.

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

Si moduli habes qui Javam non continet (exempli gratia facultates tantum)
Vel non vis generare javadoc in principio, deinde adiuvare 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>

Radiant

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>

Radiant

nexus choragi-maven-plugin

Configurationis:

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

Si consilium multi-module habes, et moduli specifici repositorium non debes imponere, tunc debes addere ad pom.xml huius moduli. nexus-staging-maven-plugin cum vexillum skipNexusStagingDeployMojo

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

Post uploading snapshot / release versiones sunt available in CHORAGIUM repositoria

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

Plus pluses

  • Copia copiosa scutorum ad operandum cum nexu repositorio (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Lorem emissio ceptum downloadability in maven centralis

Radiant

exitum

Evulgare SNAPSHOT Version

Cum aedificare consilium, manually negotium incipere potest versionem SNAPSHOT ad nexum extrahere

GitLab CI erigens ut Java project ad maven centrale upload

Cum hoc negotium emittitur, munus respondente in explicando consilio utitur (exempli gratia).

ornaverunt log

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

Quam ob rem nexus versio oneratur 1.0.0-SNAPSHOT.

Omnes snapshot versiones removeri possunt e conditorio in situ oss.sonatype.org sub ratione vestra.

GitLab CI erigens ut Java project ad maven centrale upload

Radiant

Evulgare versionem release

Cum tag installatur, respondens munus in explicandi consilio statim utitur ut versionem emissionem nexum emittat (exempli gratia).

GitLab CI erigens ut Java project ad maven centrale upload

Optima pars est quae proxima emissione automatice triggers in nexu.

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

Et si quid peccaverit, tunc negotium deficiet

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

Quam ob rem cum una tantum electione relinquimur. Hanc versionem vel dele vel ede.

GitLab CI erigens ut Java project ad maven centrale upload

Post emissionem, post aliquod tempus artificia facta erunt in GitLab CI erigens ut Java project ad maven centrale upload

off topic

Revelatio mihi fuit indices mavenorum aliorum repositorium publicorum.
Habui ad upload robots.txt quia vetus repositio indexed.

Radiant

conclusio,

Quid habemus?

  • Separatum explicandi consilium in quo plura CI officia efficere potes ad repositoria publica ad repositoria publica pro variis linguis evolutionis inserendis.
  • Instruere consilium ab extra impedimento remotum est et solum ab usoribus modificari cum muneribus possessoris et continentis.
  • Cache Imprimis Cursor separatus cum "calido" ad currendum solum operas explicandas.
  • Publication de snapshot/remissionem versiones in reposito publico.
  • Automatica perscriptio versionis emissio ad promptitudinem editionis in media maven.
  • Praesidium contra latae sententiae publicationem "crudum" versionum in machina centrali.
  • Aedificare et evulgare snapshot versiones "in click".
  • Una repositio pro questus snapshot / versiones dimittere.
  • Generalis pipelines ad aedificationem/temptationes/proiectae Javae divulgandas.

Erectio GitLab CI non est tam multiplex thema sicut primo aspectu videtur. CI in turnkey basium duorum temporum constituere satis est, et nunc longe ab amante in hac re es. Praeterea, documenta GitLab valde redundant. Noli timere accipere primum gradum. Via sub gradibus ambulationis apparet (Non memini qui dixit :)

Exsultabo in feedback.

In sequenti articulo, ostendam tibi quomodo GitLab CI constituere ut ad integrationem testium munerum certatim concurras (testis officia currit cum docker-compositione) si tantum habeas unum testam cursorem.

Radiant

Source: www.habr.com

Add a comment