GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

See artikkel on mõeldud java arendajatele, kellel on vajadus kiiresti oma tooteid avalikesse sonatype ja/või maven central hoidlasse avaldada GitLabi abil. Selles artiklis räägin gitlab-runneri, gitlab-ci ja maven-plugin'i seadistamisest selle ülesande jaoks.

Eeltingimused:

  • Mvn ja GPG võtmete turvaline säilitamine.
  • Avalike CI ülesannete turvaline täitmine.
  • Aretfaktide (release/snapshot) üleslaadimine avalikesse hoidlatestse.
  • Automaatne release-versioonide kontrollimine maven central'i avaldamiseks.
  • Üksikasjalik lahendus aretfaktide hoidlasse laadimiseks mitme projekti jaoks.
  • Lihtsus ja mugavus.

Sisukord

Üldine teave

  • Avalike aretfaktide avaldamise mehhanismi üksikasjalik kirjeldus Maven Central'i kaudu Sonatype OSS Repository Hosting Service'i on juba kirjeldatud selles artiklis kasutaja poolt Googolplex, seetõttu viitan sobivates kohtades sellele artiklile.
  • Esmalt registreerime end Sonatype JIRA's ja loome pileti hoidla avamiseks (täiendavalt vaata jaotist Loome pileti Sonatype JIRA's). Pärast hoidla avamist kasutatakse JIRA login/parooli (edasi Sonatype konto) aretfaktide laadimiseks Sonatype nexus'esse.
  • Edasi on GPG võtme genereerimise protsess kirjeldatud väga kuivalt. Üksikasjalikumalt vaata jaotist GnuPG seadistamine aretfaktide allkirjastamiseks
  • Kui kasutad Linuxi konsooli GPG võtme genereerimiseks (gnupg/gnupg2), siis pead installima rng-tools entropia genereerimiseks. Vastasel juhul võib võtme genereerimine võtta väga kaua aega.
  • Hoidlate teenused avalike GPG võtmete

Sisukorra juurde

Deploy projekti seadistamine GitLab'is

  • Esmalt on vajalik luua ja seadistada projekt, kuhu salvestatakse pipeline, et aretfakte üles laadida. Minu projekt sai lihtsa ja arusaadava nime — deploy
  • Pärast hoidla loomist on vajalik piirata juurdepääsu hoidla muutmiseks.
    Liigume projekti -> Seaded -> Repositoorium -> Kaitstud harud. Eemaldame kõik reeglid ja lisame ainulaadse reegli wildcard * õigusega push ja merge ainult hooldajate rolliga kasutajatele. See reegel kehtib kõigile kasutajatele, nii antud projekti kui ka projekti kuuluvate gruppide seas.
    GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse
  • Kui hooldajaid on mitu, on parim lahendus piirata ligipääsu projektile üldiselt.
    Liigume projekti -> Seaded -> Üldine -> Nähtavus, projekti omadused, õigused ja seame projekti nähtavuse väärtuseks Privaatne.
    Mul on projekt avalikus juurdepääsuks, kuna kasutan oma GitLabi jooksjat ja muudatuste tegemise juurdepääs on ainult mul. Mulle ei meeldi jagada privaatset teavet avalikes pipeline’i logides.
  • Repositooriumi muutmisreeglite karmistamine
    Liigume projekti -> Seaded -> Repositoorium -> Push reeglid ja seame lipud Komiteeli piirang, Kontrolli, kas autor on GitLabi kasutaja. Soovitan samuti seadistada komiteede allkirjastamine, ja seada lipp Keelata allkirjastamata komiteed.
  • Seejärel on vajalik ülesannete käivitamiseks seada töötlust-trigger.
    Liigume projekti -> Seaded -> CI / CD -> Pipeline’i käivitajad ja loome uue käivitustokeni.
    Seda tokenit saab kohe lisada projektigruppide üldisse konfiguratsiooni muutujaid.
    Liigume gruppi -> Seaded -> CI / CD -> Muutujad ja lisame muutuja DEPLOY_TOKEN käivitustokenina.

Sisukorra juurde

GitLab Runner'i

Selles jaotises on kirjeldatud konfiguratsiooni, et käivitada ülesandeid deploy’l, kasutades oma (Spetsiifiline) ja avalikku (Jagatud) jooksjat.

Spetsiifiline Runner

Kasutame oma jooksjaid, kuna see on kõigepealt mugav, kiire ja odav.
Soovitan jooksjaks linuks VDS-i, millel on 1 CPU, 2 GB RAM, 20 GB HDD. Hinda on umbes 3000₽ aastas.

Minu jooksja

Kasutasin jooksjaks VDS-i, millel on 4 CPU, 4 GB RAM, 50 GB SSD. Maksis umbes 11000₽ ja ma ei kahetse seda kordagi.
Kokku on mul 7 masinat. 5 arubas ja 2 ihoris.

Nii et meil on jooksja. Nüüd hakkame seda seadistama.
Logime masinasse SSH kaudu ja installime java, git, maven, gnupg2.

Sisukorra juurde

Installige gitlab runner

  • Loome uue grupi runner
    sudo groupadd runner
  • Loome mape maven’i vahemälu jaoks ja määrame grupi õigused. runner
    Selle sammu võib vahele jätta, kui plaanite käitada mitu jooksjat ühel masinal.
    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Loome kasutaja gitlab-deployer ja lisame grupi runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Lisame faili /etc/ssh/sshd_config järgmise rea
    AllowUsers root@* gitlab-deployer@127.0.0.1
  • Taaskordame sshd
    systemctl restart sshd
  • Seame kasutajale parooli gitlab-deployer (võib olla lihtne, kuna kehtib piirang localhostile)
    passwd gitlab-deployer
  • Paigaldame GitLab Runneri (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
  • Liigume veebilehe gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners ja kopeerime registreerimise märgendi

Screenshot

GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

  • Registreerime runneri
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

Protsess

Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Palun sisestage gitlab-ci koordinaatori URL (nt https://gitlab.com/):
https://gitlab.com/
Palun sisestage gitlab-ci märgend selle runneri jaoks:
REGISTRATION_TOKEN
Palun sisestage gitlab-ci kirjelduse selle runneri jaoks:
[ih1174328.vds.myihor.ru]: Deploy Runner
Palun sisestage gitlab-ci sildid selle runneri jaoks (koma eraldatud):
deploy
Runneri registreerimine... õnnestus                     runner=ZvKdjJhx
Palun sisestage executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner edukalt registreeritud. Võite seda käivitada, kuid kui see juba töötab, peaks konfigureerimine automaatselt uuenduma!
  • Kontrollime, et runner on registreeritud. Liigume veebilehe gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners activated for this project

Screenshot

GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

  • Lisame erinev teenus /etc/systemd/system/gitlab-deployer.service
    [Unit]
    Description=GitLab Deploy Runner
    After=syslog.target network.target
    ConditionFileIsExecutable=/usr/local/bin/gitlab-runner
    [Service]
    StartLimitInterval=5
    StartLimitBurst=10
    ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer"
    Restart=always
    RestartSec=120
    [Install]
    WantedBy=multi-user.target
  • Käivitatakse teenus.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Kontrollime, et runner on käivitatud.

Näide

GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Sisukorra juurde

GPG võtmete genereerimine

  • Samalt masinal siseneme ssh alla kasutaja all gitlab-deployer (see on oluline GPG võtme genereerimise jaoks)
    ssh gitlab-deployer@127.0.0.1
  • Genereerime võtme, vastates küsimustele. Ma kasutasin enda nime ja e-posti.
    Oluliselt sisestage võtme parool. Selle võtmega allkirjastatakse artefaktid.
    gpg --gen-key 
  • Kontrollime.
    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
  • Laadime meie avaliku võtme võtmete serverisse üles
    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: key 00000000 saatmine hkp serverisse keys.gnupg.net

Sisukorra juurde

Maveni seadistamine

  • Logime sisse kasutaja all gitlab-deployer
    su gitlab-deployer 
  • Loome maven katalooge repository ja linkime tahvli (ärge tehke viga)
    Seda punkti võib vahele jätta, kui te ei kavatse mitu runnerit ühel masinal käivitada.
    mkdir -p ~\/\.m2\/repository
    ln -s \/usr\/cache\/\.m2\/repository \/home\/gitlab-deployer\/\.m2\/repository
  • Loome meistrikood
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci\/mpsur\/73tR2I=}
  • Loome faili ~\/\.m2\/settings-security.xml
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci\/mpsur\/73tR2I=}
  • Krüpteerime Sonatype konto parooli
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G\/kR4R8Z0WBgcDBgi7d12S\/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Loome faili ~\/\.m2\/settings.xml
    env
            
                true
            
            
                GPG_SECRET_KEY_PASSPHRASE
            
        
    
    
        
            sonatype
            SONATYPE_USERNAME
            {98Wv5+u+Tn0HX2z5G\/kR4R8Z0WBgcDBgi7d12S\/un+SCU7uxzaZGGmJ8Cu9pAZ2J}

kus,
GPG_SECRET_KEY_PASSPHRASE — GPG võtme parool
SONATYPE_USERNAME — Sonatype konto kasutajanimi

Sellel on runneri seadistamine lõpetatud, nüüd saame liikuda jaotisse GitLab CI-d

Sisukorra juurde

Ühisrunner

GPG võtmete genereerimine

  • Esiteks tuleb luua GPG võti. Selleks installime gnupg.
    yum install -y gnupg
  • Genereerime võtme, vastates küsimustele. Kasutasin oma nime ja e-posti. Koodi jaoks tuleb kindlasti parool määrata.
    gpg --gen-key 
  • Kuvame teavet võtme kohta
    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]
  • Laadime meie avaliku võtme võtmete serverisse üles
    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net
  • Saame privaatvõtme
    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ\/gQwiKEbyA902DKw\/WSB1AvZQvV\/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----
  • Liigume projekti seadistusse -> Seaded -> CI \/ CD -> Muutujad ja salvestame privaatvõtme muutujasse GPG_SECRET_KEY
    GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Sisukorra juurde

Maveni seadistamine

  • Loome meistrikood
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci\/mpsur\/73tR2I=}
  • Liigume projekti seadistusse -> Seaded -> CI \/ CD -> Muutujad ja salvestame muutujasse SETTINGS_SECURITY_XML järgmised read:
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci\/mpsur\/73tR2I=}
  • Krüpteerime Sonatype konto parooli
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G\/kR4R8Z0WBgcDBgi7d12S\/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Liigume projekti seadistusse -> Seaded -> CI \/ CD -> Muutujad ja salvestame muutujasse SETTINGS_XML järgmised read:
    env
            
                true
            
            
                GPG_SECRET_KEY_PASSPHRASE
            
        
    
    
        
            sonatype
            sonatype_username
            {98Wv5+u+Tn0HX2z5G\/kR4R8Z0WBgcDBgi7d12S\/un+SCU7uxzaZGGmJ8Cu9pAZ2J}

kus,
GPG_SECRET_KEY_PASSPHRASE — GPG võtme parool
SONATYPE_USERNAME — Sonatype konto kasutajanimi

Sisukorra juurde

Docker pildi üleslaadimine

  • Loome piisavalt lihtsa Dockerfile'i, et käivitada ülesandeid seadistamisega vajaliku Java versiooniga. Allpool on näide alpine jaoks.
    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/
  • Kogume konteineri oma projekti jaoks
    docker build -t registry.gitlab.com/group/deploy .
  • Autentifitseerime ja laadime konteineri registrisse.
    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

Sisukorra juurde

GitLab CI-d

Projekti üleslaadimine

Lisame deploy-projekti juurkausta faili .gitlab-ci.yml
Skript sisaldab kahte välistavat ülesannet deploy jaoks. Spetsiifiline Runner või Jagatud Runner vastavalt.

.gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # Ülesanne täidetakse teie shell-runners
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # Ülesanne täidetakse avalikus docker-runners
  tags:
    - docker
  # Pilt sektsioonis GitLab Runner -> Jagatud Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # Impordime GPG võtme
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # Salvestame maven konfiguratsiooni
    - printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # Ülesanne käivitub käivitaja põhjal, kui muutuja DEPLOY on seadistatud java väärtuseks
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # keelame praeguse projekti klooni
    GIT_STRATEGY: none
  script:
    # Anname võimaluse hoida parooli krüpteerimata
    - git config --global credential.helper store
    # Salvestame ajutised kredid kasutaja gitlab-ci-token
    # Token töötab kõikide avalike projektide jaoks gitlab.com ja grupi projektide jaoks
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
    # Täielikult puhastame praeguse katalooge
    - rm -rf .* *
    # Kloonime projekti, mida kavatseme Sonatype Nexus'is deployida
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # Lülitame vajalikule commit'ile
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Kui ükski pom.xml ei sisalda parameetrit autoReleaseAfterClose, jätkame ehitamist.
    # Vastasel juhul on oht üles laadida toores artefakte maven centralsse
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "Fail $pom sisaldab keelatud seadistust: ";
          exit 1;
        fi;
      done
    # Kui parameeter DEPLOY_CI_COMMIT_TAG on tühi, seadistame sundlikult SNAPSHOT-versiooni
    - >
      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
    # Käivitame ülesande artefaktide compileerimiseks ja deployimiseks
    - mvn clean deploy -DskipTests=true

Sisukorra juurde

Java projekt

Java projektides, mis on ette nähtud avalikesse hoidlatestesse laadimiseks, tuleb lisada 2 sammu Release ja Snapshot versioonide laadimiseks.

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy



Release:
  extends: .trigger_deploy
  # Käivita ülesanne ainult sildi põhjal.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # Käivita ülesanne SNAPSHOT versiooni käsitsi avaldamiseks
  when: manual
  # Ära käivita ülesannet, kui silt on määratud.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # Keela praeguse projekti kloonimine
    GIT_STRATEGY: none
    # Link deploy-ülesande trigerile
    URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
    # Deploy-ülesande muutujad
    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:
    # Ei kasuta cURL, kuna lipud --fail --show-error
    # ei prindi vastuse keha, kui HTTP kood on 400 või rohkem
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

Selles lahenduses läksin natuke kaugemale ja otsustasin kasutada ühte CI šablooni Java projektide jaoks.

Rohkem detaile

Loomisin eraldi projekti gitlab-ci , kuhu paigaldasin CI šablooni Java projektide jaoks common.yml.

common.yml

etapid:
  - ehitus
  - testimine
  - kinnitamine
  - juurutamine

muutujad:
  SONAR_ARGS: "
  -Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA} 
  -Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME} 
  "

.build_java_project:
  etapp: ehitus
  sildid:
    - touchbit-shell
  muutujad:
    SKIP_TEST: "vale"
  skript:
    - mvn clean
    - mvn package -DskipTests=${SKIP_TEST}
  artefaktid:
    kui: alati
    aegub: 30 päeva
    teed:
      - "*\/target\/reports"

.build_sphinx_doc:
  etapp: ehitus
  sildid:
    - touchbit-shell
  muutujad:
    DOCKERFILE: .indirect\/docs\/Dockerfile
  skript:
    - docker build --no-cache -t ${CI_PROJECT_NAME}\/doc -f ${DOCKERFILE} .

.junit_module_test_run:
  etapp: testimine
  sildid:
    - touchbit-shell
  muutujad:
    MODUL: ""
  skript:
    - cd ${MODUL}
    - mvn test
  artefaktid:
    kui: alati
    aegub: 30 päeva
    teed:
      - "*\/target\/reports"

.junit_test_run:
  etapp: testimine
  sildid:
    - touchbit-shell
  skript:
    - mvn test
  artefaktid:
    kui: alati
    aegub: 30 päeva
    teed:
    - "*\/target\/reports"

.sonar_review:
  etapp: kinnitamine
  sildid:
    - touchbit-shell
  sõltuvused: []
  skript:
    - >
      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:
  etapp: juurutamine
  sildid:
    - touchbit-shell
  muutujad:
    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}
      "
  skript:
  - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

.trigger_release_deploy:
  pikendub: .trigger_deploy
  ainult:
    - sildid

.trigger_snapshot_deploy:
  pikendub: .trigger_deploy
  millal: käsitsi
  välja arvatud:
    - sildid

Seetõttu näeb .gitlab-ci.yml failide struktuur java projektides üsna kompaktne ja mitte üleliigne välja.

.gitlab-ci.yml

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

Shields4J:
  pikendub: .build_java_project

Sphinx doc:
  pikendub: .build_sphinx_doc
  muutujad:
    DOCKERFILE: .docs\/Dockerfile

Sonar review:
  pikendub: .sonar_review
  sõltuvused:
    - Shields4J

Väljalaskmine:
  pikendub: .trigger_release_deploy

Snapshot:
  pikendub: .trigger_snapshot_deploy

Sisukorra juurde

pom.xml konfiguratsioon

Seda teemat on kirjeldatud väga detailselt. Googolplex ja Maveni seadistamine automaatseks allkirjastamiseks ja artefaktide üleslaadimiseks snapshot- ja staging-repositooriatesse., seetõttu ma kirjeldan mõned nüansid pluginite kasutamisest. Samuti kirjeldan, kuidas on lihtne ja muretult kasutada nexus-staging-maven-plugin, kui te ei soovi või ei saa kasutada org.sonatype.oss:oss-parent oma projekti vanemana.

maven-install-plugin

Paigaldab moodulid kohalikku repositooriumisse.
Äärmiselt kasulik kohalike lahenduste kontrollimiseks teistes projektides ning samuti kontrollsumma.

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

Sisukorra juurde

maven-javadoc-plugin

Javadoc'i genereerimine projekti jaoks.

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

Kui teil on moodul, mis ei sisalda java't (näiteks ainult ressursid)
Või kui te ei soovi üldse javadoc'i genereerida, siis selleks on abi maven-jar-plugin

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

Sisukorra juurde

maven-gpg-plugin

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

Sisukorra juurde

nexus-staging-maven-plugin

Konfiguratsioon:

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/

Kui teil on mitme mooduli projekt ja te ei soovi mingit moodulit hoidlasse üles laadida, peate selle mooduli pom.xml faili lisama nexus-staging-maven-plugin lipuga skipNexusStagingDeployMojo

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

Pärast üleslaadimist on snapshot/release versioonid saadaval staging hoidlates

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

Veel plusse

  • Väga rikkalik eesmärkide nimekiri nexus hoidla päringuteks (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Automaatne rikka kontrollimine, et üles laadida maven keskusesse

Sisukorra juurde

Tulemus

SNAPSHOT versiooni avaldamine

Projekt lähtestamisel on võimalik käsitsi käivitada ülesande, et laadida SNAPSHOT versioon nexusesse

GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

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

Lühendatud logi

Käivitus gitlab-runner 11.10.0 (3001a600)
  Deploy runner JSKWyxUw
Kasutades Shell executori...
Käivitan ih1174328.vds.myihor.ru...
Skip Git reposti seadistamine
Skip Git checkout
Skip Git submodules seadistamine
$ 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} .
Kloonimine 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Märkus: '850f86aa317194395c5387790da1350e437125a7' kontrollimine.
Oled 'detached HEAD' olekus. Sa saad ringi vaadata, teha katsetusi
muudatusi ja neid salvestada, ja sa saad iga salvestatud muudatuse kõrvaldada
ilma, et see mõjutaks mingeid haru, tehes uuesti checkouti.
Kui soovid luua uut haru, et säilitada loodud salvestused, võid
seda teha (nüüd või hiljem) kasutades -b checkout käsu uuesti. Näiteks:
  git checkout -b new_branch_name
HEAD on nüüd 850f86a... vahele jäetud deploy test-core
$ for pom in $(find . -name pom.xml); do # kokkusurutud mitmerealine käsk
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # kokkusurutud mitmerealine käsk
[INFO] Projekti otsimine...
[INFO] Ehitise kontrollimine, kokku 4 moodulit...
[INFO] Nexus Staging funktsioonide installimine:
[INFO]   ... kokku 4 täitmist maven-deploy-plugin asendatud nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor ehitamise järjekord:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J klient                                                   [jar]
[INFO] TestNG kuulaja                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Ehitamine Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Otsin kohalikku ühendama juurt...
[INFO] Kohalik ühendamine juur: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Töötlus org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Töötlus org.touchbit.shields4j:shields4j-parent
[INFO]     Värskendamine projekti org.touchbit.shields4j:shields4j-parent
[INFO]         versioonilt 1.0.0 versioonile 1.0.0-SNAPSHOT
[INFO] 
[INFO] Töötlus org.touchbit.shields4j:client
[INFO]     Värskendamine vanem org.touchbit.shields4j:shields4j-parent
[INFO]         versioonilt 1.0.0 versioonile 1.0.0-SNAPSHOT
[INFO]     Värskendamine sõltuvust org.touchbit.shields4j:test-core
[INFO]         versioonilt 1.0.0 versioonile 1.0.0-SNAPSHOT
[INFO] 
[INFO] Töötlus org.touchbit.shields4j:test-core
[INFO]     Värskendamine vanem org.touchbit.shields4j:shields4j-parent
[INFO]         versioonilt 1.0.0 versioonile 1.0.0-SNAPSHOT
[INFO] 
[INFO] Töötlus org.touchbit.shields4j:testng
[INFO]     Värskendamine vanem org.touchbit.shields4j:shields4j-parent
[INFO]         versioonilt 1.0.0 versioonile 1.0.0-SNAPSHOT
[INFO]     Värskendamine sõltuvust org.touchbit.shields4j:client
[INFO]         versioonilt 1.0.0 versioonile 1.0.0-SNAPSHOT
[INFO]     Värskendamine sõltuvust org.touchbit.shields4j:test-core
[INFO]         versioonilt 1.0.0 versioonile 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor kokkuvõte:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... EDU [  0.992 s]
[INFO] test-core .......................................... VAHELEJÄETUD
[INFO] Shields4J klient ................................... VAHELEJÄETUD
[INFO] TestNG kuulaja 1.0.0 .............................. VAHELEJÄETUD
[INFO] ------------------------------------------------------------------------
[INFO] EHITUS EDU
[INFO] ------------------------------------------------------------------------
[INFO] Kogu aeg: 2.483 s
[INFO] Lõpetatud: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Projekti otsimine...
[INFO] Ehitise kontrollimine, kokku 4 moodulit...
[INFO] Nexus Staging funktsioonide installimine:
[INFO]   ... kokku 4 täitmist maven-deploy-plugin asendatud nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor ehitamise järjekord:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J klient                                                   [jar]
[INFO] TestNG kuulaja                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Ehitamine Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
KUSTUTATUD
...
[INFO]  * Kohalikult kogutud snapshot artefaktide suurdeployimine lõpetatud.
[INFO] Kaugdeploeerimine lõpetatud edukalt.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor kokkuvõte:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... EDU [  2.375 s]
[INFO] test-core .......................................... EDU [  3.929 s]
[INFO] Shields4J klient ................................... EDU [  3.815 s]
[INFO] TestNG kuulaja 1.0.0-SNAPSHOT ..................... EDU [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] EHITUS EDU
[INFO] ------------------------------------------------------------------------
[INFO] Kogu aeg: 47.629 s
[INFO] Lõpetanud: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Seetõttu on nexus laaditud versioon 1.0.0-SNAPSHOT.

Kõik snapshot versioonid saab veebilehelt kustutada oss.sonatype.org oma kontoga.

GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Sisukorra juurde

Release versiooni avaldamine

Sildi seadmisel käivitub automaatselt vastav ülesanne projektis deploy, et laadida väljaandmist nexusesse (näide).

GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Kõige toredam on see, et nexus sulgeb väljaande automaatselt.

[INFO] Teostamine kaugstaging...
[INFO] 
[INFO]  * Kaugstaging profiili ID "9043b43f77dcc9"
[INFO]  * Loob staging repository ID "orgtouchbit-1037".
[INFO]  * Staging repository aadressil https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Laadimine kohapeal stseeritud artefaktidest profiilile org.touchbit
[INFO]  * Kohapeal stseeritud artefaktide laadimine on lõppenud.
[INFO]  * Staging repository sulgemine ID "orgtouchbit-1037".
Ootamine operatsiooni lõpetamiseks...
.........
[INFO] Kaugstaging 1 repository, lõpetatud eduga.
[INFO] ------------------------------------------------------------------------
[INFO] Reaktori kokkuvõte:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... EDU [  9.603 s]
[INFO] test-core .......................................... EDU [  3.419 s]
[INFO] Shields4J klient ................................... EDU [  9.793 s]
[INFO] TestNG kuulaja 1.0.0 .............................. EDU [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] EHITUS EDU
[INFO] ------------------------------------------------------------------------
[INFO] Koguaeg: 01:47 min
[INFO] Lõpetatud: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

Ja kui midagi läheb valesti, siis ülesanne kukub kindlasti läbi

[INFO] Kaugtöötlemine...
[INFO] 
[INFO]  * Kaugtöötlemine stseeni profiili ID "9043b43f77dcc9" rakendamine
[INFO]  * Loodud stseeni hoidlaga ID "orgtouchbit-1038".
[INFO]  * Stseeni hoidla https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Kohalikult stseeni artefaktide üleslaadimine profiilile org.touchbit
[INFO]  * Kohalikult stseeni artefaktide üleslaadimine lõpetatud.
[INFO]  * Stseeni hoidla ID "orgtouchbit-1038" sulgemine.
Ootab toimingu lõpetamist...
.......
[ERROR] Reegli rikkumine stseeni hoidla ID "orgtouchbit-1039" sulgemisel.
[ERROR] 
[ERROR] Nexus Stseeni Reegli Rikkumise Raport
[ERROR] ==================================
[ERROR] 
[ERROR] Hoidla "orgtouchbit-1039" rikkumised
[ERROR]   Reegli "signature-staging" rikkumised
[ERROR]     * Avalik võti puudub: Võti ID-ga: (1f42b618d1cbe1b5) ei saa leida <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. Laadige üles oma avalik võti ja proovige toimingut uuesti.
...
[ERROR] Kohaliku stseeni katalooge puhastamine pärast reegli rikkumist stseeni hoidlate sulgemisel: [orgtouchbit-1039]
[ERROR]  * Konteksti kustutamine 9043b43f77dcc9.properties
[ERROR] Kaugtöötlemise hoidlate puhastamine pärast reegli rikkumist stseeni hoidlate sulgemisel: [orgtouchbit-1039]
[ERROR]  * Ebaõnnestunud stseeni hoidla ID-ga "orgtouchbit-1039" kõrvaldamine (Reegli rikkumine stseeni hoidlate sulgemisel: [orgtouchbit-1039]).
[ERROR] Kaugtöötlemine lõppes ebaõnnestumisega: Stseeni reegli rikkumine!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor kokkuvõte:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... EDU [  4.073 s]
[INFO] test-core .......................................... EDU [  2.788 s]
[INFO] Shields4J klient ................................... EDU [  3.962 s]
[INFO] TestNG listener 1.0.0 .............................. EBAÕNNESTUMINE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] EHITUSE EBAÕNNESTUMINE
[INFO] ------------------------------------------------------------------------

Meil on nüüd alles üks valik. Kas eemaldada see versioon või avaldada see.

GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

Pärast väljaandmist, mõne aja pärast, on artefaktid olemas GitLab CI seadistamine Java projekti üleslaadimiseks Maven Centralisse

off-topic

Minu jaoks oli üllatus, et Maven indekseerib teisi avalikke hoidlaid.
Pidin lisama robots.txt, kuna ta indekseeris mu vana hoidla.

Sisukorra juurde

Kokkuvõte

Mida me nüüd omame

  • Eraldi deploy-projekt, kus saab rakendada mitmeid CI ülesandeid artefaktide üleslaadimiseks avalikesse hoidlatesse erinevatele arenduskeeledele.
  • Deploy-projekt on isoleeritud välisest sekkumisest ja seda saavad muuta ainult kasutajad, kellel on roll Owner ja Maintainer.
  • Eraldi Specific Runner kuuma vahemäluga, et käivitada ainult deploy-ülesandeid.
  • Snapshot/release versioonide avaldamine avalikus hoidlas.
  • Automaatne kontroll release versiooni valmiduse osas avaldamiseks maven centralis.
  • Kaitse automaatse avaldamise eest "toore" versioonide osas maven centralis.
  • Snapshot versioonide kogumine ja avaldamine "ühe klikiga".
  • Üks hoidla snapshot/release versioonide saamiseks.
  • Üldine torujuhe java projekti koostamiseks/testimiseks/avalikustamiseks.

GitLab CI seadistamine ei ole nii keeruline teema, nagu esmapilgul näib. Piisab, kui paar korda seadistada CI "võtmed kätte" ja oled juba kaugel mitteprofessionaalist. Eriti kuna GitLabi dokumentatsioon on üsna ulatuslik. Ära karda esimest sammu. Tee ilmub astujate all (ei mäleta, kes selle ütles 🙂 ).

Ootan tagasisidet.

Järgmises artiklis räägin, kuidas seadistada GitLab CI ülesannete konkurentsi käivitamiseks integratsioonitestidega (katsetatavate teenuste käivitamine docker-compose abil), kui sul on ainult üks shell-runner.

Sisukorra juurde

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster