Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

Ky artikull është i destinuar për zhvilluesit java, të cilët kanë nevojë të publikojnë shpejt produktet e tyre në depozitë sonatype dhe/ose Maven Central duke përdorur GitLab. Në këtë artikull do të flas për konfigurimin e gitlab-runner, gitlab-ci dhe maven-plugin për zgjidhjen e këtij problemi.

Parakushtet:

  • Ruajtja e sigurt e mvn dhe çelĂ«save GPG.
  • Kryerja e sigurt e detyrave publike tĂ« CI.
  • Ngarkimi i artefakteve (release/snapshot) nĂ« depozita publike.
  • Kontrolli automatike i versioneve release pĂ«r publikim nĂ« Maven Central.
  • NjĂ« zgjidhje e pĂ«rgjithshme pĂ«r ngarkimin e artefakteve nĂ« depozitĂ« pĂ«r disa projekte.
  • ThjeshtĂ«sia dhe lehtĂ«sia e pĂ«rdorimit.

Përmbajtja

Informacion i përgjithshëm

  • PĂ«r njĂ« pĂ«rshkrim tĂ« detajuar tĂ« mekanizmit tĂ« publikimit tĂ« artefakteve nĂ« Maven Central pĂ«rmes ShĂ«rbimit tĂ« Hosting tĂ« Depozitave OSS tĂ« Sonatype Ă«shtĂ« pĂ«rshkruar tashmĂ« nĂ« kĂ«to artikull pĂ«rdoruesit Googolplex, kĂ«shtu qĂ« nĂ« vendet e nevojshme do tĂ« referohem nĂ« kĂ«tĂ« artikull.
  • Para se tĂ« regjistrohemi nĂ« Sonatype JIRA dhe tĂ« hapim njĂ« tiket pĂ«r krijimin e depozitĂ«s (lexoni seksionin pĂ«r mĂ« shumĂ« detaje KrijojmĂ« njĂ« tiket nĂ« Sonatype JIRA). Pasi tĂ« hapet depozita, çifti login/fjalĂ«kalim nga JIRA (mĂ« pas llogaria Sonatype) do tĂ« pĂ«rdoret pĂ«r ngarkimin e artefakteve nĂ« Sonatype nexus.
  • MĂ« tej, procesi i gjenerimit tĂ« çelĂ«sit GPG Ă«shtĂ« pĂ«rshkruar nĂ« njĂ« mĂ«nyrĂ« shumĂ« tĂ« thjeshtĂ«. Shihni seksionin pĂ«r mĂ« shumĂ« detaje Konfigurimi i GnuPG pĂ«r nĂ«nshkrimin e artefakteve
  • NĂ«se pĂ«rdorni konsolĂ«n Linux pĂ«r tĂ« gjeneruar çelĂ«sin GPG (gnupg/gnupg2), duhet tĂ« instaloni rng-tools pĂ«r tĂ« gjeneruar entropinĂ«. NĂ« tĂ« kundĂ«rt, gjenerimi i çelĂ«sit mund tĂ« zgjasĂ« shumĂ«.
  • ShĂ«rbimet e ruajtjes publike tĂ« çelĂ«save GPG

Përmbajtja

Konfigurimi i projektit deploy në GitLab

  • SĂ« pari, duhet tĂ« krijoni dhe konfiguroni njĂ« projekt, nĂ« tĂ« cilin do tĂ« ruhet pipeline pĂ«r deployimin e artefakteve. Projekti im u quajt nĂ« mĂ«nyrĂ« tĂ« thjeshtĂ« — deploy
  • Pas krijimit tĂ« depozitĂ«s, duhet tĂ« kufizoni aksesin pĂ«r tĂ« bĂ«rĂ« ndryshime nĂ« depozit.
    Shkoni në projekt -> Cilësimet -> Depoja -> Degë të Mbrojtura. Fshini të gjitha rregullat dhe shtoni një rregull të vetëm me Wildcard * me të drejtë për të bërë push dhe merge vetëm për përdoruesit me rol Maintainers. Ky rregull do të funksionojë për të gjithë përdoruesit e këtij projekti, si dhe për grupin në të cilin ky projekt hyn.
    Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central
  • NĂ«se ka disa mmaintainers, zgjidhja mĂ« e mirĂ« do tĂ« ishte tĂ« kufizoni qasjen nĂ« projekt nĂ« pĂ«rgjithĂ«si.
    Shkoni në projekt -> Cilësimet -> Përgjithshme -> Dallueshmëria, karakteristikat e projektit, lejet dhe vendosni theksin e projektit në vlerën Privat.
    Unë kam një projekt në qasje publike, pasi përdor GitLab Runner tim personal dhe vetëm unë kam qasje për të bërë ndryshime në depo. Në fund të fundit, nuk është në interesin tim të ekspozoj informacionin privat në log-et e pipeline-ve publike.
  • TĂ« ashpĂ«rsojmĂ« rregullat pĂ«r ndryshimin e depozitĂ«s
    Shkoni në projekt -> Cilësimet -> Depoja -> Rregullat e Dërgesës dhe vendosni flamujt e kufizimit të Komituesit, Kontrolloni nëse autori është një përdorues i GitLab. Gjithashtu rekomandoj të konfigurojmë nënshkrimin e komiteteve, dhe vendosni flamurin Refuzoni komitetet e pa nënshkruar.
  • MĂ« pas, Ă«shtĂ« e nevojshme tĂ« konfiguroni njĂ« trigger pĂ«r tĂ« nisur detyra
    Shkoni në projekt -> Cilësimet -> CI / CD -> Triggers pipeline dhe krijoni një token të ri trigger.
    Ky kyç mund të shtohet menjëherë në konfigurimin e përgjithshëm të variablave për grupin e projekteve.
    Shkoni në grupin -> Cilësimet -> CI / CD -> Variablat dhe shtoni variablën DEPLOY_TOKEN me trigger-token në vlerën e tij.

Përmbajtja

GitLab Runner

Në këtë seksion përshkruhet konfigurimi për ekzekutimin e detyrave në deploy duke përdorur ranerë të vetëquajtur (Specific) dhe publikë (Shared).

Rera Specifike

Une përdor ranerë të vetëquajtur, pasi kjo është e përshtatshme, e shpejtë dhe e lirë.
PĂ«r raner rekomandoj njĂ« VDS Linux me 1 CPU, 2 GB RAM, 20 GB HDD. Çmimi i çështjes Ă«shtĂ« ~3000ₜ nĂ« vit.

Raneri im

PĂ«r raner kam marrĂ« njĂ« VDS me 4 CPU, 4 GB RAM, 50 GB SSD. MĂ« kushtoi ~11000ₜ dhe nuk kam patur asnjĂ«herĂ« pendime.
Kam gjithsej 7 makineri. 5 në aruba dhe 2 në ihor.

Pra, tani kemi ranerin. Tani do ta konfigurojmë.
Hyni në makinë përmes SSH dhe instaloni java, git, maven, gnupg2.

Përmbajtja

Instaloni gitlab runner

  • Krijoni njĂ« grup tĂ« ri runner
    sudo groupadd runner
  • Krijoni njĂ« direktor pĂ«r cache-in e maven dhe caktoni tĂ« drejtat pĂ«r grupin runner
    Ky hap mund të anashkalohet nëse nuk planifikoni të ekzekutoni disa ranerë në një makinë.
    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Krijoni njĂ« pĂ«rdorues gitlab-deployer dhe shtoni nĂ« grup runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • ShtojmĂ« nĂ« skedarin /etc/ssh/sshd_config rreshtin e mĂ«poshtĂ«m
    AllowUsers root@* gitlab-deployer@127.0.0.1
  • Rindizim sshd
    systemctl restart sshd
  • Vendosim fjalĂ«kalimin pĂ«r pĂ«rdoruesin gitlab-deployer (mund tĂ« jetĂ« i thjeshtĂ«, pasi ka kufizim pĂ«r localhost)
    passwd gitlab-deployer
  • Po instalojmĂ« 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
  • Shkonte nĂ« faqen gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners dhe kopjojmĂ« tokenin e regjistrimit

Screenshot

Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

  • RegjistrojmĂ« runnerin
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

Procesi

Platforma e runtime arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Duke punuar në modin sistemik.
Ju lutem jepni URL-në e koordinatori gitlab-ci (p.sh. https://gitlab.com/):
https://gitlab.com/
Ju lutem jepni tokenin gitlab-ci për këtë runner:
REGISTRATION_TOKEN
Ju lutem jepni përshkrimin gitlab-ci për këtë runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Ju lutem jepni etiketat gitlab-ci për këtë runner (të ndara me vírgula):
deploy
Duke regjistruar runner... suksesi                     runner=ZvKdjJhx
Ju lutem jepni executor-in: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner regjistruar me sukses. Ndihuni të filloni, por nëse është duke u ekzekutuar tashmë, konfigurimi duhet të rregullohet automatikisht!
  • KontrollojmĂ« nĂ«se runneri Ă«shtĂ« regjistruar. ShkojmĂ« nĂ« faqen gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners aktiv qĂ« janĂ« pĂ«r kĂ«tĂ« projekt

Screenshot

Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

  • ShtojmĂ« i veçantĂ« shĂ«rbim /etc/systemd/system/gitlab-deployer.service
    [Unit]
    Përshkrimi=GitLab Deploy Runner
    Pas=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"
    Rikthe=always
    RestartSec=120
    [Install]
    WantedBy=multi-user.target
  • Po fillojmĂ« shĂ«rbimin.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • KontrollojmĂ« nĂ«se runneri Ă«shtĂ« nisur.

Shembuj

Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

Përmbajtja

Generimi i çelësave GPG

  • Nga kjo makinĂ«, hyjmĂ« pĂ«rmes ssh si pĂ«rdorues gitlab-deployer (kjo Ă«shtĂ« e rĂ«ndĂ«sishme pĂ«r gjenerimin e çelĂ«sit GPG)
    ssh gitlab-deployer@127.0.0.1
  • GjenerojmĂ« çelĂ«sin duke iu pĂ«rgjigjur pyetjeve. UnĂ« pĂ«rdora emrin dhe e-mailin e mia.
    Sigurohuni të jepni një fjalëkalim për çelësin. Ky çelës do të përdoret për të nënshkruar artefaktet.
    gpg --gen-key 
  • KontrollojmĂ«
    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
  • NgarkojmĂ« çelĂ«sin tonĂ« publik nĂ« serverin e çelĂ«save
    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: duke dërguar çelësin 00000000 në serverin hkp keys.gnupg.net

Përmbajtja

Konfigurimi i Maven

  • HyjmĂ« si pĂ«rdorues gitlab-deployer
    su gitlab-deployer 
  • KrijojmĂ« drejtorinĂ« maven repository dhe lidhim me cache (mos gaboni)
    Ky pikë mund të anashkalohet nëse nuk planifikoni të nisni disa runner-a në të njëjtën makinë.
    mkdir -p ~/ .m2 /repository
    ln -s /usr/cache/ .m2 /repository /home/gitlab-deployer / .m2 /repository
  • KrijojmĂ« çelĂ«sin master
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci /mpsur /73tR2I=}
  • KrijojmĂ« skedarin ~/ .m2 /settings-security.xml
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci /mpsur /73tR2I=}
  • Kriptimi i fjalĂ«kalimit tĂ« llogarisĂ« Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • KrijojmĂ« skedarin ~/ .m2 /settings.xml
    env
            
                true
            
            
                GPG_SECRET_KEY_PASSPHRASE
            
        
    
    
        
            sonatype
            SONATYPE_USERNAME
            {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}

ku,
GPG_SECRET_KEY_PASSPHRASE — fjalĂ«kalimi i çelĂ«sit GPG
SONATYPE_USERNAME — emri i pĂ«rdoruesit tĂ« llogarisĂ« sonatype

Me këtë përfundon konfigurimi i runner-it, mund të kaloni në seksionin GitLab CI

Përmbajtja

Runner i Ndajshëm

Generimi i çelësave GPG

  • NĂ« radhĂ« tĂ« parĂ« nevojitet krijimi i çelĂ«sit GPG. PĂ«r kĂ«tĂ« instaloni gnupg.
    yum install -y gnupg
  • Krijohet çelĂ«si duke u pĂ«rgjigjur nĂ« pyetje. UnĂ« kam pĂ«rdorur emrin dhe email-in tim. Sigurohuni tĂ« vendosni njĂ« fjalĂ«kalim pĂ«r çelĂ«sin.
    gpg --gen-key 
  • CaktojmĂ« informacionin nĂ« lidhje me çelĂ«sin
    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expiron: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp 
    sub   rsa3072 2019-04-24 [E] [expiron: askush]
  • NgarkojmĂ« çelĂ«sin tonĂ« publik nĂ« serverin e çelĂ«save
    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: duke dërguar çelësin 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 në serverin hkp keys.gnupg.net
  • Marrim çelĂ«sin privat
    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----
  • Shkoni nĂ« cilĂ«simet e projektit -> Settings -> CI / CD -> Variables dhe ruani çelĂ«sin privat nĂ« variabĂ«l GPG_SECRET_KEY
    Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

Përmbajtja

Konfigurimi i Maven

  • KrijojmĂ« çelĂ«sin master
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci /mpsur /73tR2I=}
  • Shkoni nĂ« cilĂ«simet e projektit -> Settings -> CI / CD -> Variables dhe ruani nĂ« variabĂ«l SETTINGS_SECURITY_XML rreshtat e mĂ«poshtĂ«m:
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci /mpsur /73tR2I=}
  • Kriptimi i fjalĂ«kalimit tĂ« llogarisĂ« Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Shkoni nĂ« cilĂ«simet e projektit -> Settings -> CI / CD -> Variables dhe ruani nĂ« variabĂ«l SETTINGS_XML rreshtat e mĂ«poshtĂ«m:
    env
            
                true
            
            
                GPG_SECRET_KEY_PASSPHRASE
            
        
    
    
        
            sonatype
            sonatype_username
            {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}

ku,
GPG_SECRET_KEY_PASSPHRASE — fjalĂ«kalimi i çelĂ«sit GPG
SONATYPE_USERNAME — emri i pĂ«rdoruesit tĂ« llogarisĂ« sonatype

Përmbajtja

Deploy imazhi docker

  • KrijojmĂ« njĂ« Dockerfile mjaft tĂ« thjeshtĂ« pĂ«r tĂ« ekzekutuar detyra pĂ«r deploy me versionin e duhuruar tĂ« Java. MĂ« poshtĂ« Ă«shtĂ« njĂ« shembull pĂ«r 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/
  • NdĂ«rtojmĂ« kontejnerin pĂ«r projektin tuaj
    docker build -t registry.gitlab.com/group/deploy .
  • Autentifikohuni dhe ngarkoni kontejnerin nĂ« registry.
    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

Përmbajtja

GitLab CI

Deploy projektin

Shtoni në rrënjën e projektit të deploy-it skedarin .gitlab-ci.yml
Në skript janë paraqitur dy detyra për deploy që përjashtojnë njëra-tjetrën. Specific Runner ose Shared Runner përkatësisht.

.gitlab-ci.yml

stage:
  - deploy

Përgjegjës i veçantë:
  extends: .java_deploy_template
  # Detyra do të ekzekutohet në runnerri tuaj shell
  tags:
    - deploy

Përgjegjës i përbashkët:
  extends: .java_deploy_template
  # Detyra do të ekzekutohet në docker-in e publikuar
  tags:
    - docker
  # Imazhi nga seksioni GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # Importojmë çelësin GPG
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # Ruajmë konfigurimin e maven
    - printf "${SETTINGS_SECURITY_XML}" > ~/\.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/\.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # Detyra do të aktivizohet me trigger-in, nëse kalon variablin DEPLOY me vlerë java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # ÇaktivizojmĂ« klonimin e projektit aktual
    GIT_STRATEGY: none
  script:
    # Ofron mundësinë për ruajtjen e fjalëkalimit në format të paenkriptuar
    - git config --global credential.helper store
    # Ruajmë kredencialet e përkohshme të përdoruesit gitlab-ci-token
    # Tokeni funksionon për të gjitha projektet publike gitlab.com dhe për projektet e grupit
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/\.git-credentials
    # Pastroni krejtësisht direktorinë aktuale
    - rm -rf .* *
    # Kloni projektin që do të deplojmë në Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # Kalojmë në komitin e duhur
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Nëse ndonjë pom.xml përmban parametrin autoReleaseAfterClose, ndalim ndërtimin.
    # Në të kundërt, ka rrezik të ngarkojmë artefakte të papërfunduara në maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "File $pom përmban cilësimin e ndaluar: ";
          exit 1;
        fi;
      done
    # Nëse parametri DEPLOY_CI_COMMIT_TAG është bosh, atëherë me këmbëngulje vendosim versionin SNAPSHOT
    - >
      if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
        mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
      else
        VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
        if [[ "${VERSION}" == *-SNAPSHOT ]]; then
          mvn versions:set -DnewVersion=${VERSION}
        else
          mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
        fi
      fi
    # Ekzekutojmë detyrën për ndërtimin dhe depërtimin e artefakteve
    - mvn clean deploy -DskipTests=true

Përmbajtja

Projekti Java

Në projektet java që pritet të ngarkohen në depo publike, është e nevojshme të shtohen 2 hapa për ngarkimin e versioneve Release dhe Snapshot.

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy



Release:
  extends: .trigger_deploy
  # Ekzekutoni detyrën vetëm për etiketën.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # Ekzekutojmë detyrën për publikimin e versionit SNAPSHOT manualisht
  when: manual
  # Mos e ekzekutoni detyrën, nëse është vendosur një etiketë.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # ÇaktivizojmĂ« klonimin e projektit aktual
    GIT_STRATEGY: none
    # Linku për trigger-in e detyrës së deploy
    URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
    # Variablat e detyrës së deploy
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
    # Nuk përdor cURL, pasi me flagjet --fail --show-error
    # nuk shfaq pjesën e përgjigjes, nëse kodi HTTP është 400 e më lart
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

Në këtë zgjidhje, kam shkuar pak më tej dhe kam vendosur të përdor një model CI për projektet java.

Më në detaje

Krijova një projekt të veçantë gitlab-ci ku vendosa modelin CI për projektet java common.yml.

common.yml

stages:
  - ndërtim
  - testim
  - verifikim
  - shpërndarje

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

.build_java_project:
  stage: ndërtim
  tags:
    - touchbit-shell
  variables:
    SKIP_TEST: "false"
  script:
    - mvn clean
    - mvn package -DskipTests=${SKIP_TEST}
  artifacts:
    when: always
    expire_in: 30 ditë
    paths:
      - "*/target/reports"

.build_sphinx_doc:
  stage: ndërtim
  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: testim
  tags:
    - touchbit-shell
  variables:
    MODULE: ""
  script:
    - cd ${MODULE}
    - mvn test
  artifacts:
    when: always
    expire_in: 30 ditë
    paths:
      - "*/target/reports"

.junit_test_run:
  stage: testim
  tags:
    - touchbit-shell
  script:
    - mvn test
  artifacts:
    when: always
    expire_in: 30 ditë
    paths:
    - "*/target/reports"

.sonar_review:
  stage: verifikim
  tags:
    - touchbit-shell
  dependencies: []
  script:
    - >
      if [ "$CI_BUILD_REF_NAME" == "master" ]; then
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
      else
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
      fi

.trigger_deploy:
  stage: shpërndarje
  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

Si rezultati, skedarët .gitlab-ci.yml në projektet java duken shumë kompakti dhe jo të drejta.

.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

Përmbajtja

Konfigurimi i pom.xml

Kjo temë është përshkruar shumë detajisht. Googolplex në Konfigurimi i Maven për nënshkrimin automatik dhe ngarkimin e artefakteve në depozitë snapshot dhe staging., prandaj do të përshkruaj disa nuanca në përdorimin e plugins. Po ashtu, do të përshkruaj se sa lehtë dhe pa ndjenja mund ta përdorni. nexus-staging-maven-plugin, nëse nuk dëshironi ose nuk mund të përdorni org.sonatype.oss:oss-parent si prind për projektin tuaj.

maven-install-plugin

Installon modulet në depozitën lokale.
Shumë e dobishme për verifikimin lokal të zgjidhjeve në projekte të tjera, si dhe për kontrollin e integritetit.

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

Përmbajtja

maven-javadoc-plugin

Gjenerimi i javadoc për projektin.

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

Nëse keni një modul që nuk përmban java (për shembull, vetëm burime)
Ose nuk dëshironi t'i gjeneroni javadoc në përgjithësi, atëherë në ndihmë maven-jar-plugin

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

Përmbajtja

maven-gpg-plugin

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

Përmbajtja

nexus-staging-maven-plugin

Konfigurimi:


  
    
      
      
        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/

Nëse keni një projekt me module të shumta dhe nuk është e nevojshme të ngarkoni një modul të caktuar në depo, atëherë në pom.xml të këtij moduli duhet të shtoni nexus-staging-maven-plugin me flamur skipNexusStagingDeployMojo

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

Pas ngarkimit, versionet snapshot/release janë të disponueshme në depo të staging

SonatypeNexus
    https://oss.sonatype.org/content/groups/staging/
    <!--

Një tjetër plus

  • NjĂ« listĂ« shumĂ« e pasur e qĂ«llimeve pĂ«r punĂ« me depo-nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Kontroll automatik i lĂ«shimit pĂ«r mundĂ«sinĂ« e ngarkimit nĂ« maven central

Përmbajtja

Rezultati

Publikimi i versionit SNAPSHOT

Gjatë ndërtimit të projektit, ekziston mundësia e nisjes manuale të detyrës për ngarkimin e versionit SNAPSHOT në nexus

Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

Kur ekzekutohet kjo detyrë, aktivizohet detyra përkatëse në projektin deploy (shembull).

Log i prerë

Po afatgjatë me gitlab-runner 11.10.0 (3001a600)
  në Deploy runner JSKWyxUw
Duke përdorur executor-in Shell...
Po punon në ih1174328.vds.myihor.ru...
Duke anashkaluar konfigurimin e depozitës Git
Duke anashkaluar kontrollin e Git
Duke anashkaluar konfigurimin e nënmodulëve Git
$ rm -rf .* *
$ git config --global credential.helper store
$ echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/ .git-credentials
$ git clone ${DEPLOY_CI_REPOSITORY_URL} .
Duke kopjuar në 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Shënim: po kontrolloni '850f86aa317194395c5387790da1350e437125a7'.
Jeni në gjendjen 'detached HEAD'. Mund të shikoni rreth, të bëni ndryshime eksperimentale
dhe t'i angazhoni ato, dhe mund të hidhni çdo angazhim që bëni në këtë
gjendje pa ndikuar në asnjë degë duke kryer një tjetër kontroll.
Nëse dëshironi të krijoni një degë të re për të ruajtur angazhimet që krijoni, mund
të bëni këtë (tani ose më vonë) duke përdorur -b me komandën e kontrollit përsëri. Shembull:
  git checkout -b emri_deges_se_re
HEAD tani është në 850f86a... anashkaloni testin e shpërndarjes
$ për pom në $(find . -name pom.xml); bëj # komandë e ndarë shumë-line
$ nëse [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; atëherë # komandë e ndarë shumë-line
[INFO] Skanoj për projekte...
[INFO] Inspektoj ndërtimin me total prej 4 moduleve...
[INFO] Instalimi i veçorive të Nexus Staging:
[INFO]   ... total prej 4 ekzekutimesh të maven-deploy-plugin u zëvendësua me nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Renditja e Ndërtimit të Reaktorëve:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Klienti Shields4J                                                   [jar]
[INFO] Dëgjuesi TestNG                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Po ndërtosh Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Duke kërkuar për rrënjën e agreguesit lokal...
[INFO] Rrënja e agregimit lokal: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Procesi i ndryshimit të org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Procesi org.touchbit.shields4j:shields4j-parent
[INFO]     Po përditëson projektin org.touchbit.shields4j:shields4j-parent
[INFO]         nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] 
[INFO] Procesi org.touchbit.shields4j:client
[INFO]     Po përditëson prindin org.touchbit.shields4j:shields4j-parent
[INFO]         nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]     Po përditëson varësinë org.touchbit.shields4j:test-core
[INFO]         nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] 
[INFO] Procesi org.touchbit.shields4j:test-core
[INFO]     Po përditëson prindin org.touchbit.shields4j:shields4j-parent
[INFO]         nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] 
[INFO] Procesi org.touchbit.shields4j:testng
[INFO]     Po përditëson prindin org.touchbit.shields4j:shields4j-parent
[INFO]         nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]     Po përditëson varësinë org.touchbit.shields4j:client
[INFO]         nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO]     Po përditëson varësinë org.touchbit.shields4j:test-core
[INFO]         nga versioni 1.0.0 në 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Rezuma e Reaktorëve:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUKSES [  0.992 s]
[INFO] test-core .......................................... SKIPUAR
[INFO] Klienti Shields4J ................................... SKIPUAR
[INFO] Dëgjuesi TestNG 1.0.0 .............................. SKIPUAR
[INFO] ------------------------------------------------------------------------
[INFO] NDËRTIM SUKSES
[INFO] ------------------------------------------------------------------------
[INFO] Koha totale: 2.483 s
[INFO] Mbaruar në: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Skanoj për projekte...
[INFO] Inspektoj ndërtimin me total prej 4 moduleve...
[INFO] Instalimi i veçorive të Nexus Staging:
[INFO]   ... total prej 4 ekzekutimesh të maven-deploy-plugin u zëvendësua me nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Renditja e Ndërtimit të Reaktorëve:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Klienti Shields4J                                                   [jar]
[INFO] Dëgjuesi TestNG                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Po ndërtosh Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
FIRMA
...
[INFO]  * Shpërndarja e masës së artefakteve të grumbulluara për snapshot përfundoi.
[INFO] Shpërndarja e largët u përfundua me sukses.
[INFO] ------------------------------------------------------------------------
[INFO] Rezuma e Reaktorëve:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUKSES [  2.375 s]
[INFO] test-core .......................................... SUKSES [  3.929 s]
[INFO] Klienti Shields4J ................................... SUKSES [  3.815 s]
[INFO] Dëgjuesi TestNG 1.0.0-SNAPSHOT ..................... SUKSES [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] NDËRTIM SUKSES
[INFO] ------------------------------------------------------------------------
[INFO] Koha totale: 47.629 s
[INFO] Mbaruar në: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Si pasojë, në nexus u ngarkua versioni 1.0.0-SNAPSHOT.

Të gjitha versionet snapshot mund të fshihen nga repository në sitin oss.sonatype.org nën llogarinë tuaj.

Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

Përmbajtja

Publikimi i versionit release

Kur caktohet etiketë, automatikisht aktivizohet detyra përkatëse në projektin deploy për ngarkimin e versionit të lëshuar në nexus (shembull).

Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

Më e këndshmja, automatikisht aktivizohet close release në nexus.

[INFO] Duke bërë staging nga distanca...
[INFO] 
[INFO]  * Staging në profilin e stagingut me ID "9043b43f77dcc9"
[INFO]  * Krijuar repository staging me ID "orgtouchbit-1037".
[INFO]  * Repository staging në https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Ngarkimi i artefakteve të ngarkuara lokal në profilin org.touchbit
[INFO]  * Ngarkimi i artefakteve të ngarkuara lokal përfundoi.
[INFO]  * Duke mbyllur repository staging me ID "orgtouchbit-1037".
Duke pritur që operacioni të përfundojë...
.........
[INFO] Staging nga distanca 1 repository, përfundoi me sukses.
[INFO] ------------------------------------------------------------------------
[INFO] Rezultati i reaktorit:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUKSES [  9.603 s]
[INFO] test-core .......................................... SUKSES [  3.419 s]
[INFO] Shields4J klient ................................... SUKSES [  9.793 s]
[INFO] TestNG dëgjuesi 1.0.0 .............................. SUKSES [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] NDËRTIMI SUKSES
[INFO] ------------------------------------------------------------------------
[INFO] Koha totale: 01:47 min
[INFO] Përfundoi në: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

Dhe nëse diçka shkoi keq, detyra do të dështojë për siguri.

[INFO] Duke remote staging...
[INFO] 
[INFO]  * Duke në profilin e skenimit ID "9043b43f77dcc9"
[INFO]  * Krijuar depo skenimi me ID "orgtouchbit-1038".
[INFO]  * Depotë skenimi në https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Ngarkimi i artefakteve të skenuara lokal në profilin org.touchbit
[INFO]  * Ngarkimi i artefakteve të skenuara lokal përfundoi.
[INFO]  * Duke mbyllur depo skenimi me ID "orgtouchbit-1038".
Po pret për përfundimin e veprimit...
.......
[ERROR] Dështimi i rregullit gjatë përpjekjes për të mbyllur depo skenimi me ID "orgtouchbit-1039".
[ERROR] 
[ERROR] Raporti i Dështimit të Rregullave të Nexus Staging
[ERROR] ==================================
[ERROR] 
[ERROR] Dështimet e depo "orgtouchbit-1039"
[ERROR]   Dështimet e rregullit "signature-staging"
[ERROR]     * ÇelĂ«si publik mungon: ÇelĂ«si me ID: (1f42b618d1cbe1b5) nuk mund tĂ« gjendej nĂ« &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. Ngarko çelĂ«sin tĂ«nd publik dhe provo pĂ«rsĂ«ri operacionin.
...
[ERROR] Pastrimi i direktorisë lokale të skenimit pas dështimit të një Rregulli gjatë mbylljes së depo skenimi: [orgtouchbit-1039]
[ERROR]  * Duke fshirë kontekstin 9043b43f77dcc9.properties
[ERROR] Pastrimi i depo skenimi të largët pas dështimit të një Rregulli gjatë mbylljes së depo skenimi: [orgtouchbit-1039]
[ERROR]  * Duke hequr depo skenimi të dështuar me ID "orgtouchbit-1039" (Dështimi i rregullit gjatë mbylljes së depo skenimi: [orgtouchbit-1039]).
[ERROR] Duke përfunduar skenimin e largët me një dështim: Dështimi i rregullave të skenimit!
[INFO] ------------------------------------------------------------------------
[INFO] Përmbledhje e Reaktorëve:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUKSES [  4.073 s]
[INFO] test-core .......................................... SUKSES [  2.788 s]
[INFO] Klienti Shields4J ................................... SUKSES [  3.962 s]
[INFO] DĂ«gjuesi TestNG 1.0.0 .............................. DËSHTIM [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] DËSHTIM I NDËRTIMIT
[INFO] ------------------------------------------------------------------------

Kemi mbetur vetëm një zgjedhje. Ose të fshijmë këtë version ose ta publikojmë.

Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

Pas publikimit, pas një kohe artefaktet do të përfundojnë në Konfigurimi i GitLab CI për ngarkimin e projektit java në Maven Central

offtopic

Për mua ishte një zbulim se maven indekson depozita publike të tjera.
Ishte e nevojshme të shtoj robots.txt, pasi ai indeksoi depozitën time të vjetër.

Përmbajtja

Përfundimi

ÇfarĂ« kemi

  • NjĂ« projekt i veçantĂ« deploy ku mund tĂ« realizohet njĂ« numĂ«r CI punĂ«sh pĂ«r ngarkimin e artefakteve nĂ« depozita publike pĂ«r gjuhĂ« tĂ« ndryshme zhvillimi.
  • Projekti deploy Ă«shtĂ« i izoluar nga ndĂ«rhyrjet e jashtme dhe mund tĂ« ndryshohet vetĂ«m nga pĂ«rdoruesit me rolin Owner dhe Maintainer.
  • NjĂ« Runner specifik i veçantĂ« me njĂ« cache "tĂ« nxehtĂ«" pĂ«r tĂ« ekzekutuar vetĂ«m punĂ«t e deploy.
  • Publikimi i versioneve snapshot/release nĂ« depozitĂ«n publike.
  • Kontrolli automatik i versionit release pĂ«r gatishmĂ«rinĂ« pĂ«r publikim nĂ« maven central.
  • Mbrojtja nga publikimi automatik i versioneve "tĂ« papjekura" nĂ« maven central.
  • NdĂ«rtimi dhe publikimi i versioneve snapshot "me njĂ« klik".
  • NjĂ« depo e vetme pĂ«r marrjen e versioneve snapshot/release.
  • NjĂ« pipeline e pĂ«rbashkĂ«t pĂ«r ndĂ«rtimin/testimin/publikimin e projektit java.

Konfigurimi i GitLab CI nuk Ă«shtĂ« njĂ« temĂ« aq e komplikuar sa duket nĂ« shikim tĂ« parĂ«. Mjafton tĂ« konfiguroni CI "nga fillimi" disa herĂ« dhe ja, ju nuk jeni mĂ« njĂ« novice nĂ« kĂ«tĂ« fushĂ«. Sidomos dokumentacioni i GitLab Ă«shtĂ« mjaft i hollĂ«sishĂ«m. Mos keni frikĂ« tĂ« bĂ«ni hapin e parĂ«. Rruga shfaqet nĂ«n hapat e atij qĂ« ecĂ«n (nuk e mbaj mend kush e tha 🙂 ).

Do të isha i lumtur për ndonjë feedback.

Në artikullin e ardhshëm do të flas për mënyrën e konfigurimit të GitLab CI për ekzekutimin konkurent të detyrave me testet integruese (me nisjen e shërbimeve që testohen përmes docker-compose), nëse keni vetëm një shell runner.

Përmbajtja

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster