Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

Ky artikull është menduar për zhvilluesit e Java-s të cilët duhet të publikojnë shpejt produktet e tyre në depot qendrore sonatype dhe/ose maven duke përdorur GitLab. Në këtë artikull, unë do të flas për vendosjen e gitlab-runner, gitlab-ci dhe maven-plugin për të zgjidhur këtë problem.

Parakushtet:

  • Ruajtja e sigurt e çelësave mvn dhe GPG.
  • Ekzekutimi i sigurt i detyrave të CI publike.
  • Ngarkimi i objekteve (lëshim/fotografi) në depo publike.
  • Kontroll automatik i versioneve të lëshimit për publikim në maven central.
  • Një zgjidhje e përgjithshme për ngarkimin e objekteve në një depo për projekte të shumta.
  • Thjeshtësia dhe lehtësia e përdorimit.

Përmbajtje

Informacione të përgjithshme

  • Një përshkrim i detajuar i mekanizmit për publikimin e objekteve në Maven Central nëpërmjet Shërbimit Pritës të Depove Sonatype OSS është përshkruar tashmë në Ky artikull përdorues Googolplex, kështu që unë do t'i referohem këtij artikulli në vendet e duhura.
  • Regjistrohu paraprakisht në Sonatipi JIRA dhe filloni një biletë për të hapur depon (për më shumë detaje, lexoni seksionin Krijo një biletë Sonatype JIRA). Pas hapjes së depove, çifti i hyrjes/fjalëkalimit JIRA (më tej referuar si llogaria Sonatype) do të përdoret për të ngarkuar objekte në lidhjen Sonatype.
  • Më tej, procesi i gjenerimit të një çelësi GPG përshkruhet shumë thatë. Shikoni seksionin për më shumë detaje. Konfigurimi i GnuPG për të nënshkruar objekte
  • Nëse jeni duke përdorur konsolën Linux për të gjeneruar një çelës GPG (gnupg/gnupg2), atëherë duhet të instaloni RNG-tools për të gjeneruar entropi. Përndryshe, gjenerimi i çelësave mund të marrë një kohë shumë të gjatë.
  • Shërbimet e ruajtjes publike Çelësat GPG

Për përmbajtjen

Vendosja e një projekti të vendosjes në GitLab

  • Para së gjithash, ju duhet të krijoni dhe konfiguroni një projekt në të cilin tubacioni do të ruhet për vendosjen e objekteve. E quajta projektin tim thjesht dhe të pakomplikuar - vendosur
  • Pas krijimit të depove, duhet të kufizoni aksesin për të ndryshuar depon.
    Shkoni te projekti -> Cilësimet -> Depoja -> Degët e mbrojtura. Ne i fshijmë të gjitha rregullat dhe shtojmë një rregull të vetëm me Wildcard * me të drejtën për të shtyrë dhe bashkuar vetëm për përdoruesit me rolin e Mirëmbajtjes. Ky rregull do të funksionojë për të gjithë përdoruesit e këtij projekti dhe grupit të cilit i përket ky projekt.
    Vendosja e GitLab CI për të ngarkuar një projekt java në maven central
  • Nëse ka disa mirëmbajtës, atëherë zgjidhja më e mirë do të ishte kufizimi i aksesit në projekt në parim.
    Shkoni te projekti -> Cilësimet -> Të përgjithshme -> Dukshmëria, veçoritë e projektit, lejet dhe vendosni dukshmërinë e projektit në privat.
    Unë kam një projekt në akses publik, pasi përdor GitLab Runner-in tim dhe vetëm unë kam akses për të modifikuar depon. Epo, në fakt nuk është në interesin tim të tregoj informacion privat në regjistrat e tubacioneve publike.
  • Shtrëngimi i rregullave për ndryshimin e depove
    Shkoni te projekti -> Cilësimet -> Depoja -> Rregullat e shtytjes dhe vendosni kufizimet e komitetit, kontrolloni nëse autori është përdorues i GitLab. Unë gjithashtu rekomandoj vendosjen angazhohen për nënshkrimin, dhe vendosni flamurin Refuzo unsigned commits.
  • Tjetra, duhet të konfiguroni një shkas për të ekzekutuar detyrat
    Shkoni te projekti -> Cilësimet -> CI / CD -> Aktivizuesit e tubacionit dhe krijoni një shenjë të re të aktivizimit
    Kjo shenjë mund të shtohet menjëherë në konfigurimin e përgjithshëm të variablave për një grup projektesh.
    Shkoni te grupi -> Cilësimet -> CI / CD -> Variablat dhe shtoni një ndryshore DEPLOY_TOKEN me shkas-token në vlerë.

Për përmbajtjen

GitLab Runner

Ky seksion përshkruan konfigurimin për ekzekutimin e detyrave gjatë vendosjes duke përdorur ekzekutuesin vendas (Specifik) dhe publik (Shared).

Vrapues specifik

Unë përdor vrapuesit e mi, sepse para së gjithash është i përshtatshëm, i shpejtë, i lirë.
Për runner rekomandoj Linux VDS me 1 CPU, 2 GB RAM, 20 GB HDD. Çmimi i emetimit ~ 3000₽ në vit.

Vrapuesi im

Për vrapuesin mora VDS 4 CPU, 4 GB RAM, 50 GB SSD. Kushtoi ~ 11000₽ dhe nuk u pendova kurrë.
Kam gjithsej 7 makina. 5 në aruba dhe 2 në ihor.

Pra, ne kemi një vrapues. Tani do ta vendosim.
Shkojmë në makinë përmes SSH dhe instalojmë java, git, maven, gnupg2.

Për përmbajtjen

Instalimi i gitlab runner

  • Krijo një grup të ri runner
    sudo groupadd runner
  • Krijo një direktori për maven cache dhe cakto të drejtat e grupit runner
    Mund ta kaloni këtë hap nëse nuk planifikoni të ekzekutoni shumë vrapues në të njëjtën makinë.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Krijo një përdorues gitlab-deployer dhe shtoni në grup runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Shto në skedar /etc/ssh/sshd_config rreshti tjetër
    AllowUsers root@* [email protected]
  • Rindizni sshd
    systemctl restart sshd
  • Vendosni një fjalëkalim për përdoruesin gitlab-deployer (mund të jetë e thjeshtë, pasi ka një kufizim për localhost)
    passwd gitlab-deployer
  • Instaloni 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
  • Shkoni te gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners dhe kopjoni tokenin e regjistrimit

Ekrani

Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

  • Regjistrimi i vrapuesit
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

proces

Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
REGISTRATION_TOKEN
Please enter the gitlab-ci description for this runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
Registering runner... succeeded                     runner=ZvKdjJhx
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

  • Kontrolloni nëse vrapuesi është i regjistruar. Shkoni te gitlab.com -> deploy-project -> Cilësimet -> CI/CD -> Runners -> Specific Runners -> Runners të aktivizuar për këtë projekt

Ekrani

Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

  • Shtimi të ndara shërbim /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
  • Ne fillojmë shërbimin.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Kontrolloni që vrapuesi është duke vrapuar.

Shembull

Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

Për përmbajtjen

Gjenerimi i çelësave GPG

  • Nga e njëjta makinë kalojmë përmes ssh nën përdorues gitlab-deployer (kjo është e rëndësishme për gjenerimin e çelësave GPG)

    ssh [email protected]

  • Ne krijojmë një çelës duke iu përgjigjur pyetjeve. Kam përdorur emrin dhe emailin tim.
    Sigurohuni që të specifikoni fjalëkalimin për çelësin. Artefaktet do të nënshkruhen me këtë çelës.

    gpg --gen-key 

  • Po kontrollon

    gpg --list-keys -a
    /home/gitlab-deployer/.gnupg/pubring.gpg
    ----------------------------------------
    pub   4096R/00000000 2019-04-19
    uid                  Petruha Petrov <[email protected]>
    sub   4096R/11111111 2019-04-19

  • Ngarkimi i çelësit tonë publik në serverin e çelësave

    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: sending key 00000000 to hkp server keys.gnupg.net

Për përmbajtjen

Konfigurimi i Maven

  • Ne kalojmë nën përdoruesin gitlab-deployer
    su gitlab-deployer 
  • Krijo një drejtori maven depo dhe lidheni me cache (mos bëni gabim)
    Ky hap mund të anashkalohet nëse nuk planifikoni të ekzekutoni disa vrapues në të njëjtën makinë.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Krijo një çelës kryesor
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Krijo skedarin ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Kriptimi i fjalëkalimit nga llogaria Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Krijo skedarin ~/.m2/settings.xml
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

ku,
GPG_SECRET_KEY_PASSPHRASE - fjalëkalimi i çelësit GPG
SONATYPE_USERNAME - identifikimi i llogarisë sonatype

Kjo përfundon konfigurimin e vrapuesit, mund të vazhdoni te seksioni GitLab CI

Për përmbajtjen

Vrapues i përbashkët

Gjenerimi i çelësave GPG

  • Para së gjithash, duhet të krijoni një çelës GPG. Për ta bërë këtë, instaloni gnupg.

    yum install -y gnupg

  • Ne krijojmë një çelës duke iu përgjigjur pyetjeve. Kam përdorur emrin dhe emailin tim. Sigurohuni që të specifikoni fjalëkalimin për çelësin.

    gpg --gen-key 

  • Merrni informacionin kryesor

    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expires: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp <[email protected]>
    sub   rsa3072 2019-04-24 [E] [expires: none]

  • Ngarkimi i çelësit tonë publik në serverin e çelësave

    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net

  • Marrja e një çelësi privat

    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----

  • Shkoni te cilësimet e projektit -> Cilësimet -> CI / CD -> Variablat dhe ruajeni çelësin privat në një ndryshore GPG_SECRET_KEY
    Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

Për përmbajtjen

Konfigurimi i Maven

  • Krijo një çelës kryesor
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Shkoni te cilësimet e projektit -> Cilësimet -> CI / CD -> Variablat dhe ruajeni në një ndryshore SETTINGS_SECURITY_XML linjat e mëposhtme:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Kriptimi i fjalëkalimit nga llogaria Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Shkoni te cilësimet e projektit -> Cilësimet -> CI / CD -> Variablat dhe ruajeni në një ndryshore SETTINGS_XML linjat e mëposhtme:
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

ku,
GPG_SECRET_KEY_PASSPHRASE - fjalëkalimi i çelësit GPG
SONATYPE_USERNAME - identifikimi i llogarisë sonatype

Për përmbajtjen

Vendosni imazhin e dokerit

  • Ne krijojmë një Dockerfile mjaft të thjeshtë për të ekzekutuar detyrat në vendosje me versionin e dëshiruar 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ërtimi i një kontejneri për projektin tuaj

    docker build -t registry.gitlab.com/group/deploy .

  • Ne vërtetojmë dhe ngarkojmë kontejnerin në regjistër.

    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

Për përmbajtjen

GitLab CI

Vendosja e projektit

Shtoni skedarin .gitlab-ci.yml në rrënjën e projektit të vendosjes
Skenari paraqet dy detyra të vendosjes reciproke ekskluzive. Specific Runner ose Shared Runner respektivisht.

.gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # Задача будет выполняться на вашем shell-раннере
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # Задача будет выполняться на публичном docker-раннере
  tags:
    - docker
  # Образ из раздела GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # Импортируем GPG ключ
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # Сохраняем maven конфигурацию
    - printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # Задача сработает по триггеру, если передана переменная DEPLOY со значением java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # отключаем клонирование текущего проекта
    GIT_STRATEGY: none
  script:
    # Предоставляем возможность хранения пароля в незашифрованном виде
    - git config --global credential.helper store
    # Сохраняем временные креды пользователя gitlab-ci-token
    # Токен работает для всех публичных проектов gitlab.com и для проектов группы
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
    # Полностью чистим текущую директорию
    - rm -rf .* *
    # Клонируем проект который, будем деплоить в Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # Переключаемся на нужный коммит
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Если хоть один pom.xml содержит параметр autoReleaseAfterClose валим сборку.
    # В противном случае есть риск залить сырые артефакты в maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
          exit 1;
        fi;
      done
    # Если параметр DEPLOY_CI_COMMIT_TAG пустой, то принудительно ставим 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
    # Запускаем задачу на сборку и деплой артефактов
    - mvn clean deploy -DskipTests=true

Për përmbajtjen

Projekti Java

Në projektet java që supozohet se do të ngarkohen në depo publike, duhet të shtoni 2 hapa për të shkarkuar versionet Release dhe Snapshot.

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy

<...>

Release:
  extends: .trigger_deploy
  # Запускать задачу только пo тегу.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # Запускаем задачу на публикацию SNAPSHOT версии вручную
  when: manual
  # Не запускать задачу, если проставлен тег.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # Отключаем клонирование текущего проекта
    GIT_STRATEGY: none
    # Ссылка на триггер deploy-задачи
    URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
    # Переменные 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:
    # Не использую cURL, так как с флагами --fail --show-error
    # он не выводит тело ответа, если HTTP код 400 и более 
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

Në këtë zgjidhje, shkova pak më tej dhe vendosa të përdor një shabllon CI për projektet java.

Dëmet në detaje

Kam krijuar një projekt të veçantë gitlab-ci në të cilën ai vendosi shabllonin CI për projektet java e zakonshme.yml.

e zakonshme.yml

stages:
  - build
  - test
  - verify
  - deploy

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

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

.build_sphinx_doc:
  stage: build
  tags:
    - touchbit-shell
  variables:
    DOCKERFILE: .indirect/docs/Dockerfile
  script:
    - docker build --no-cache -t ${CI_PROJECT_NAME}/doc -f ${DOCKERFILE} .

.junit_module_test_run:
  stage: test
  tags:
    - touchbit-shell
  variables:
    MODULE: ""
  script:
    - cd ${MODULE}
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

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

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

.trigger_deploy:
  stage: deploy
  tags:
    - touchbit-shell
  variables:
    URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
  - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

.trigger_release_deploy:
  extends: .trigger_deploy
  only:
    - tags

.trigger_snapshot_deploy:
  extends: .trigger_deploy
  when: manual
  except:
    - tags

Si rezultat, në vetë projektet java, .gitlab-ci.yml duket shumë kompakte dhe jo e folur.

.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ër përmbajtjen

konfigurimin pom.xml

Kjo temë është përshkruar me shumë detaje. Googolplex в Konfigurimi i maven për të nënshkruar dhe ngarkuar automatikisht artefakte në magazinat e fotografive dhe skenave, kështu që unë do të përshkruaj disa nga nuancat e përdorimit të shtojcave. Unë gjithashtu do të përshkruaj se sa lehtë dhe natyrshëm mund të përdorni nexus-staging-maven-pluginnëse nuk dëshironi ose nuk mund të përdorni org.sonatype.oss:oss-parent si prind për projektin tuaj.

maven-install-plugin

Instalon module në depon lokale.
Shumë i dobishëm për verifikimin lokal të zgjidhjeve në projekte të tjera, si dhe një shumë kontrolli.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-project</id>
      <!-- Если у вас многомодульный проект с деплоем родительского помика -->
      <phase>install</phase>
      <!-- Явно указываем файлы для локальной установки -->
      <configuration>
        <file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
        <pomFile>dependency-reduced-pom.xml</pomFile>
        <!-- Принудительное обновление метаданных проекта -->
        <updateReleaseInfo>true</updateReleaseInfo>
        <!-- Контрольные суммы для проверки целостности -->
        <createChecksum>true</createChecksum>
      </configuration>
    </execution>
  </executions>
</plugin>

Për përmbajtjen

maven-javadoc-plugin

Gjenerimi i javadoc për projektin.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
      <!-- Генерация javadoc должна быть после фазы генерации ресурсов -->
      <phase>prepare-package</phase>
      <configuration>
        <!-- Очень помогает в публичных проектах -->
        <failOnError>true</failOnError>
        <failOnWarnings>true</failOnWarnings>
        <!-- Убирает ошибку поиска документации в target директории -->
        <detectOfflineLinks>false</detectOfflineLinks>
      </configuration>
    </execution>
  </executions>
</plugin>

Nëse keni një modul që nuk përmban java (për shembull vetëm burime)
Ose nuk doni të gjeneroni javadoc në parim, pastaj të ndihmoni maven-jar-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>empty-javadoc-jar</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <classifier>javadoc</classifier>
        <classesDirectory>${basedir}/javadoc</classesDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Për përmbajtjen

maven-gpg-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- Сборка будет падать, если отсутствует GPG ключ -->
      <!-- Подписываем артефакты только на фазе deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Për përmbajtjen

nexus-staging-maven-plugin

Konfigurimi:

<project>
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <!-- Обновляем метаданные, чтобы пометить артефакт как release -->
            <!-- Не влияет на snapshot версии -->
            <updateReleaseInfo>true</updateReleaseInfo>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <configuration>
            <!-- Отключаем плагин -->
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <distributionManagement>
    <snapshotRepository>
      <id>sonatype</id>
      <name>Nexus Snapshot Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype</id>
      <name>Nexus Release Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

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

<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <configuration>
        <skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
      </configuration>
    </plugin>
  </plugins>
</build>

Pas ngarkimit, versionet e çastit/arritjes janë të disponueshme në vënien në skenë të depove

<repositories>
  <repository>
    <id>SonatypeNexus</id>
    <url>https://oss.sonatype.org/content/groups/staging/</url>
    <!-- Не надо указывать флаги snapshot/release для репозитория -->
  </repository>
</repositories>

Më shumë pluse

  • Një listë shumë e pasur objektivash për të punuar me depon e nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Kontroll automatik i lëshimit për shkarkueshmërinë në maven central

Për përmbajtjen

Result

Publikimi i një versioni SNAPSHOT

Kur ndërtoni një projekt, është e mundur të filloni manualisht një detyrë për të shkarkuar versionin SNAPSHOT në nexus

Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

Kur niset kjo detyrë, aktivizohet detyra përkatëse në projektin e vendosjes (shembull).

log i prerë

Running with gitlab-runner 11.10.0 (3001a600)
  on Deploy runner JSKWyxUw
Using Shell executor...
Running on ih1174328.vds.myihor.ru...
Skipping Git repository setup
Skipping Git checkout
Skipping Git submodules setup
$ 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} .
Cloning into 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Note: checking out '850f86aa317194395c5387790da1350e437125a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
HEAD is now at 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # collapsed multi-line command
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # collapsed multi-line command
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Processing change of org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Processing org.touchbit.shields4j:shields4j-parent
[INFO]     Updating project org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:client
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:test-core
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:testng
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:client
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  0.992 s]
[INFO] test-core .......................................... SKIPPED
[INFO] Shields4J client ................................... SKIPPED
[INFO] TestNG listener 1.0.0 .............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.483 s
[INFO] Finished at: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO]  * Bulk deploy of locally gathered snapshot artifacts finished.
[INFO] Remote deploy finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUCCESS [  2.375 s]
[INFO] test-core .......................................... SUCCESS [  3.929 s]
[INFO] Shields4J client ................................... SUCCESS [  3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... SUCCESS [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.629 s
[INFO] Finished at: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Si rezultat, versioni nexus ngarkohet 1.0.0-VËSHTRIM.

Të gjitha versionet e fotografive mund të hiqen nga depoja në sit oss.sonatype.org nën llogarinë tuaj.

Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

Për përmbajtjen

Publikimi i versionit të lëshimit

Kur vendoset etiketa, detyra përkatëse në projektin e vendosjes aktivizohet automatikisht për të ngarkuar versionin e lëshimit në nexus (shembull).

Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

Pjesa më e mirë është se mbyllja e lëshimit aktivizohet automatikisht në nexus.

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1037".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  9.603 s]
[INFO] test-core .......................................... SUCCESS [  3.419 s]
[INFO] Shields4J client ................................... SUCCESS [  9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

Dhe nëse diçka shkoi keq, atëherë detyra do të dështojë

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1038".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1038".
Waiting for operation to complete...
.......
[ERROR] Rule failure while trying to close staging repository with ID "orgtouchbit-1039".
[ERROR] 
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR] 
[ERROR] Repository "orgtouchbit-1039" failures
[ERROR]   Rule "signature-staging" failures
[ERROR]     * No public key: Key with id: (1f42b618d1cbe1b5) was not able to be located on &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR]  * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR]  * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  4.073 s]
[INFO] test-core .......................................... SUCCESS [  2.788 s]
[INFO] Shields4J client ................................... SUCCESS [  3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

Si rezultat, na mbetet vetëm një zgjedhje. Ose fshijeni këtë version ose publikojeni.

Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

Pas lëshimit, pas ca kohësh, artefaktet do të jenë brenda Vendosja e GitLab CI për të ngarkuar një projekt java në maven central

jashtë temës

Ishte një zbulim për mua që maven indekson depo të tjera publike.
Më duhej të ngarkoja robots.txt sepse ai indeksonte depon time të vjetër.

Për përmbajtjen

Përfundim

Ajo që kemi

  • Një projekt i veçantë vendosjeje në të cilin mund të zbatoni disa detyra CI për ngarkimin e objekteve në depo publike për gjuhë të ndryshme zhvillimi.
  • Projekti i vendosjes është i izoluar nga ndërhyrjet e jashtme dhe mund të modifikohet vetëm nga përdoruesit me rolet Pronari dhe Mirëmbajtësi.
  • Një Runner specifik i veçantë me një memorie të fshehtë "të nxehtë" për të ekzekutuar vetëm detyrat e vendosura.
  • Publikimi i versioneve të çastit/arritjes në një depo publike.
  • Kontroll automatik i versionit të lëshimit për gatishmërinë për botim në maven central.
  • Mbrojtje kundër publikimit automatik të versioneve "të papërpunuara" në maven central.
  • Ndërtoni dhe publikoni versionet e fotografive "me klikim".
  • Depo e vetme për marrjen e versioneve të fotografive/shfaqjeve.
  • Tubacioni i përgjithshëm për ndërtimin / testimin / publikimin e një projekti java.

Vendosja e GitLab CI nuk është një temë aq e ndërlikuar sa duket në shikim të parë. Mjafton të vendosni CI në bazë të çelësit disa herë, dhe tani ju jeni larg nga një amator në këtë çështje. Për më tepër, dokumentacioni GitLab është shumë i tepërt. Mos kini frikë të hidhni hapin e parë. Rruga shfaqet nën hapat e personit që ecën (nuk e mbaj mend kush e tha :)

Unë do të jem i lumtur për reagime.

Në artikullin tjetër, unë do t'ju tregoj se si të konfiguroni GitLab CI për të ekzekutuar detyrat e testit të integrimit në mënyrë konkurruese (duke ekzekutuar shërbime testimi me docker-compose) nëse keni vetëm një ekzekutues shell.

Për përmbajtjen

Burimi: www.habr.com

Shto një koment