Nastavitev GitLab CI za nalaganje java projekta v maven central

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 tem članku uporabnika Googolplex, zato bom na ustreznih mestih skliceval na ta članek.
  • Prej se registriramo na Sonatype JIRA in odpiramo tiket za odprtje repozitorija (več o tem v razdelku Ustvarimo tiket na Sonatype JIRA). 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 Nastavitev GnuPG za podpisovanje artefaktov
  • Če uporabljate Linux konzolo za generiranje GPG ključa (gnupg/gnupg2), morate namestiti rng-tools za generiranje entropije. V nasprotnem primeru lahko generiranje ključa traja zelo dolgo.
  • Storitev za shranjevanje javnih GPG ključev

Nazaj na vsebino

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 — deploy
  • 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.
    Nastavitev GitLab CI za nalaganje java projekta v maven central
  • Č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 podpisovanja obveznic, 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 spremenljivko DEPLOY_TOKEN s trigger-tokenom v vrednosti.

Nazaj na vsebino

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.

Nazaj na vsebino

Namestimo gitlab runner

  • Ustvarimo novo skupino runner
    sudo 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-deployer in dodamo v skupino runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Dodamo v datoteko /etc/ssh/sshd_config nato vrstico
    AllowUsers root@* gitlab-deployer@127.0.0.1
  • Ponovno pokrećemo sshd
    systemctl 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

Nastavitev GitLab CI za nalaganje java projekta v maven central

  • 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

Nastavitev GitLab CI za nalaganje java projekta v maven central

  • 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

Nastavitev GitLab CI za nalaganje java projekta v maven central

Nazaj na vsebino

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

Nazaj na vsebino

Nastavitev Maven

  • Ulažemo kao korisnik gitlab-deployer
    su 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 GitLab CI

Nazaj na vsebino

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 GitLab CI za nalaganje java projekta v maven central

Nazaj na vsebino

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

Nazaj na vsebino

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

Nazaj na vsebino

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

Nazaj na vsebino

Java 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 gitlab-ci v katerem sem umestil CI predlogo za java projekte 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

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_deploy

Nazaj na vsebino

Konfiguracija pom.xml

Ta tema je zelo podrobno opisana. Googolplex u Nastavitev Mavena za samodejno podpisovanje in nalaganje artefaktov v snapshot in staging repozitorije., 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
        
        true

Nazaj na vsebino

maven-javadoc-plugin

Generiranje javadoc-a za projekt.

org.apache.maven.plugins
  maven-javadoc-plugin
  
    
      
        jar
      
      
      prepare-package
      
        
        true
        true
        
        false

Ako 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}/javadoc

Nazaj na vsebino

maven-gpg-plugin

org.apache.maven.plugins
  maven-gpg-plugin
  
    
      sign-artifacts
      
      
      deploy
      
        sign

Nazaj na vsebino

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

Po nalaganju so snapshot/release različice dostopne v staging repozitoriju

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

Nazaj na vsebino

Результат.

Objava SNAPSHOT različice

Pri sestavljanju projekta obstaja možnost ročnega zagonanja naloge za nalaganje SNAPSHOT različice v nexus

Nastavitev GitLab CI za nalaganje java projekta v maven central

Ob zagonu te naloge se sproži ustrezna naloga v projektu deploy (primer).

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 1.0.0-SNAPSHOT.

Vse snapshot različice je mogoče izbrisati iz repozitorija na strani oss.sonatype.org pod svojim računom.

Nastavitev GitLab CI za nalaganje java projekta v maven central

Nazaj na vsebino

Objava release različice

Ko je oznaka nameščena, se samodejno sproži ustrezna naloga v projektu deploy za nalaganje različice na nexus (primer).

Nastavitev GitLab CI za nalaganje java projekta v maven central

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.

Nastavitev GitLab CI za nalaganje java projekta v maven central

Nakon objavljivanja, nakon nekog vremena artefakti će se naći u Nastavitev GitLab CI za nalaganje java projekta v maven central

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.

Nazaj na vsebino

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.

Nazaj na vsebino

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster