Konfigurera GitLab CI för att ladda upp java-projekt till maven central

Denna artikel riktar sig till java-utvecklare som har behov av att snabbt publicera sina produkter i repositorier som sonatype och/eller maven central med hjÀlp av GitLab. I denna artikel kommer jag att gÄ igenom instÀllningen av gitlab-runner, gitlab-ci och maven-plugin för att lösa detta problem.

FörutsÀttningar:

  • SĂ€ker lagring av mvn och GPG-nycklar.
  • SĂ€ker körning av offentliga CI-uppgifter.
  • Ladda upp artefakter (release/snapshot) till offentliga repositorier.
  • Automatisk kontroll av release-versioner för publicering i maven central.
  • Generell lösning för att ladda upp artefakter till repositoriet för flera projekt.
  • Enkelhet och anvĂ€ndarvĂ€nlighet.

InnehÄll

AllmÀn information

  • En detaljerad beskrivning av mekanismen för publicering av artefakter i Maven Central via Sonatype OSS Repository Hosting Service har redan beskrivits i denna artikel anvĂ€ndaren Googolplex, sĂ„ jag kommer att hĂ€nvisa till denna artikel vid behov.
  • Registrera oss först pĂ„ Sonatype JIRA och öppna ett Ă€rende för att skapa ett repositorium (lĂ€s mer i avsnittet Skapa ett Ă€rende pĂ„ Sonatype JIRA). Efter att repositoriet har skapats kommer inloggningsuppgifterna (anvĂ€ndarnamn/lösenord) frĂ„n JIRA (senare Sonatype-kontot) att anvĂ€ndas för att ladda upp artefakter till Sonatype nexus.
  • Processen för att generera GPG-nyckeln beskrivs ganska kort. Se avsnittet InstĂ€llningar av GnuPG för signering av artefakter
  • Om du anvĂ€nder Linux-konsolen för att generera GPG-nyckeln (gnupg/gnupg2) mĂ„ste du installera rng-tools för att generera entropi. Annars kan nyckelgenereringen ta mycket lĂ„ng tid.
  • LagringstjĂ€nster offentliga GPG-nycklar

Till innehÄllet

InstÀllning av deploy-projekt i GitLab

  • Först och frĂ€mst mĂ„ste du skapa och konfigurera ett projekt dĂ€r pipelinen för att deploya artefakter kommer att lagras. Jag kallade mitt projekt enkelt och tydligt — deploy
  • Efter att ha skapat repositoriet mĂ„ste du begrĂ€nsa Ă„tkomsten till att Ă€ndra repositoriet.
    GÄ till projektet -> InstÀllningar -> Repositorium -> Skyddade grenar. Ta bort alla regler och lÀgg till en enda regel med Wildcard * med rÀttighet att push och merge endast för anvÀndare med rollen Maintainers. Denna regel kommer att gÀlla för alla anvÀndare i bÄde detta projekt och den grupp som detta projekt tillhör.
    Konfigurera GitLab CI för att ladda upp java-projekt till maven central
  • Om det finns flera maintainers, Ă€r det bĂ€sta att begrĂ€nsa Ă„tkomsten till projektet helt.
    GÄ till projekt -> InstÀllningar -> AllmÀnt -> Synlighet, projekfunktioner, behörigheter och stÀll in Projektets synlighet till Private.
    Mitt projekt Àr offentligt tillgÀngligt eftersom jag anvÀnder min egen GitLab Runner och endast jag har behörighet att Àndra i förvaret. Jag vill inte heller avslöja privat information i offentliga pipeline-loggar.
  • StrĂ€ngare regler för att Ă€ndra i förvaret
    GÄ till projekt -> InstÀllningar -> Förvaring -> Push-regler och aktivera flaggorna Kommittentrestriktion, Kontrollera om författare Àr en GitLab-anvÀndare. Jag rekommenderar ocksÄ att konfigurera signering av commits, och aktivera flaggan Avvisa osignerade commits.
  • DĂ€refter behöver vi stĂ€lla in en trigger för att starta uppgifter
    GÄ till projekt -> InstÀllningar -> CI / CD -> Pipeline-triggers och skapa en ny trigger-token
    Denna token kan direkt lÀggas till i den gemensamma konfigurationen av variabler för projektgruppen.
    GÄ till grupp -> InstÀllningar -> CI / CD -> Variabler och lÀgg till variabeln DEPLOY_TOKEN med trigger-token som vÀrde.

Till innehÄllet

GitLab Runner

Detta avsnitt beskriver konfigurationen för att starta uppgifter för distribuerade med anvÀndning av egna (Specifika) och offentliga (Delade) runners.

Specifik Runner

Jag anvÀnder egna runners eftersom det frÀmst Àr bekvÀmt, snabbt och billigt.
För runner rekommenderar jag en Linux VDS med 1 CPU, 2 GB RAM, 20 GB HDD. Kostnaden Ă€r ungefĂ€r ~3000ₜ per Ă„r.

Min runner

För runner tog jag en VDS med 4 CPU, 4 GB RAM, 50 GB SSD. Kostnaden blev ~11000ₜ och jag har aldrig Ă„ngrat mig.
Jag har totalt 7 maskiner. 5 pÄ aruba och 2 pÄ ihor.

SĂ„, vi har en runner. Nu ska vi konfigurera den.
Logga in pÄ maskinen via SSH och installera java, git, maven, gnupg2.

Till innehÄllet

Installerar gitlab runner

  • Skapa en ny grupp runner
    sudo groupadd runner
  • Skapa en katalog för maven-cache och ge gruppen rĂ€ttigheter runner
    Detta steg kan hoppas över om du inte planerar att köra flera runners pÄ en och samma maskin.
    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Skapa en anvĂ€ndare gitlab-deployer och lĂ€gg till i gruppen runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • LĂ€gg till följande rad i filen /etc/ssh/sshd_config AllowUsers root@* gitlab-deployer@127.0.0.1
    Starta om
  • systemctl restart sshd sshd.
    StÀll in ett lösenord för anvÀndaren
  • (kan vara enkelt, dĂ„ det finns en begrĂ€nsning för localhost) gitlab-deployer passwd gitlab-deployer
    Installerar GitLab Runner (Linux x86-64)
  • ĐŁŃŃ‚Đ°ĐœĐ°ĐČлОĐČĐ°Đ”ĐŒ 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
  • GĂ„ till gitlab.com -> deploy-project -> InstĂ€llningar -> CI/CD -> Runners -> Specifika Runners och kopiera registreringstoken

SkÀrm

Konfigurera GitLab CI för att ladda upp java-projekt till maven central

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

Process

Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Körs i systemlÀge.
Var god ange gitlab-ci koordinator URL (t.ex. https://gitlab.com/):
https://gitlab.com/
Var god ange gitlab-ci token för denna runner:
REGISTRATION_TOKEN
Var god ange gitlab-ci beskrivning för denna runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Var god ange gitlab-ci taggar för denna runner (komma-separerade):
deply
Registrerar runner... lyckades                     runner=ZvKdjJhx
Var god ange exekveraren: docker-ssh, parallels, virtualbox, docker-ssh+maskin, kubernetes, docker, ssh, docker+maskin, shell:
shell
Runner registrerad framgÄngsrikt. Du kan börja anvÀnda den, men om den redan körs bör konfigurationen automatiskt laddas om!
  • Kontrollerar att runnern Ă€r registrerad. GĂ„ till gitlab.com -> deploy-project -> InstĂ€llningar -> CI/CD -> Runners -> Specifika Runners -> Runners aktiverade för detta projekt

SkÀrm

Konfigurera GitLab CI för att ladda upp java-projekt till maven central

  • LĂ€gg till separat tjĂ€nst /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
  • Startar tjĂ€nsten.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Kontrollerar att runnern körs.

Exempel

Konfigurera GitLab CI för att ladda upp java-projekt till maven central

Till innehÄllet

Generering av GPG-nycklar

  • Logga in pĂ„ samma maskin via ssh under anvĂ€ndaren gitlab-deployer (detta Ă€r viktigt för att generera GPG-nyckeln)
    ssh gitlab-deployer@127.0.0.1
  • Generera nyckeln genom att svara pĂ„ frĂ„gorna. Jag anvĂ€nde mitt eget namn och e-post.
    Var noga med att ange lösenord för nyckeln. Denna nyckel kommer att anvÀndas för att signera artefakter.
    gpg --gen-key 
  • Kontrollerar
    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
  • Ladda upp vĂ„r publika nyckel till nyckelservern
    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: skickar nyckel 00000000 till hkp-servern keys.gnupg.net

Till innehÄllet

InstÀllning av Maven

  • Logga in under anvĂ€ndaren gitlab-deployer
    su gitlab-deployer 
  • Skapa en maven-katalog repository och lĂ€nka med cache (kom ihĂ„g detta)
    Detta steg kan hoppas över om du inte planerar att köra flera runners pÄ samma maskin.
    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Skapa en huvudnyckel
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Skapa filen ~/.m2/settings-security.xml
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Kryptera lösenordet för Sonatype-kontot
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Skapa filen ~/.[m2]/settings.xml
    env
            
                true
            
            
                GPG_SECRET_KEY_PASSPHRASE
            
        
    
    
        
            sonatype
            SONATYPE_USERNAME
            {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}

dÀr,
GPG_SECRET_KEY_PASSPHRASE — lösenordet för GPG-nyckeln
SONATYPE_USERNAME — inloggning för Sonatype-kontot

InstÀllningen av runner Àr nu klar, vi kan gÄ vidare till avsnittet GitLab CI

Till innehÄllet

Delad Runner

Generering av GPG-nycklar

  • Först mĂ„ste vi skapa en GPG-nyckel. För detta installerar vi gnupg.
    yum install -y gnupg
  • Generera nyckeln genom att svara pĂ„ frĂ„gorna. Jag anvĂ€nde mitt eget namn och e-post. Var noga med att ange ett lösenord för nyckeln.
    gpg --gen-key 
  • Visar information om nyckeln
    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]
  • Ladda upp vĂ„r publika nyckel till nyckelservern
    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: skickar nyckel 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 till hkp-server keys.gnupg.net
  • Vi fĂ„r den privata nyckeln
    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----
  • GĂ„ till projektinstĂ€llningar -> InstĂ€llningar -> CI / CD -> Variabler och spara den privata nyckeln i en variabel GPG_SECRET_KEY
    Konfigurera GitLab CI för att ladda upp java-projekt till maven central

Till innehÄllet

InstÀllning av Maven

  • Skapa en huvudnyckel
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • GĂ„ till projektinstĂ€llningar -> InstĂ€llningar -> CI / CD -> Variabler och spara i en variabel SETTINGS_SECURITY_XML följande rader:
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Kryptera lösenordet för Sonatype-kontot
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • GĂ„ till projektinstĂ€llningar -> InstĂ€llningar -> CI / CD -> Variabler och spara i en variabel SETTINGS_XML följande rader:
    env
            
                true
            
            
                GPG_SECRET_KEY_PASSPHRASE
            
        
    
    
        
            sonatype
            sonatype_username
            {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}

dÀr,
GPG_SECRET_KEY_PASSPHRASE — lösenordet för GPG-nyckeln
SONATYPE_USERNAME — inloggning för Sonatype-kontot

Till innehÄllet

Deploy docker-bild

  • Skapa en tillrĂ€ckligt enkel Dockerfile för att köra uppgifter pĂ„ deploy med rĂ€tt version av Java. Nedan Ă€r ett exempel fö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]/
  • Bygg containern för ditt projekt
    docker build -t registry.gitlab.com/group/deploy .
  • Autentisera och ladda upp containern till registret.
    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

Till innehÄllet

GitLab CI

Deploy-projekt

LĂ€gg till filen .gitlab-ci.yml i roten av deploy-projektet
I skriptet presenteras tvÄ ömsesidigt uteslutande uppgifter för distribution. Specific Runner eller Shared Runner beroende pÄ situation.

.gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # Uppgiften kommer att köras pÄ din shell-runner
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # Uppgiften kommer att köras pÄ en offentlig docker-runner
  tags:
    - docker
  # Bild frÄn avsnittet GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # Importera GPG-nyckel
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # Spara maven-konfiguration
    - printf "${SETTINGS_SECURITY_XML}" > ~/ .m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/ .m2/settings.xml

.java_deploy_template:
  stage: deploy
  # Uppgiften aktiveras genom trigger om variabeln DEPLOY med vÀrdet java skickas
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # inaktivera kloning av nuvarande projekt
    GIT_STRATEGY: none
  script:
    # Ge möjlighet att lagra lösenordet i okrypterad form
    - git config --global credential.helper store
    # Spara temporÀra credentials för anvÀndaren gitlab-ci-token
    # Tokenet fungerar för alla offentliga projekt pÄ gitlab.com och för gruppens projekt
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/ .git-credentials
    # Rensa nuvarande katalog helt
    - rm -rf .* *
    # Klona projektet som ska distribueras till Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # Byt till rÀtt commit
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Om nÄgon pom.xml innehÄller parametern autoReleaseAfterClose, avbryt byggnationen.
    # Annars finns det risk att ladda upp rÄa artefakter till maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "Fil $pom innehÄller förbjuden instÀllning: ";
          exit 1;
        fi;
      done
    # Om parametern DEPLOY_CI_COMMIT_TAG Àr tom, sÀtts SNAPSHOT-versionen tvÄngsmÀssigt
    - >
      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ör uppgiften för att bygga och distribuera artefakter
    - mvn clean deploy -DskipTests=true

Till innehÄllet

Java-projekt

I java-projekt som avser att laddas upp till offentliga förrÄd behöver tvÄ steg lÀggas till för att ladda upp Release och Snapshot-versioner.

.gitlab-ci.yml

steg:
  - bygg
  - testa
  - verifiera
  - distribuera



SlÀpp:
  utökar: .trigger_deploy
  # Kör jobben endast p taggen.
  endast:
    - taggar

Snapshot:
  utökar: .trigger_deploy
  # Kör jobbet för att publicera SNAPSHOT-version manuellt
  nÀr: manuellt
  # Kör inte jobbet om en tagg har satts.
  förutom:
    - taggar

.trigger_deploy:
  steg: distribuera
  variabler:
    # Inaktiverar kloning av det aktuella projektet
    GIT_STRATEGY: none
    # LÀnk till trigger för deploy-jobbet
    URL: "https://gitlab.com/api/v4/projects//trigger/pipeline"
    # Variabler för deploy-jobbet
    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:
    # AnvÀnder inte cURL, eftersom flaggorna --fail --show-error
    # inte visar svarskroppen om HTTP-koden Àr 400 och uppÄt
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

I den hÀr lösningen har jag gÄtt lite lÀngre och beslutat att anvÀnda en CI-mall för java-projekt.

Mer i detalj

Jag skapade ett separat projekt gitlab-ci dÀr jag placerade CI-mallen för java-projekt common.yml.

common.yml

steg:
  - bygg
  - testa
  - verifiera
  - distribuera

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

.build_java_project:
  steg: bygg
  taggar:
    - touchbit-shell
  variabler:
    SKIP_TEST: "false"
  script:
    - mvn clean
    - mvn package -DskipTests=${SKIP_TEST}
  artefakter:
    nÀr: alltid
    gÄ ut om: 30 dagar
    vÀgar:
      - "*\/target\/reports"

.build_sphinx_doc:
  steg: bygg
  taggar:
    - touchbit-shell
  variabler:
    DOCKERFILE: .indirect\/docs\/Dockerfile
  script:
    - docker build --no-cache -t ${CI_PROJECT_NAME}\/doc -f ${DOCKERFILE} .

.junit_module_test_run:
  steg: testa
  taggar:
    - touchbit-shell
  variabler:
    MODULE: ""
  script:
    - cd ${MODULE}
    - mvn test
  artefakter:
    nÀr: alltid
    gÄ ut om: 30 dagar
    vÀgar:
      - "*\/target\/reports"

.junit_test_run:
  steg: testa
  taggar:
    - touchbit-shell
  script:
    - mvn test
  artefakter:
    nÀr: alltid
    gÄ ut om: 30 dagar
    vÀgar:
    - "*\/target\/reports"

.sonar_review:
  steg: verifiera
  taggar:
    - touchbit-shell
  beroenden: []
  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:
  steg: distribuera
  taggar:
    - touchbit-shell
  variabler:
    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:
  utökar: .trigger_deploy
  endast:
    - taggar

.trigger_snapshot_deploy:
  utökar: .trigger_deploy
  nÀr: manuellt
  förutom:
    - taggar

Som följd ser .gitlab-ci.yml i sjÀlva java-projekten ganska kompakt och koncist ut

.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

Till innehÄllet

Konfiguration av pom.xml

Detta Àmne beskrivs mycket detaljerat Googolplex pÄ InstÀllning av Maven för automatisk signering och uppladdning av artefakter till snapshot- och staging-repositorier, sÄ jag kommer att beskriva nÄgra nyanser kring anvÀndningen av plugins. Jag kommer ocksÄ att beskriva hur enkelt och obehagligt det kan vara att anvÀnda nexus-staging-maven-plugin, om du inte vill eller inte kan anvÀnda org.sonatype.oss:oss-parent som förÀlder för ditt projekt.

maven-install-plugin

Installerar moduler i det lokala arkivet.
Mycket anvÀndbart för lokal testning av lösningar i andra projekt samt för kontrollsummor.

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

Till innehÄllet

maven-javadoc-plugin

Generering av javadoc för projektet.

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

Om du har en modul som inte innehÄller java (till exempel endast resurser)
Eller om du om överhuvudtaget inte vill generera javadoc, sÄ finns det hjÀlp maven-jar-plugin

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

Till innehÄllet

maven-gpg-plugin

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

Till innehÄllet

nexus-staging-maven-plugin

Konfiguration:


  
    
      
      
        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/

Om du har ett flermodulsprojekt och inte behöver ladda upp en viss modul till arkivet, mÄste du lÀgga till nexus-staging-maven-plugin med flaggan skipNexusStagingDeployMojo

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

Efter att ha laddat upp snapshot/release-versionerna Àr de tillgÀngliga i staging-repositorier

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

Fler fördelar

  • En mycket omfattande lista över mĂ„l för arbete med nexus-repositoryt (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Automatisk kontroll av release för möjligheten att ladda upp till maven central

Till innehÄllet

Resultat

Publicering av SNAPSHOT-version

Under byggprocessen finns det möjlighet att manuellt starta uppgiften för att ladda upp SNAPSHOT-version till nexus

Konfigurera GitLab CI för att ladda upp java-projekt till maven central

Vid körning av denna uppgift triggas den motsvarande uppgiften i deploy-projektet (exempel).

Beskuret log

Körning med gitlab-runner 11.10.0 (3001a600)
  pÄ Deploy runner JSKWyxUw
AnvÀnder Shell-exekverare...
Körning pÄ ih1174328.vds.myihor.ru...
Hoppar över Git-förvarande instÀllning
Hoppar över Git-checkout
Hoppar över instÀllning av Git-undermoduler
$ 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} .
Klonar in i 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Obs: checkar ut '850f86aa317194395c5387790da1350e437125a7'.
Du Àr i 'detached HEAD'-lÀge. Du kan titta runt, göra experimentella
Àndringar och göra dessa, och du kan kassera alla commits du gör i detta
lÀge utan att pÄverka nÄgra grenar genom att utföra en annan checkout.
Om du vill skapa en ny gren för att behÄlla commits du skapar, kan du
göra sÄ (nu eller senare) genom att anvÀnda -b med checkout-kommandot igen. Exempel:
  git checkout -b new_branch_name
HEAD Àr nu pÄ 850f86a... hoppa över deploy test-core
$ för pom i $(find . -name pom.xml); do # ihopslagen flera-radskommand
$ om [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; dÄ # ihopslagen flera-radskommand
[INFO] Skannar efter projekt...
[INFO] Inspekterar bygg med totalt 4 moduler...
[INFO] Installerar Nexus Staging-funktioner:
[INFO]   ... totalt 4 körningar av maven-deploy-plugin ersattes med nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reaktors byggordning:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J klient                                                   [jar]
[INFO] TestNG lyssnare                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Bygger Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Söker efter lokal aggregatrot...
[INFO] Lokal aggregatrot: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Bearbetar Àndring av org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Bearbetar org.touchbit.shields4j:shields4j-parent
[INFO]     Uppdaterar projekt org.touchbit.shields4j:shields4j-parent
[INFO]         frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO] 
[INFO] Bearbetar org.touchbit.shields4j:client
[INFO]     Uppdaterar förÀlder org.touchbit.shields4j:shields4j-parent
[INFO]         frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO]     Uppdaterar beroendet org.touchbit.shields4j:test-core
[INFO]         frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO] 
[INFO] Bearbetar org.touchbit.shields4j:test-core
[INFO]     Uppdaterar förÀlder org.touchbit.shields4j:shields4j-parent
[INFO]         frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO] 
[INFO] Bearbetar org.touchbit.shields4j:testng
[INFO]     Uppdaterar förÀlder org.touchbit.shields4j:shields4j-parent
[INFO]         frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO]     Uppdaterar beroendet org.touchbit.shields4j:client
[INFO]         frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO]     Uppdaterar beroendet org.touchbit.shields4j:test-core
[INFO]         frÄn version 1.0.0 till 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reaktors sammanfattning:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... LYCKADES [  0.992 s]
[INFO] test-core .......................................... HOPPADES
[INFO] Shields4J klient ................................... HOPPADES
[INFO] TestNG lyssnare 1.0.0 .............................. HOPPADES
[INFO] ------------------------------------------------------------------------
[INFO] BYGG LYCKADES
[INFO] ------------------------------------------------------------------------
[INFO] Total tid: 2.483 s
[INFO] Avslutad vid: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Skannar efter projekt...
[INFO] Inspekterar bygg med totalt 4 moduler...
[INFO] Installerar Nexus Staging-funktioner:
[INFO]   ... totalt 4 körningar av maven-deploy-plugin ersattes med nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reaktors byggordning:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J klient                                                   [jar]
[INFO] TestNG lyssnare                                                    [jar]
[INFO] 
[INFO] -----------------------------
[INFO] Bygger Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO]  * Bulkdeploy av lokalt insamlade snapshot-artiklar avslutat.
[INFO] FjÀrrdeploy avslutades med framgÄng.
[INFO] ------------------------------------------------------------------------
[INFO] Reaktors sammanfattning:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... LYCKADES [  2.375 s]
[INFO] test-core .......................................... LYCKADES [  3.929 s]
[INFO] Shields4J klient ................................... LYCKADES [  3.815 s]
[INFO] TestNG lyssnare 1.0.0-SNAPSHOT ..................... LYCKADES [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BYGG LYCKADES
[INFO] ------------------------------------------------------------------------
[INFO] Total tid: 47.629 s
[INFO] Avslutad vid: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Som följd laddades en version upp till nexus 1.0.0-SNAPSHOT.

Alla snapshot-versioner kan tas bort frÄn lagret pÄ webbplatsen oss.sonatype.org med ditt konto.

Konfigurera GitLab CI för att ladda upp java-projekt till maven central

Till innehÄllet

Publicering av release-version

NÀr taggen installeras triggas automatiskt motsvarande uppgift i deploy-projektet för att ladda upp release-versionen till nexus (exempel).

Konfigurera GitLab CI för att ladda upp java-projekt till maven central

Det mest behagliga Àr att close release automatiskt aktiveras i nexus.

[INFO] Utför fjÀrrstaging...
[INFO] 
[INFO]  * FjÀrrstaging till staging-profil ID "9043b43f77dcc9"
[INFO]  * St staging-repository med ID "orgtouchbit-1037".
[INFO]  * St staging-repository pÄ https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Laddar upp lokalt stageade artefakter till profil org.touchbit
[INFO]  * Uppladdning av lokalt stageade artefakter Àr avslutad.
[INFO]  * StÀnger staging-repository med ID "orgtouchbit-1037".
VÀntar pÄ att operationen ska slutföras...
.........
[INFO] FjÀrrstageade 1 repositories, avslutad med framgÄng.
[INFO] ------------------------------------------------------------------------
[INFO] Resumé:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... FRAMGÅNG [  9.603 s]
[INFO] test-core .......................................... FRAMGÅNG [  3.419 s]
[INFO] Shields4J-klient ................................... FRAMGÅNG [  9.793 s]
[INFO] TestNG-lyssnare 1.0.0 .............................. FRAMGÅNG [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BYGG FRAMGÅNG
[INFO] ------------------------------------------------------------------------
[INFO] Total tid: 01:47 min
[INFO] Avslutad at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

Och om nÄgot gÄr fel, kommer uppgiften definitivt att misslyckas

[INFO] Utför fjÀrrstaging...
[INFO] 
[INFO]  * FjÀrrstaging in i stagingprofil ID "9043b43f77dcc9"
[INFO]  * Skapade stagingrepository med ID "orgtouchbit-1038".
[INFO]  * Stagingrepository pÄ https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Laddar upp lokalt stÀllda artefakter till profil org.touchbit
[INFO]  * Uppladdning av lokalt stÀllda artefakter avslutad.
[INFO]  * StÀnger stagingrepository med ID "orgtouchbit-1038".
VÀntar pÄ att operationen ska avslutas...
.......
[ERROR] Regler för felaktig stÀngning av stagingrepository med ID "orgtouchbit-1039".
[ERROR] 
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR] 
[ERROR] Repository "orgtouchbit-1039" fel
[ERROR]   Regel "signature-staging" fel
[ERROR]     * Ingen offentlig nyckel: Nyckel med id: (1f42b618d1cbe1b5) kunde inte hittas pÄ http://keys.gnupg.net:11371/. Ladda upp din offentliga nyckel och försök operationen igen.
...
[ERROR] StÀdning av lokal stagekatalog efter en regelmisslyckande under stÀngning av stagingrepositories: [orgtouchbit-1039]
[ERROR]  * Tar bort kontext 9043b43f77dcc9.properties
[ERROR] StÀdning av avlÀgsna stagerepositories efter en regelmisslyckande under stÀngning av stagingrepositories: [orgtouchbit-1039]
[ERROR]  * Tar bort misslyckat stagingrepository med ID "orgtouchbit-1039" (Regelmisslyckande under stÀngning av stagingrepositories: [orgtouchbit-1039]).
[ERROR] FjÀrrstaging avslutad med ett fel: Regelmisslyckande vid staging!
[INFO] ------------------------------------------------------------------------
[INFO] Reaktorsammanfattning:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... LYCKAT [  4.073 s]
[INFO] test-core .......................................... LYCKAT [  2.788 s]
[INFO] Shields4J-klient ................................... LYCKAT [  3.962 s]
[INFO] TestNG-lyssnare 1.0.0 .............................. MISSLYCKAT [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BYGGMISSLYCKANDE
[INFO] ------------------------------------------------------------------------

Som resultat har vi bara ett alternativ kvar. Antingen ta bort den hÀr versionen eller publicera den.

Konfigurera GitLab CI för att ladda upp java-projekt till maven central

Efter utgivningen kommer artefakterna att finnas i Konfigurera GitLab CI för att ladda upp java-projekt till maven central

off-topic

För mig var det en ögonöppnare att maven indexerar andra offentliga repositories.
Jag fick lÀgga till robots.txt, eftersom den indexerade mitt gamla repository.

Till innehÄllet

Slutsats

Vad har vi?

  • Ett separat deploy-projekt dĂ€r flera CI-uppgifter kan genomföras för att ladda upp artefakter till offentliga repositories för olika utvecklingssprĂ„k.
  • Deploy-projektet Ă€r isolerat frĂ„n extern pĂ„verkan och kan endast Ă€ndras av anvĂ€ndare med rollen Ägare och UnderhĂ„llare.
  • En separat Specific Runner med "varm" cache för att endast köra deploy-uppgifter.
  • Publicering av snapshot/release-versioner i offentligt repository.
  • Automatisk kontroll av release-versionens beredskap för publicering i maven central.
  • Skydd mot automatisk publicering av "rĂ„a" versioner i maven central.
  • Bygg och publicera snapshot-versioner "med ett klick".
  • Ett enhetligt repository för att fĂ„ snapshot/release-versioner.
  • Den totala pipeline för byggande/testning/publicering av ett Java-projekt.

Att konfigurera GitLab CI Ă€r inte sĂ„ svĂ„rt som det verkar vid första anblicken. Det rĂ€cker med att stĂ€lla in CI "nyckelfĂ€rdigt" ett par gĂ„nger, och dĂ„ Ă€r du redan lĂ„ngt ifrĂ„n att vara nybörjare pĂ„ detta omrĂ„de. Dessutom Ă€r dokumentationen för GitLab ganska omfattande. Tveka inte att ta det första steget. VĂ€gen uppstĂ„r under den som gĂ„r (jag minns inte vem som sa det 🙂 ).

Jag ser fram emot feedback.

I nÀsta artikel kommer jag att berÀtta om hur man konfigurerar GitLab CI för att köra uppgifter parallellt med integreringstester (med start av testade tjÀnster med hjÀlp av docker-compose), om du bara har en shell-runner.

Till innehÄllet

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster