Nastavenie GitLab CI na nahrávanie java projektu do maven central.

Tento článok je určený pre vývojárov jazyka Java, ktorí potrebujú rýchlo publikovať svoje produkty v repozitároch Sonatype a/alebo Maven Central pomocou GitLab. V tomto článku popíšem nastavenie gitlab-runner, gitlab-ci a maven-plugin na vyriešenie tejto úlohy.

Predpoklady:

  • Bezpečné uchovávanie kľúčov mvn a GPG.
  • Bezpečné vykonávanie verejných CI úloh.
  • Nahrávanie artefaktov (release/snapshot) do verejných repozitárov.
  • Automatická kontrola release verzií na publikovanie v Maven Central.
  • Celkovo riešenie na nahrávanie artefaktov do repozitára pre viacero projektov.
  • Jednoduchosť a pohodlnosť používania.

Obsah

Základné informácie

  • Podrobné opísanie mechanizmu publikovania artefaktov v Maven Central cez službu Sonatype OSS Repository Hosting Service už bolo uvedené v tento článok užívateľom Googolplex, preto v potrebných miestach budem odkazovať na tento článok.
  • Predtým sa zaregistrujeme na Sonatype JIRA a vytvoríme tiket na otvorenie repozitára (podrobnejšie čítajte v sekcii Vytvárame tiket v Sonatype JIRA). Po otvorení repozitára sa pár prihlasovacích údajov / hesla z JIRA (ďalej účet Sonatype) použije na nahrávanie artefaktov do Sonatype nexus.
  • Ďalej je proces generovania GPG kľúča opísaný veľmi stručne. Podrobnejšie pozrite sekciu Nastavenie GnuPG na podpisovanie artefaktov
  • Ak používate Linux konzolu na generovanie GPG kľúča (gnupg/gnupg2), je potrebné nainštalovať rng-tools na generovanie entropie. Inak môže generovanie kľúča prebiehať veľmi pomaly.
  • Služby ukladania verejných GPG kľúčov

K obsahu

Nastavenie deploy projektu v GitLab

  • V prvom rade je potrebné vytvoriť a nastaviť projekt, v ktorom sa bude uchovávať pipeline pre nasadenie artefaktov. Môj projekt som nazval jednoducho — deploy
  • Po vytvorení repozitára je potrebné obmedziť prístup na zmenu repozitára.
    Prejdite na projekt -> Nastavenia -> Repozitár -> Chránené vetvy. Odstráňte všetky pravidlá a pridajte jedinú jednu pravidlo s Wildcard * s právom na push a merge len pre používateľov s rolou Maintainers. Toto pravidlo bude fungovať pre všetkých používateľov ako tohto projektu, tak aj skupiny, do ktorej tento projekt patrí.
    Nastavenie GitLab CI na nahrávanie java projektu do maven central.
  • Ak je viacero údržbárov, najlepším riešením je obmedziť prístup k projektu ako takému.
    Prejdeme do projektu -> Nastavenia -> Všeobecné -> Viditeľnosť, funkcie projektu, povolenia a nastavíme viditeľnosť projektu na Private.
    Mám projekt v verejnom prístupe, pretože používam svoj vlastný GitLab Runner a prístup na úpravu repozitára mám len ja. A samozrejme, nie je v mojich záujmoch zverejňovať súkromné informácie vo verejných pipeline logoch.
  • Zvýšenie prísnosti pravidiel na zmenu repozitára
    Prejdeme do projektu -> Nastavenia -> Repozitár -> Pravidlá push a nastavíme parametre Obmedzenie commitera, Skontrolovať, či je autor používateľom GitLab. Taktiež odporúčam nastaviť podpis commitov, a nastaviť parameter Zamietnuť nepodpísané commity.
  • Ďalej je potrebné nastaviť spúšťač na spustenie úloh
    Prejdeme do projektu -> Nastavenia -> CI / CD -> Spúšťače pipeline a vytvoríme nový token spúšťača
    Tento token môžeme ihneď pridať do spoločnej konfigurácie premenných pre skupinu projektov.
    Prejdeme do skupiny -> Nastavenia -> CI / CD -> Premenné a pridáme premennú DEPLOY_TOKEN s hodnotou tokenu spúšťača.

K obsahu

GitLab Runner

V tejto sekcii je opísaná konfigurácia na spustenie úloh na deploy s využitím vlastného (Specific) a verejného (Shared) runnera.

Špecifický Runner

Používam vlastné runnery, pretože je to predovšetkým pohodlné, rýchle a lacné.
Pre runner odporúčam linuxový VDS s 1 CPU, 2 GB RAM, 20 GB HDD. Cena je približne 3000₽ za rok.

Môj runner

Pre runner som vzal VDS 4 CPU, 4 GB RAM, 50 GB SSD. Stál ma približne 11000₽ a ani raz som toho neľutoval.
Mám celkovo 7 strojov. 5 na aruba a 2 na ihor.

Takže máme runner. Teraz ho budeme nastavovať.
Prihlásime sa na stroj cez SSH a nainštalujeme java, git, maven, gnupg2.

K obsahu

Nainštalujeme gitlab runner

  • Vytvoríme novú skupinu runner
    sudo groupadd runner
  • Vytvoríme adresár pre cache maven a nastavíme práva skupiny runner
    Tento krok je možné preskočiť, ak neplánujete spúšťať viacero runnerov na jednom stroji.
    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Vytvárame používateľa gitlab-deployer a pridáme do skupiny runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Pridáme do súboru /etc/ssh/sshd_config túto vetu
    AllowUsers root@* gitlab-deployer@127.0.0.1
  • Reštartujeme sshd
    systemctl restart sshd
  • Nastavíme heslo pre používateľa gitlab-deployer (môže byť jednoduché, pretože platí obmedzenie pre localhost)
    passwd gitlab-deployer
  • Nainštalujeme 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
  • Prejdeme na stránku gitlab.com -> deploy-project -> Nastavenia -> CI/CD -> Runners -> Špecifické runneri a skopírujeme registration token

Snímek

Nastavenie GitLab CI na nahrávanie java projektu do maven central.

  • Registrujeme runner
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

Proces

Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Prosím, zadajte URL koordinátora gitlab-ci (napríklad https://gitlab.com/):
https://gitlab.com/
Prosím, zadajte token gitlab-ci pre tento runner:
REGISTRATION_TOKEN
Prosím, zadajte popis gitlab-ci pre tento runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Prosím, zadajte tagy gitlab-ci pre tento runner (oddelené čiarkou):
deply
Registrácia runnera... úspešná                     runner=ZvKdjJhx
Prosím, zadajte executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner bol úspešne registrovaný. Môžete ho spustiť, ale ak už beží, konfigurácia by sa mala automaticky načítať!
  • Kontrolujeme, či je runner registrovaný. Prejdeme na stránku gitlab.com -> deploy-project -> Nastavenia -> CI/CD -> Runners -> Špecifické runneri -> Runners aktivované pre tento projekt

Snímek

Nastavenie GitLab CI na nahrávanie java projektu do maven central.

  • Pridávame samostatný služba /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
  • Spúšťame službu.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Kontrolujeme, či je runner spustený.

Príklad

Nastavenie GitLab CI na nahrávanie java projektu do maven central.

K obsahu

Generovanie GPG kľúčov

  • Z tej istej mašiny sa prihlásime cez ssh ako používateľ gitlab-deployer (to je dôležité pre generovanie GPG kľúča)
    ssh gitlab-deployer@127.0.0.1
  • Generujeme kľúč odpovedajúc na otázky. Použil som svoje vlastné meno a email.
    Nezabudneme uviesť heslo pre kľúč. Týmto kľúčom sa budú podpisovať artefakty.
    gpg --gen-key 
  • Overujeme
    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
  • Nahrávame náš verejný kľúč na server kľúčov
    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: sending key 00000000 to hkp server keys.gnupg.net

K obsahu

Nastavenie Maven

  • Prihlásime sa ako používateľ gitlab-deployer
    su gitlab-deployer 
  • Vytvárame adresár maven repository a prepojujeme s cache (nespomýlť sa)
    Tento krok môžeme preskočiť, ak neplánujete spúšťať niekoľko runnerov na jednej mašine.
    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Vytvárame hlavný kľúč
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Vytvárame súbor ~/.m2/settings-security.xml
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Šifrujeme heslo účtu Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Vytvárame súbor ~/.m2/settings.xml
    env
            
                true
            
            
                GPG_SECRET_KEY_PASSPHRASE
            
        
    
    
        
            sonatype
            SONATYPE_USERNAME
            {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}

kde,
GPG_SECRET_KEY_PASSPHRASE — heslo pre GPG kľúč
SONATYPE_USERNAME — prihlásenie do účtu Sonatype

Týmto je nastavenie bežca dokončené, môžeme prejsť na sekciu GitLab CI

K obsahu

Zdieľaný Runner

Generovanie GPG kľúčov

  • Najprv musíme vytvoriť GPG kľúč. Na to nainštalujeme gnupg.
    yum install -y gnupg
  • Generujeme kľúč a odpovedáme na otázky. Použil som vlastné meno a e-mail. Nezabudnite zadať heslo pre kľúč.
    gpg --gen-key 
  • Zobrazujeme informácie o kľúči
    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]
  • Nahrávame náš verejný kľúč na server kľúčov
    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: odosielanie kľúča 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 na hkp server keys.gnupg.net
  • Získavame súkromný kľúč
    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----
  • Prejdite do nastavení projektu -> Nastavenia -> CI / CD -> Premenné a uložte súkromný kľúč do premennej GPG_SECRET_KEY
    Nastavenie GitLab CI na nahrávanie java projektu do maven central.

K obsahu

Nastavenie Maven

  • Vytvárame hlavný kľúč
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Prejdite do nastavení projektu -> Nastavenia -> CI / CD -> Premenné a uložte do premennej SETTINGS_SECURITY_XML nasledujúce riadky:
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Šifrujeme heslo účtu Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Prejdite do nastavení projektu -> Nastavenia -> CI / CD -> Premenné a uložte do premennej SETTINGS_XML nasledujúce riadky:
    env
            
                true
            
            
                GPG_SECRET_KEY_PASSPHRASE
            
        
    
    
        
            sonatype
            sonatype_username
            {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}

kde,
GPG_SECRET_KEY_PASSPHRASE — heslo pre GPG kľúč
SONATYPE_USERNAME — prihlásenie do účtu Sonatype

K obsahu

Nasadenie docker obrazu

  • Vytvárame dostatočne jednoduchý Dockerfile pre spustenie úloh na nasadzovaní s požadovanou verziou Javy. Nižšie je uvedený príklad pre 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/
  • Skladáme kontajner pre váš projekt
    docker build -t registry.gitlab.com/group/deploy .
  • Autentifikujeme sa a nahráme kontajner do registry.
    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

K obsahu

GitLab CI

Nasadenie projektu

Pridávame do koreňového adresára deploy-projektu súbor .gitlab-ci.yml
V skripte sú predstavené dve vzájomne sa vylučujúce úlohy na nasadenie. Specific Runner alebo Shared Runner podľa potreby.

.gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # Úloha sa vykoná na vašom shell-účastníkovi
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # Úloha sa vykoná na verejnom docker-účastníkovi
  tags:
    - docker
  # Obrázok z časti GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # Importujeme GPG kľúč
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # Ukladáme maven konfiguráciu
    - printf "${SETTINGS_SECURITY_XML}" > ~/\.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/\.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # Úloha sa spustí podľa spúšťacieho signálu, ak je odovzdaná premenná DEPLOY s hodnotou java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # Vypneme klonovanie aktuálneho projektu
    GIT_STRATEGY: none
  script:
    # Umožňujeme uchovanie hesla v nezašifrovanej podobe
    - git config --global credential.helper store
    # Ukladáme dočasné kredity používateľa gitlab-ci-token
    # Token funguje pre všetky verejné projekty gitlab.com a pre projekty skupiny
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/\.git-credentials
    # Úplne čistí aktuálny adresár
    - rm -rf .* *
    # Klonujeme projekt, ktorý budeme nasadzovať do Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # Prepíname sa na požadovaný komit
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Ak aspoň jeden pom.xml obsahuje parameter autoReleaseAfterClose, zrušíme zostavenie.
    # V opačnom prípade hrozí riziko nahrania surových artefaktov do maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "Súbor $pom obsahuje zakázané nastavenie: ";
          exit 1;
        fi;
      done
    # Ak je parameter DEPLOY_CI_COMMIT_TAG prázdny, násilne nastavíme SNAPSHOT-verziu
    - >
      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
    # Spúšťame úlohu na zostavenie a nasadenie artefaktov
    - mvn clean deploy -DskipTests=true

K obsahu

Projekt Java

V java projektoch, ktoré sa predpokladajú nahrať do verejných repozitárov, je potrebné pridať 2 kroky na nahranie Release a Snapshot verzií.

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy



Release:
  extends: .trigger_deploy
  # Spustiť úlohu iba cez tag.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # Spúšťame úlohu na publikovanie SNAPSHOT verzie manuálne
  when: manual
  # Nespúšťať úlohu, ak je nastavený tag.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # Vypíname klonovanie aktuálneho projektu
    GIT_STRATEGY: none
    # Odkaz na trigger nasadzovacej úlohy
    URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
    # Premenné nasadzovacej úlohy
    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:
    # Nepoužívam cURL, pretože s príznakmi --fail --show-error
    # nevytlačí telo odpovede, ak je HTTP kód 400 a vyšší 
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

V tomto riešení som išiel o krok ďalej a rozhodol som sa použiť jeden CI šablón pre java projekty.

Podrobnejšie

Vytvoril som samostatný projekt gitlab-ci v ktorom som umiestnil CI šablónu pre java projekty 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=$SONOR_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

V dôsledku toho vyzerá súbor .gitlab-ci.yml v samotných java projektoch veľmi kompaktne a nie príliš slovne.

.gitlab-ci.yml

include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml

Shields4J:
  extends: .build_java_project

Dokumentácia Sphinx:
  extends: .build_sphinx_doc
  variables:
    DOCKERFILE: .docs/Dockerfile

Sonar recenzia:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

K obsahu

Konfigurácia pom.xml

Toto téma je veľmi podrobne opísaná. Googolplex v Nastavenie Maven pre automatické podpisovanie a nahrávanie artefaktov do snapshot a staging repozitárov., preto opíšem niektoré nuansy používania pluginov. Rovnako opíšem, ako jednoducho a bez námahy je možné ich použiť. nexus-staging-maven-plugin, ak nechcete alebo nemôžete použiť org.sonatype.oss:oss-parent ako rodiča pre svoj projekt.

maven-install-plugin

Inštaluje moduly do lokálneho repozitára.
Veľmi užitočné na lokálne overenie riešení v iných projektoch, ako aj pre kontrolný súčet.

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

K obsahu

maven-javadoc-plugin

Generovanie javadoc pre projekt.

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

Ak máte modul, ktorý neobsahuje java (napríklad iba zdroje),
Alebo ak nechcete v zásade generovať javadoc, potom vám pomôže maven-jar-plugin

org.apache.maven.plugins
  maven-jar-plugin
  
    
      empty-javadoc-jar
      generate-resources
      
        jar
      
      
        javadoc
        ${basedir}/javadoc

K obsahu

maven-gpg-plugin

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

K obsahu

nexus-staging-maven-plugin

Konfigurácia:


  
    
      
      
        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/

Ak máte viacmodulový projekt a nemusíte konkrétny modul nahrávať do repozitára, je potrebné pridať do pom.xml tohto modulu nexus-staging-maven-plugin s príznakom skipNexusStagingDeployMojo

org.sonatype.plugins
      nexus-staging-maven-plugin
      
        true

Po nahratí sú verzie snapshot/release dostupné v staging repozitárov

SonatypeNexus
    https://oss.sonatype.org/content/groups/staging/
    

Ďalšie výhody

  • Veľmi bohatý zoznam cieľov pre prácu s nexus repozitárom (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Automatická kontrola vydania na možnosti nahratia do maven central

K obsahu

Výsledok

Publikovanie SNAPSHOT verzie

Pri zostavovaní projektu existuje možnosť manuálneho spustenia úlohy na nahranie SNAPSHOT verzie do nexus

Nastavenie GitLab CI na nahrávanie java projektu do maven central.

Pri spustení tejto úlohy sa spustí zodpovedajúca úloha v projekte deploy (príklad).

Orezané logy

Spúšťanie s gitlab-runner 11.10.0 (3001a600)
  na Deploy runner JSKWyxUw
Používam Shell executor...
Spúšťam na ih1174328.vds.myihor.ru...
Preskakujem nastavenie Git repozitára
Preskakujem Git checkout
Preskakujem nastavenie Git submodulov
$ 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} .
Klonujem do 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Poznámka: kontrola '850f86aa317194395c5387790da1350e437125a7'.
Nachádzate sa v stave 'odpojená hlava'. Môžete sa poobzerať, robiť experimentálne
zmeny a ukladať ich, a môžete zrušiť akékoľvek úpravy, ktoré vykonáte v tomto
stave bez ovplyvnenia akýchkoľvek vetiev vykonaním ďalšieho checkoutu.
Ak chcete vytvoriť novú vetvu, aby ste si udržali zmeny, môžete
tak spraviť (teraz alebo neskôr) pomocou -b s príkazom checkout znova. Príklad:
  git checkout -b new_branch_name
HEAD je teraz na 850f86a... preskočiť test nasadenia-core
$ for pom in $(find . -name pom.xml); do # zložený viacriadkový príkaz
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # zložený viacriadkový príkaz
[INFO] Skenovanie projektov...
[INFO] Kontrola zostavenia s celkovým počtom 4 modulov...
[INFO] Inštalácia funkcií Nexus Staging:
[INFO]   ... celkovo 4 vykonania maven-deploy-plugin nahradené nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Poradie Reactor Build:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Klient Shields4J                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Vytváranie Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Hľadanie miestneho agregátora...
[INFO] Miestny agregačný koreň: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Spracovanie zmeny org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Spracovanie org.touchbit.shields4j:shields4j-parent
[INFO]     Aktualizácia projektu org.touchbit.shields4j:shields4j-parent
[INFO]         z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO] 
[INFO] Spracovanie org.touchbit.shields4j:client
[INFO]     Aktualizácia nadradeného org.touchbit.shields4j:shields4j-parent
[INFO]         z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO]     Aktualizácia závislosti org.touchbit.shields4j:test-core
[INFO]         z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO] 
[INFO] Spracovanie org.touchbit.shields4j:test-core
[INFO]     Aktualizácia nadradeného org.touchbit.shields4j:shields4j-parent
[INFO]         z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO] 
[INFO] Spracovanie org.touchbit.shields4j:testng
[INFO]     Aktualizácia nadradeného org.touchbit.shields4j:shields4j-parent
[INFO]         z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO]     Aktualizácia závislosti org.touchbit.shields4j:client
[INFO]         z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO]     Aktualizácia závislosti org.touchbit.shields4j:test-core
[INFO]         z verzie 1.0.0 na 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Zhrnutie Reactor:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... ÚSPECH [  0.992 s]
[INFO] test-core .......................................... PRESKOČENÉ
[INFO] Klient Shields4J ................................... PRESKOČENÉ
[INFO] TestNG listener 1.0.0 .............................. PRESKOČENÉ
[INFO] ------------------------------------------------------------------------
[INFO] ZOSTAVENIE ÚSPEŠNÉ
[INFO] ------------------------------------------------------------------------
[INFO] Celkový čas: 2.483 s
[INFO] Dokončené o: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Skenovanie projektov...
[INFO] Kontrola zostavenia s celkovým počtom 4 modulov...
[INFO] Inštalácia funkcií Nexus Staging:
[INFO]   ... celkovo 4 vykonania maven-deploy-plugin nahradené nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Poradie Reactor Build:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Klient Shields4J                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Vytváranie Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
ZMAZANÉ
...
[INFO]  * Hromadné nasadenie miestne zhromaždených snapshot artefaktov skončilo.
[INFO] Diaľkové nasadenie úspešne dokončené.
[INFO] ------------------------------------------------------------------------
[INFO] Zhrnutie Reactor:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... ÚSPECH [  2.375 s]
[INFO] test-core .......................................... ÚSPECH [  3.929 s]
[INFO] Klient Shields4J ................................... ÚSPECH [  3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... ÚSPECH [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] ZOSTAVENIE ÚSPEŠNÉ
[INFO] ------------------------------------------------------------------------
[INFO] Celkový čas: 47.629 s
[INFO] Dokončené o: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Výsledkom je, že do nexus bola načítaná verzia 1.0.0-SNAPSHOT.

Všetky snapshot verzie je možné odstrániť z repozitára na stránke oss.sonatype.org pod svojím účtom.

Nastavenie GitLab CI na nahrávanie java projektu do maven central.

K obsahu

Publikovanie release verzie

Pri inštalácii tagu sa automaticky spustí zodpovedajúca úloha v projekte deploy na nahranie stabilnej verzie do nexus (príklad).

Nastavenie GitLab CI na nahrávanie java projektu do maven central.

Najpríjemnejšie je, že sa automaticky spustí close release v nexus.

[INFO] Prebieha vzdialené staging...
[INFO] 
[INFO]  * Vzdialené staging do profile ID "9043b43f77dcc9"
[INFO]  * Vytvorený staging repozitár s ID "orgtouchbit-1037".
[INFO]  * Staging repozitár na https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Nahrávanie lokálne staged artefaktov do profilu org.touchbit
[INFO]  * Nahrávanie lokálne staged artefaktov dokončené.
[INFO]  * Zatváranie staging repozitára s ID "orgtouchbit-1037".
Čakanie na dokončenie operácie...
.........
[INFO] Vzdialene staged 1 repozitár, skončené úspešne.
[INFO] ------------------------------------------------------------------------
[INFO] Zhrnutie reactor:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... ÚSPECH [  9.603 s]
[INFO] test-core .......................................... ÚSPECH [  3.419 s]
[INFO] Shields4J klient ................................... ÚSPECH [  9.793 s]
[INFO] TestNG listener 1.0.0 .............................. ÚSPECH [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] VÝSTAVBA ÚSPECH
[INFO] ------------------------------------------------------------------------
[INFO] Celkový čas: 01:47 min
[INFO] Dokončené o: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

A ak sa niečo pokazí, úloha sa určite zruší

[INFO] Vykonáva sa vzdialené zscénovanie...
[INFO] 
[INFO]  * Vzdialené zscénovanie do profilu zscénovania ID "9043b43f77dcc9"
[INFO]  * Vytvorený zscénovaný repozitár s ID "orgtouchbit-1038".
[INFO]  * Zscénovaný repozitár na https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Nahrávanie lokálne zscénovaných artefaktov do profilu org.touchbit
[INFO]  * Nahrávanie lokálne zscénovaných artefaktov dokončené.
[INFO]  * Uzatváranie zscénovaného repozitára s ID "orgtouchbit-1038".
Čakanie na dokončenie operácie...
.......
[ERROR] Zlyhanie pravidla pri pokuse o uzatvorenie zscénovaného repozitára s ID "orgtouchbit-1039".
[ERROR] 
[ERROR] Správa o zlyhaní pravidiel zscénovania Nexus
[ERROR] ==================================
[ERROR] 
[ERROR] Zlyhania repozitára "orgtouchbit-1039"
[ERROR]   Zlyhania pravidla "signature-staging"
[ERROR]     * Chýbajúci verejný kľúč: Kľúč s ID: (1f42b618d1cbe1b5) nebolo možné nájsť na http://keys.gnupg.net:11371/. Nahráť svoj verejný kľúč a skúsiť operáciu znova.
...
[ERROR] Čistenie lokálneho adresára zscénovania po zlyhaní pravidla pri uzatváraní zscénovaných repozitárov: [orgtouchbit-1039]
[ERROR]  * Odstraňovanie kontextu 9043b43f77dcc9.properties
[ERROR] Čistenie vzdialených zscénovaných repozitárov po zlyhaní pravidla pri uzatváraní zscénovaných repozitárov: [orgtouchbit-1039]
[ERROR]  * Zrušenie zlyhaného zscénovaného repozitára s ID "orgtouchbit-1039" (Zlyhanie pravidla pri uzatváraní zscénovaných repozitárov: [orgtouchbit-1039]).
[ERROR] Vzdialené zscénovanie skončilo s chybou: Zlyhanie pravidiel zscénovania!
[INFO] ------------------------------------------------------------------------
[INFO] Prehľad reaktora:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... ÚSPECH [  4.073 s]
[INFO] test-core .......................................... ÚSPECH [  2.788 s]
[INFO] Shields4J klient ................................... ÚSPECH [  3.962 s]
[INFO] TestNG poslucháč 1.0.0 .............................. ZLYHANIE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] CHYBA REALIZÁCIE
[INFO] ------------------------------------------------------------------------

Zostáva nám len jedna voľba. Buď odstrániť túto verziu, alebo ju publikovať.

Nastavenie GitLab CI na nahrávanie java projektu do maven central.

Po vydaní, po určitom čase, sa artefakty ocitnú v Nastavenie GitLab CI na nahrávanie java projektu do maven central.

off-topic

Bolo pre mňa prekvapením, že maven indexuje iné verejné repozitáre.
Musel som pridať robots.txt, pretože indexoval môj starý repozitár.

K obsahu

Záver

Čo máme

  • Samostatný deploy-projekt, v ktorom je možné realizovať viacero CI úloh na nahrávanie artefaktov do verejných repozitárov pre rôzne programovacie jazyky.
  • Deploy-projekt je izolovaný od vonkajších zásahov a môže byť menený iba používateľmi s rolou Owner a Maintainer.
  • Samostatný Specific Runner s "horúcou" cache pre spúšťanie len deploy úloh.
  • Publikovanie snapshot/release verzií vo verejnom repozitári.
  • Automatická kontrola release verzie na pripravenosť na publikovanie v maven central.
  • Ochrana pred automatickým publikovaním "nedokončených" verzií v maven central.
  • Zostavenie a publikovanie snapshot verzií "na kliknutie".
  • Jednotný repozitár pre získanie snapshot/release verzií.
  • Celkový proces na zostavenie/testovanie/publikovanie java projektu.

Nastavenie GitLab CI nie je taká zložitá téma, ako sa na prvý pohľad zdá. Stačí párkrát nastaviť CI „na kľúč“ a už nie si len začiatočník v tejto oblasti. A navyše je dokumentácia GitLab veľmi obsiahla. Nebojte sa urobiť prvý krok. Cesta vzniká pod krokmi kráčajúceho (nepamätám si, kto to povedal 🙂 ).

Budem rád za spätnú väzbu.

V ďalšom článku sa podelím o to, ako nastaviť GitLab CI pre paralelné spúšťanie úloh s integračnými testami (s spúšťaním testovaných služieb pomocou docker-compose), pokiaľ máte len jeden shell runner.

K obsahu

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster