GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

See artikkel on suunatud Java arendajatele, kellel on vajadus kiiresti avaldada oma tooteid Sonatype ja/või Maven Central reposse GitLabi abil. Artiklis räägin GitLab Runneri, GitLab CI ja Maven-plugin'i seadistamisest selle ülesande täitmiseks.

Eeltingimused:

  • Mvn ja GPG võtmete turvaline säilitamine.
  • Avalike CI ülesannete turvaline täitmine.
  • Artefaktide (release/snapshot) laadimine avalikesse repo'desse.
  • Release-versioonide automaatne kontrollimine Maven Centralisse avaldamiseks.
  • Üldlahendus artefaktide laadimiseks mitmele projektile reposse.
  • Lihtsus ja kasutusmugavus.

Sisu

Ülevaade

  • Artefaktide avaldamise mehhanismi üksikasjalik kirjeldus Maven Centralisse Sonatype OSS Repository Hosting Service kaudu on juba kajastatud selles artiklis kasutaja Googolplex, seega viitan artiklile vajalikes kohtades.
  • Eelnevalt registreerume Sonatype JIRA ja avame pilet repositori avamiseks (täpsemalt vaata jaotist Loome pileti Sonatype JIRA-s). Pärast repositori avamist kasutatakse JIRA kasutajanime/parooli (edaspidi Sonatype konto) artefaktide üleslaadimiseks Sonatype nexusesse.
  • Edasi on GPG võtme genereerimise protsess kirjeldatud üsna kuivalt. Täpsemalt vaata jaotist GnuPG seadistamine artefaktide allkirjastamiseks
  • Kui kasutad Linuxi konsoli GPG võtme genereerimiseks (gnupg/gnupg2), tuleb paigaldada rng-tools entenete genereerimiseks. Vastasel juhul võib võtme genereerimine kesta väga kaua.
  • Avalike GPG võtmete salvestamisteenused

Sisu juurde

Deploy-projekti seadistamine GitLabis

  • Esiteks tuleb luua ja seadistada projekt, kuhu salvestatakse pipeline artefaktide deploy’imiseks. Minu projekt kannab lihtsalt ja arusaadavalt nime — deploy
  • Pärast repositori loomist tuleb piirata muutmise ligipääsu repositorile.
    Liigume projekti -> Seaded -> Repositoorium -> Kaitstud harud. Eemaldame kõik reeglid ja lisame ainulaadse reegli Wildcard * õigusega push ja merge vaid kasutajatele, kellel on hooldaja roll. See reegel kehtib kõigile kasutajatele nii antud projektis kui ka rühmas, kuhu see projekt kuulub.
    GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse
  • Kui mingeid hooldajaid on mitu, on parim lahendus piirata juurdepääsu projektile üldiselt.
    Liigume projekti -> Seaded -> Üldine -> Nähtavus, projekti omadused, õigused ja seame Projekti nähtavuse väärtuseks Privaatne.
    Minu projekt on avalikult saadaval, kuna kasutan oma GitLabi runner'it ja muudatuste tegemise juurdepääs on vaid minul. Samuti ei ole minu huvides avaldada privaatset teavet avalikes pipeline logides.
  • Repositooriumi muutmise reeglite karmistamine
    Liigume projekti -> Seaded -> Repositoorium -> Push reeglid ja seame lipud Komiteeri piiramine, Kontrolli, kas autor on GitLabi kasutaja. Samuti soovitan seadistada komitee allkirjad, ja seada lige Reject unsigned commits.
  • Seejärel on vaja seadistada ülesande käivitamise päästik
    Liigume projekti -> Seaded -> CI / CD -> Pipeline päästikud ja loome uue trigger-tokeni
    Seda tokeni saab kohe lisada projektigruppide muutujate üldisse konfiguratsiooni.
    Liigume grupisse -> Seaded -> CI / CD -> Muutujad ja lisame muutuja DEPLOY_TOKEN trigger-token väärtusega.

Sisu juurde

GitLabi jooksja

Selles jaotises on kirjas konfiguratsioon ülesannete käivitamiseks deploy jaoks, kasutades isiklikku (Specific) ja avalikku (Shared) runnerit.

Spetsiaalne Runner

Ma kasutan oma runner'eid, sest see on mugav, kiire ja odav.
Runneri jaoks soovitan Linuxi VDS, millel on 1 CPU, 2 GB RAM ja 20 GB HDD. Hinnaks tuleb ~3000 ₽ aastas.

Minu runner

Runneri jaoks valisin VDS, millel on 4 CPU, 4 GB RAM ja 50 GB SSD. See maksis ~11000 ₽ ja ma ei ole kordagi kahetsenud.
Kokku on mul 7 masinat. 5 Aruba's ja 2 Ihoris.

Nii et me oleme saanud runner'i. Nüüd hakkame seda seadistama.
Logime SSH kaudu masinale ja paigaldame java, git, maven, gnupg2.

Sisu juurde

Paigaldame GitLab runner'i

  • Loome uue rühma runner
    sudo groupadd runner
  • Loome direktori maven'i vahemälu jaoks ja anname grupile õigused runner
    Seda punkti võib vahele jätta, kui te ei plaani käivitada mitut runner'it ü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ärgmist rida
    AllowUsers root@* gitlab-deployer@127.0.0.1
  • Taaskäivitame sshd
    systemctl restart sshd
  • Seame kasutajale parooli gitlab-deployer (võib olla lihtne, kuna kohalike kasutajate jaoks on piirangud)
    passwd gitlab-deployer
  • Installime GitLab Runner'i (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
  • Siseneme saidile gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners ja kopeerime registration token'i

Ekraanipilt

GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

  • Registreerime runner'i
    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 koordineerija URL (nt https://gitlab.com/):
https://gitlab.com/
Palun sisestage gitlab-ci token selle runner'i jaoks:
REGISTRATION_TOKEN
Palun sisestage gitlab-ci kirjeldus selle runner'i jaoks:
[ih1174328.vds.myihor.ru]: Deploy Runner
Palun sisestage gitlab-ci sildid selle runner'i jaoks (komaga eraldatud):
deploy
Runner'i registreerimine... õnnestus                     runner=ZvKdjJhx
Palun sisestage täitja: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registreeritud edukalt. Võite selle käivitada, kuid kui see juba töötab, peaks konfiguratsioon automaatselt uuendama!
  • Kontrollime, et jooksja on registreeritud. Liigume saidile gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners, mis on selle projekti jaoks aktiveeritud

Ekraanipilt

GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

  • Lisame erakondlik 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äivitame teenuse.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Kontrollime, et jooksja on käivitatud.

Näide

GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

Sisu juurde

GPG võtmete genereerimine

  • Sama masinaga siseneme ssh kaudu kasutajana gitlab-deployer (see on oluline GPG võtme genereerimiseks)
    ssh gitlab-deployer@127.0.0.1
  • Genereerime võtme, vastates küsimustele. Kasutasin oma nime ja e-posti.
    Oluline on määrata parool võtmele. 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 üles meie avaliku võtme võtme_SERVERile
    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: sending key 00000000 to hkp server keys.gnupg.net

Sisu juurde

Maveni seadistamine

  • Siseneme kasutajana gitlab-deployer
    su gitlab-deployer 
  • Loome maven katalooge repository ja linkime selle vahemäluga (ärge eksige)
    Selle sammu võib vahele jätta, kui te ei kavatse käivitada mitu jooksjat ühel masinal.
    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Loome meistrivõtme
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Loome faili ~/.m2/settings-security.xml
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Krüpteerime Sonatype'i 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'i konto kasutajanimi

Sellega on jooksja seadistamine lõpetatud, edasi liikuda jao juurde GitLab CI

Sisu juurde

Jagatud Runner

GPG võtmete genereerimine

  • Esiteks on vaja luua GPG võti. Selleks installime gnupg.
    yum install -y gnupg
  • Loome võtme, vastates küsimustele. Kasutasin enda nime ja e-posti. Oluline on märkida võtme parool.
    gpg --gen-key 
  • Toome võtme teabe välja
    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 üles meie avaliku võtme võtme_SERVERile
    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: saatmine võti 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 hkp serverisse 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 seadete juurde -> Settings -> CI / CD -> Variables ja salvestame privaatvõtme muutujasse GPG_SECRET_KEY
    GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

Sisu juurde

Maveni seadistamine

  • Loome meistrivõtme
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Liigume projekti seadete juurde -> Settings -> CI / CD -> Variables ja salvestame muutujasse SETTINGS_SECURITY_XML järgmised read:
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Krüpteerime Sonatype'i konto parooli
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Liigume projekti seadete juurde -> Settings -> CI / CD -> Variables 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'i konto kasutajanimi

Sisu juurde

Docker pildi deployment

  • Loome piisavalt lihtne Dockerfile, et käivitada ülesandeid deploy'iga koos vajaliku Java versiooniga. Allpool on esitatud näidis 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 teie projekti jaoks
    docker build -t registry.gitlab.com/group/deploy .
  • Autentiseerime ja laadime konteineri registry'sse.
    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

Sisu juurde

GitLab CI

Projekti deployment

Lisame deploy-projekti juurese faili .gitlab-ci.yml
Skriptis on esitatud kaks vastastikku välistavat ülesannet deploy'iks. Specific Runner või Shared Runner vastavalt.

.gitlab-ci.yml

etapid:
  - juurutamine

Spetsiifiline jooksja:
  extends: .java_deploy_template
  # Ülesanne käivitub teie shell- jooksjal
  tags:
    - juurutamine

Ühiskasutatav jooksja:
  extends: .java_deploy_template
  # Ülesanne käivitub avalikul docker-jooksjal
  tags:
    - docker
  # Pilt jaotises GitLab Runner -> Ühiskasutatav jooksja -> 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: juurutamine
  # Ülesanne käivitub triggereid pidi, kui on edastatud muutuja DEPLOY väärtusega java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # keelame praeguse projekti kloonimise
    GIT_STRATEGY: none
  script:
    # Anname võimaluse salvestada parool avatud kujul
    - git config --global credential.helper store
    # Salvestame ajutised kredentsid kasutajale gitlab-ci-token
    # Token kehtib kõigi avalike projektide jaoks gitlab.com ja grupiprojektide jaoks
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/ .git-credentials
    # Täielikult puhastame praeguse kausta
    - rm -rf .* *
    # Kloonime projekti, mida tahame Sonatype Nexusis juurutada
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # Lülitame vastavale kommitile
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Kui ükski pom.xml fail ei sisalda parameetrit autoReleaseAfterClose, katkestame ehituse.
    # Vastupidisel juhul on oht üles laadida toored artefaktid maven centralsse
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "Fail $pom sisaldab keelatud seadistust: <autoReleaseAfterClose>";
          exit 1;
        fi;
      done
    # Kui parameeter DEPLOY_CI_COMMIT_TAG on tühi, seame sunniviisiliselt 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 ehitamiseks ja juurutamiseks
    - mvn clean deploy -DskipTests=true

Sisu juurde

Java projekt

Java projektides, mis on ette nähtud avalikesse repository'desse laadimiseks, tuleb lisada 2 etappi Release ja Snapshot versioonide laadimiseks.

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy



Release:
  extends: .trigger_deploy
  # Käivitada ülesanne ainult sildi järgi.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # Käivitame ülesande SNAPSHOT versiooni avaldamiseks käsitsi
  when: manual
  # Ärge käivitage ülesannet, kui silt on määratud.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # Lülitame välja käesoleva projekti kloonimise
    GIT_STRATEGY: none
    # Link deploy-ülesande triggerele
    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-i, kuna --fail --show-error lippudega
    # ei väljasta 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.

Üksikasjalikumalt

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

common.yml

etapid:
  - koostamine
  - testimine
  - kontrollimine
  - juurutamine

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

.build_java_project:
  etapp: koostamine
  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: koostamine
  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:
    MODULE: ""
  skript:
    - cd ${MODULE}
    - 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: kontrollimine
  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:
  pikas: .trigger_deploy
  ainult:
    - sildid

.trigger_snapshot_deploy:
  pikas: .trigger_deploy
  kui: käsitsi
  välja arvatud:
    - sildid

Seetõttu näeb .gitlab-ci.yml fail Java projektides üsna kompaktne ja üheselt mõistetav välja.

.gitlab-ci.yml

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

Shields4J:
  extends: .build_java_project

Sphinx doc:
  extends: .build_sphinx_doc
  variables:
    DOCKERFILE: .docs/Dockerfile

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

Sisu juurde

pom.xml konfigureerimine

Seda teemat on väga detailselt käsitletud. Googolplex ühes Maveni seadistamine artefaktide automaatseks allkirjastamiseks ja üleslaadimiseks snapshot- ja staging-repositooriumidesse., seetõttu kirjeldan ma mõningaid pluginate kasutamise nüansse. Kirjeldan ka, kui lihtsalt ja mugavalt saab neid kasutada nexus-staging-maven-plugin, kui te ei soovi ega saa kasutada org.sonatype.oss:oss-parent oma projekti vanemana.

maven-install-plugin

Paigaldab mooduleid kohalikku repositooriumisse.
On väga kasulik kohalike lahenduste kontrollimiseks teistes projektides, samuti ristsummana.

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

Sisu juurde

maven-javadoc-plugin

Projekti jaoks javadoc'i genereerimine.

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 javadoc'i genereerida, on abiks maven-jar-plugin

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

Sisu juurde

maven-gpg-plugin

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

Sisu 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 mudeliga projekt ja te ei soovi teatud mudelit hoidlasse laadida, peate lisama pom.xml failis nexus-staging-maven-plugin lipu skipNexusStagingDeployMojo

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

Pärast laadimist on snapshot/release versioonid saadaval staging hoidlas

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

Veel plusse

  • Väga rikkalik sihtide loetelu nexus hoidla haldamiseks (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Automaatne väljaande kontroll maven central'i üleslaadimise võimaluse osas

Sisu juurde

Tulemus

SNAPSHOT versiooni avaldamine

Projekti koostamisel on võimalik käsitsi käivitada ülesanne SNAPSHOT versiooni laadimiseks nexusisse

GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

Selle ülesande käivitamisel aktiveeritakse vastav ülesanne projekti deploy (an example).

Lühendatud logi

Töötamine gitlab-runner 11.10.0 (3001a600)
  Deploy runner JSKWyxUw peal
Kasutatakse Shell täitjat...
Töötamine ih1174328.vds.myihor.ru...
Skipitud Git'i repositooriumi seadistamine
Skipitud Git'i checkout
Skipitud Git'i alamkoodide 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: kontrollitakse '850f86aa317194395c5387790da1350e437125a7'.
Olete 'detached HEAD' olekus. Saate ringi vaadata, teha eksperimentaalseid
muudatusi ja need salvestada, ning võite katkestada kõik tehtud muudatused
selles olekus, tehes veel ühe checkout'i.
Kui soovite luua uue haru, et säilitada loodud kommid, saate
seda teha (nüüd või hiljem), kasutades -b checkout'i käsu juures uuesti. Näide:
  git checkout -b new_branch_name
HEAD on nüüd 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # kokkuvolditud mitmerealine käsk
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # kokkuvolditud mitmerealine käsk
[INFO] Projektiotsing...
[INFO] Ülevaade koostamisest, kokku 4 moodulit...
[INFO] Nexus Staging funktsioonide installimine:
[INFO]   ... kokku 4 maven-deploy-plugin'i täitmist asendatud nexus-staging-maven-plugin'iga
[INFO] ------------------------------------------------------------------------
[INFO] Reaktori koostamisjärjestus:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J klient                                                   [jar]
[INFO] TestNG kuulaja                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Koostamine Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Otsitakse kohalikku agregaatorijuuri...
[INFO] Kohalik agregatsiooni juur: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Töötlemine org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Töötlemine org.touchbit.shields4j:shields4j-parent
[INFO]     Uuendamine projekti org.touchbit.shields4j:shields4j-parent
[INFO]         versioonist 1.0.0 versioonini 1.0.0-SNAPSHOT
[INFO] 
[INFO] Töötlemine org.touchbit.shields4j:client
[INFO]     Uuendamine vanemast org.touchbit.shields4j:shields4j-parent
[INFO]         versioonist 1.0.0 versioonini 1.0.0-SNAPSHOT
[INFO]     Uuendamine sõltuvusest org.touchbit.shields4j:test-core
[INFO]         versioonist 1.0.0 versioonini 1.0.0-SNAPSHOT
[INFO] 
[INFO] Töötlemine org.touchbit.shields4j:test-core
[INFO]     Uuendamine vanemast org.touchbit.shields4j:shields4j-parent
[INFO]         versioonist 1.0.0 versioonini 1.0.0-SNAPSHOT
[INFO] 
[INFO] Töötlemine org.touchbit.shields4j:testng
[INFO]     Uuendamine vanemast org.touchbit.shields4j:shields4j-parent
[INFO]         versioonist 1.0.0 versioonini 1.0.0-SNAPSHOT
[INFO]     Uuendamine sõltuvusest org.touchbit.shields4j:client
[INFO]         versioonist 1.0.0 versioonini 1.0.0-SNAPSHOT
[INFO]     Uuendamine sõltuvusest org.touchbit.shields4j:test-core
[INFO]         versioonist 1.0.0 versioonini 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reaktori kokkuvõte:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... EDU [  0.992 s]
[INFO] test-core .......................................... JÄETUD
[INFO] Shields4J klient ................................... JÄETUD
[INFO] TestNG kuulaja 1.0.0 .............................. JÄETUD
[INFO] ------------------------------------------------------------------------
[INFO] KOOSTAMINE EDU
[INFO] ------------------------------------------------------------------------
[INFO] Koos kokkuvõttes kulunud aeg: 2.483 s
[INFO] Lõpetatud: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Projektiotsing...
[INFO] Ülevaade koostamisest, kokku 4 moodulit...
[INFO] Nexus Staging funktsioonide installimine:
[INFO]   ... kokku 4 maven-deploy-plugin'i täitmist asendatud nexus-staging-maven-plugin'iga
[INFO] ------------------------------------------------------------------------
[INFO] Reaktori koostamisjärjestus:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J klient                                                   [jar]
[INFO] TestNG kuulaja                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Koostamine Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
KUSTUTATUD
...
[INFO]  * Kohalike kogutud snapshot'i artefaktide suurem osa lõpetatud.
[INFO] Kaugtegevuse lõpetamine õnnestus.
[INFO] ------------------------------------------------------------------------
[INFO] Reaktori 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] KOOSTAMINE EDU
[INFO] ------------------------------------------------------------------------
[INFO] Koos kokkuvõttes kulunud aeg: 47.629 s
[INFO] Lõpetatud: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Nexus's versioon on üles laaditud 1.0.0-SNAPSHOT.

Kõik snapshot versioonid saab eemaldada veebirepositooriumist oss.sonatype.org oma konto all.

GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

Sisu juurde

Release versiooni avaldamine

Sildiga seadistamisel aktiveeritakse automaatselt vastav ülesanne deploying projektis, et laadida versioon üles nexus.an example).

GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

Tore on see, et nexus's toimub automaatne close release.

[INFO] Teostan kaugstagingut...
[INFO] 
[INFO]  * Kaugstaging profiili ID "9043b43f77dcc9".
[INFO]  * Loodud staging repositoorium ID-ga "orgtouchbit-1037".
[INFO]  * Staging repositoorium aadressil https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Kohalikult staadiumisse pandud artefaktide laadimine profiilile org.touchbit
[INFO]  * Kohalikult staadiumisse pandud artefaktide laadimine lõpule viidud.
[INFO]  * Staging repositooriumi sulgemine ID-ga "orgtouchbit-1037".
Ootame, kuni operatsioon on lõppenud...
.........
[INFO] Kaugstaging 1 repositooriumi, lõpetatud eduga.
[INFO] ------------------------------------------------------------------------
[INFO] Reaktori kokkuvõte:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... EDUS [  9.603 s]
[INFO] test-core .......................................... EDUS [  3.419 s]
[INFO] Shields4J kliendi .................................. EDUS [  9.793 s]
[INFO] TestNG kuulaja 1.0.0 .............................. EDUS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] EHITUS EDUS
[INFO] ------------------------------------------------------------------------
[INFO] Kokkuvõtuaeg: 01:47 min
[INFO] Lõpetatud: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

Ja kui midagi läheb valesti, jääb ülesanne kindlasti pooleli.

[INFO] Kaugena kaugelt stseen...
[INFO] 
[INFO]  * Kaugelt stseen profiili ID-ga "9043b43f77dcc9"
[INFO]  * Loodud stseenide hoidla ID-ga "orgtouchbit-1038".
[INFO]  * Stseenide hoidla aadress https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Kohalikult stseenitud artefaktide üleslaadimine profiili org.touchbit
[INFO]  * Kohalikult stseenitud artefaktide üleslaadimine lõpetatud.
[INFO]  * Sulgemine stseenide hoidla ID-ga "orgtouchbit-1038".
Ootab toimingu lõppu...
.......
[ERROR] Reegli ebaõnnestumine, kui prooviti sulgeda stseenide hoidla ID-ga "orgtouchbit-1039".
[ERROR] 
[ERROR] Nexus Stseenireeglite ebaõnnestumise aruanne
[ERROR] ==================================
[ERROR] 
[ERROR] Hoidla "orgtouchbit-1039" ebaõnnestumised
[ERROR]   Reegli "signature-staging" ebaõnnestumised
[ERROR]     * Avaliku võti puudub: Võti ID-ga (1f42b618d1cbe1b5) ei leitud &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. Laadige oma avalik võti üles ja proovige toimingut uuesti.
...
[ERROR] Kohaliku stseeni katalooge koristamine pärast reegli ebaõnnestumist stseenide hoidlate sulgemisel: [orgtouchbit-1039]
[ERROR]  * Kustutamine kontekst 9043b43f77dcc9.properties
[ERROR] Kaugelt stseeni hoidlate koristamine pärast reegli ebaõnnestumist stseenide hoidlate sulgemisel: [orgtouchbit-1039]
[ERROR]  * Ebaõnnestunud stseenide hoidla ID-ga "orgtouchbit-1039" kustutamine (reegli ebaõnnestumine stseenide hoidlate sulgemisel: [orgtouchbit-1039]).
[ERROR] Kaugelt stseen lõppes ebaõnnestumisega: stseenireeglite ebaõnnestumine!
[INFO] ------------------------------------------------------------------------
[INFO] Reaktorite 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 kuulaja 1.0.0 .............................. EBAÕNNESTUMINE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] KODULE OHT
[INFO] ------------------------------------------------------------------------

Meil on jäänud vaid üks valik. Kas eemaldada see versioon või avaldada see.

GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

Pärast väljalaskmist, mõne aja pärast saavad artefaktid olema GitLab CI seadistamine Java projekti laadimiseks Maven Centralisse

offtopic

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

Sisu juurde

Kokkuvõte

Mida me omame

  • Erinev deploy-projekt, kus saab teostada mitu CI ülesannet artefaktide laadimiseks avalikesse hoidlatesse erinevates arenduskeeltes.
  • Deploy-projekt on isoleeritud kõrvaliste sekkumiste eest ja seda saavad muuta ainult kasutajad, kellel on roll Owner ja Maintainer.
  • Eriline Specific Runner „kuuma” vahemälu jaoks, et käivitada ainult deploy ülesandeid.
  • Snapshot / release versioonide avaldamine avalikus hoidlas.
  • Automaatne kontroll release versiooni valmiduse kohta avaldamiseks maven centralis.
  • Kaitse automaatse avaldamise eest „toore” versiooni maven centralis.
  • Snapshot versioonide koostamine ja avaldamine „ühe klõpsuga”.
  • Üks hoidla snapshot / release versioonide hankimiseks.
  • Ühine torustik java projekti koostamiseks / testimiseks / avaldamiseks.

GitLab CI seadistamine ei ole nii keeruline teema, nagu esmapilgul tundub. Piisab paar korda seadistada CI "võtmed kätte" ja oled juba kaugel algajast. Eriti kuna GitLabi dokumentatsioon on väga põhjalik. Ära karda esimest sammu. Tee tee, käies sellel (ei mäleta, kes seda ütles 🙂 ).

Ootan tagasisidet.

Järgmises artiklis räägin, kuidas seadistada GitLab CI konkurentsivõimeliste ülesannete käivitamiseks koos integratsiooni testidega (testitavate teenuste käitamine docker-compose'i abil), kui sul on ainult üks shell runner.

Sisu juurde

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster