GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

Šis raksts ir paredzēts Java izstrādātājiem, kuriem ātri jāpublicē savi produkti sonatype un/vai maven centrālajos krātuvēs, izmantojot GitLab. Šajā rakstā es runāšu par gitlab-runner, gitlab-ci un maven-plugin iestatīšanu, lai atrisinātu šo problēmu.

Priekšnosacījumi:

  • Droša mvn un GPG atslēgu uzglabāšana.
  • Droša publisko KI uzdevumu izpilde.
  • Artefaktu (izlaidums/momentuzņēmums) augšupielāde publiskajās krātuvēs.
  • Automātiska izlaiduma versiju pārbaude publicēšanai Maven central.
  • Vispārīgs risinājums artefaktu augšupielādei krātuvē vairākiem projektiem.
  • Vienkāršība un lietošanas ērtums.

saturs

Vispārēja informācija

  • Detalizēts mehānisma apraksts artefaktu publicēšanai Maven Central, izmantojot Sonatype OSS repozitorija mitināšanas pakalpojumu, jau ir aprakstīts Šis raksts lietotājs Googolplex, tāpēc es atsaukšos uz šo rakstu pareizajās vietās.
  • Iepriekšēja reģistrācija plkst Sonatips JIRA un sāciet biļeti, lai atvērtu repozitoriju (sīkāku informāciju lasiet sadaļā Izveidojiet Sonatype JIRA biļeti). Pēc repozitorija atvēršanas JIRA pieteikšanās/paroles pāris (turpmāk – Sonatype konts) tiks izmantots, lai augšupielādētu artefaktus Sonatype saiknē.
  • Turklāt GPG atslēgas ģenerēšanas process ir aprakstīts ļoti sausi. Sīkāku informāciju skatiet sadaļā. GnuPG konfigurēšana artefaktu parakstīšanai
  • Ja izmantojat Linux konsoli, lai ģenerētu GPG atslēgu (gnupg/gnupg2), jums ir jāinstalē rng-tools lai radītu entropiju. Pretējā gadījumā atslēgu ģenerēšana var aizņemt ļoti ilgu laiku.
  • Uzglabāšanas pakalpojumi publiski GPG atslēgas

Uz saturu

Izvietošanas projekta iestatīšana GitLab

  • Pirmkārt, jums ir jāizveido un jākonfigurē projekts, kurā tiks saglabāts cauruļvads artefaktu izvietošanai. Es savu projektu nosaucu vienkārši un nesarežģīti - izvietot
  • Pēc repozitorija izveides jums jāierobežo piekļuve, lai mainītu repozitoriju.
    Dodieties uz projektu -> Iestatījumi -> Repozitorijs -> Aizsargātās filiāles. Mēs dzēšam visas kārtulas un pievienojam vienu kārtulu ar aizstājējzīmi * ar tiesībām nospiest un apvienot tikai lietotājiem, kuriem ir uzturētāja loma. Šī kārtula darbosies visiem lietotājiem gan šajā projektā, gan grupā, kurai šis projekts pieder.
    GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central
  • Ja ir vairāki uzturētāji, tad labākais risinājums būtu principā ierobežot pieeju projektam.
    Dodieties uz projektu -> Iestatījumi -> Vispārīgi -> Redzamība, projekta līdzekļi, atļaujas un iestatiet Projekta redzamību uz Privāts.
    Man ir publiski pieejams projekts, jo es izmantoju savu GitLab Runner un tikai man ir piekļuve, lai mainītu repozitoriju. Nu, patiesībā manās interesēs nav rādīt privātu informāciju publiskajos cauruļvadu žurnālos.
  • Stingrāki repozitorija maiņas noteikumi
    Dodieties uz projektu -> Iestatījumi -> Repozitorijs -> Push Rules un iestatiet karogus Committer ierobežojums, Pārbaudiet, vai autors ir GitLab lietotājs. Iesaku arī iestatīt apņemas parakstītiesun iestatiet karogu Noraidīt neparakstītas saistības.
  • Pēc tam jums ir jākonfigurē aktivizētājs, lai palaistu uzdevumus
    Dodieties uz projekts -> Iestatījumi -> CI / CD -> Cauruļvada aktivizētāji un izveidojiet jaunu trigeri
    Šo marķieri var nekavējoties pievienot vispārējai mainīgo konfigurācijai projektu grupai.
    Dodieties uz grupu -> Iestatījumi -> CI / CD -> Mainīgie un pievienojiet mainīgo DEPLOY_TOKEN ar sprūda marķieri vērtībā.

Uz saturu

GitLab skrējējs

Šajā sadaļā ir aprakstīta konfigurācija uzdevumu izpildei, izvietojot, izmantojot vietējo (specifisko) un publisko (koplietoto) palaidēju.

Konkrēts skrējējs

Es izmantoju savus skrējējus, jo vispirms tas ir ērti, ātri, lēti.
Skrējējiem iesaku Linux VDS ar 1 CPU, 2 GB RAM, 20 GB HDD. Emisijas cena ~ 3000₽ gadā.

Mans skrējējs

Skrējējam paņēmu VDS 4 CPU, 4 GB RAM, 50 GB SSD. Tas maksāja ~11000₽ un nekad to nenožēloju.
Man kopā ir 7 mašīnas. 5 uz arubas un 2 uz ihor.

Tātad, mums ir skrējējs. Tagad mēs to iestatīsim.
Mēs ejam uz mašīnu caur SSH un instalējam java, git, maven, gnupg2.

Uz saturu

Gitlab runner instalēšana

  • Izveidojiet jaunu grupu runner
    sudo groupadd runner
  • Izveidojiet maven kešatmiņas direktoriju un piešķiriet grupas tiesības runner
    Varat izlaist šo darbību, ja neplānojat vienā mašīnā palaist vairākus skrējējus.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Izveidojiet lietotāju gitlab-deployer un pievienot grupai runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Pievienot failam /etc/ssh/sshd_config nākamā rinda
    AllowUsers root@* [email protected]
  • Reboot sshd
    systemctl restart sshd
  • Iestatiet lietotāja paroli gitlab-deployer (tas var būt vienkārši, jo vietējam resursdatoram ir ierobežojumi)
    passwd gitlab-deployer
  • Instalējiet 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
  • Dodieties uz gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners un kopējiet reģistrācijas pilnvaru

Ekrāns

GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

  • Skrējēja reģistrācija
    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
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!

  • Pārbaudiet, vai skrējējs ir reģistrēts. Dodieties uz gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners Activated for this project.

Ekrāns

GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

  • Pievienot atsevišķi pakalpojumu /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
  • Mēs sākam pakalpojumu.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Pārbaudiet, vai skrējējs darbojas.

Piemērs

GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

Uz saturu

GPG atslēgu ģenerēšana

  • No tās pašas mašīnas mēs ejam caur ssh zem lietotāja gitlab-deployer (tas ir svarīgi GPG atslēgu ģenerēšanai)

    ssh [email protected]

  • Mēs ģenerējam atslēgu, atbildot uz jautājumiem. Es izmantoju savu vārdu un e-pastu.
    Noteikti norādiet atslēgas paroli. Artefakti tiks parakstīti ar šo atslēgu.

    gpg --gen-key 

  • Pārbaude

    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

  • Notiek mūsu publiskās atslēgas augšupielāde atslēgu serverī

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

Uz saturu

Maven iestatīšana

  • Mēs ejam zem lietotāja gitlab-deployer
    su gitlab-deployer 
  • Izveidojiet maven direktoriju krātuve un saite ar kešatmiņu (nekļūdieties)
    Šo soli var izlaist, ja neplānojat ar vienu mašīnu skriet vairākus skrējējus.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Izveidojiet galveno atslēgu
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Izveidojiet failu ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Paroles šifrēšana no Sonatype konta
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Izveidojiet failu ~/.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>

kur,
GPG_SECRET_KEY_PASSPHRASE — GPG atslēgas parole
SONATYPE_USERNAME — sonatype konta pieteikšanās

Tas pabeidz skrējēja iestatīšanu, varat pāriet uz sadaļu GitLab CI

Uz saturu

Kopīgs skrējējs

GPG atslēgu ģenerēšana

  • Pirmkārt, jums ir jāizveido GPG atslēga. Lai to izdarītu, instalējiet gnupg.

    yum install -y gnupg

  • Mēs ģenerējam atslēgu, atbildot uz jautājumiem. Es izmantoju savu vārdu un e-pastu. Noteikti norādiet atslēgas paroli.

    gpg --gen-key 

  • Iegūstiet galveno informāciju

    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]

  • Notiek mūsu publiskās atslēgas augšupielāde atslēgu serverī

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

  • Privātās atslēgas iegūšana

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

  • Dodieties uz projekta iestatījumiem -> Iestatījumi -> CI / CD -> Mainīgie un saglabājiet privāto atslēgu mainīgajā. GPG_SECRET_KEY
    GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

Uz saturu

Maven iestatīšana

  • Izveidojiet galveno atslēgu
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Dodieties uz projekta iestatījumiem -> Iestatījumi -> CI / CD -> Mainīgie un saglabājiet mainīgajā SETTINGS_SECURITY_XML šādas rindas:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Paroles šifrēšana no Sonatype konta
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Dodieties uz projekta iestatījumiem -> Iestatījumi -> CI / CD -> Mainīgie un saglabājiet mainīgajā SETTINGS_XML šādas rindas:
    <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>

kur,
GPG_SECRET_KEY_PASSPHRASE — GPG atslēgas parole
SONATYPE_USERNAME — sonatype konta pieteikšanās

Uz saturu

Izvietot Docker attēlu

  • Mēs izveidojam diezgan vienkāršu Dockerfile, lai izpildītu uzdevumus izvietošanas laikā ar vēlamo Java versiju. Zemāk ir Alpu piemērs.

    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/

  • Konteinera izveidošana savam projektam

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

  • Mēs autentificējamies un ielādējam konteineru reģistrā.

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

Uz saturu

GitLab CI

Izvietot projektu

Pievienojiet failu .gitlab-ci.yml izvietošanas projekta saknei
Skripts piedāvā divus savstarpēji izslēdzošus izvietošanas uzdevumus. Attiecīgi īpašs skrējējs vai koplietots skrējējs.

.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

Uz saturu

Java projekts

Java projektos, kas ir jāaugšupielādē publiskajās krātuvēs, ir jāpievieno 2 darbības, lai lejupielādētu versijas Release un 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}

Šajā risinājumā es devos nedaudz tālāk un nolēmu izmantot vienu CI veidni java projektiem.

Sīkāka informācija

Es izveidoju atsevišķu projektu gitlab-ci kurā viņš ievietoja Java projektu CI veidni kopīgs.yml.

kopīgs.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

Rezultātā pašos java projektos .gitlab-ci.yml izskatās ļoti kompakts un nav daudznozīmīgs

.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

Uz saturu

pom.xml konfigurācija

Šī tēma ir aprakstīta ļoti detalizēti. Googolplex в Maven iestatīšana, lai tā automātiski parakstītu un augšupielādētu artefaktus momentuzņēmumu un inscenēšanas krātuvēs, tāpēc aprakstīšu dažas spraudņu lietošanas nianses. Es arī aprakstīšu, cik viegli un dabiski jūs varat izmantot nexus-staging-maven-pluginja nevēlaties vai nevarat izmantot org.sonatype.oss:oss-parent kā sava projekta vecāku.

maven-install-plugin

Instalē moduļus vietējā repozitorijā.
Ļoti noderīga vietējai risinājumu pārbaudei citos projektos, kā arī kontrolsummai.

<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>

Uz saturu

maven-javadoc-spraudnis

Notiek javadoc ģenerēšana projektam.

<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>

Ja jums ir modulis, kurā nav Java (piemēram, tikai resursi)
Vai arī principā negribi ģenerēt javadoc, tad lai palīdz 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>

Uz saturu

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>

Uz saturu

nexus-staging-maven-plugin

Konfigurācija:

<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>

Ja jums ir vairāku moduļu projekts un jums nav jāaugšupielādē konkrēts modulis repozitorijā, jums tas ir jāpievieno šī moduļa pom.xml. nexus-staging-maven-plugin ar karogu skipNexusStagingDeployMojo

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

Pēc momentuzņēmuma/izlaiduma augšupielādes ir pieejamas versijas inscenēšanas krātuves

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

Vairāk plusu

  • Ļoti bagātīgs mērķu saraksts darbam ar nexus repozitoriju (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Automātiska izlaišanas pārbaude lejupielādējamībai Maven central

Uz saturu

Piedzīvojiet efektīvu rezultātu spēku

SNAPSHOT versijas publicēšana

Veidojot projektu, ir iespējams manuāli sākt uzdevumu, lai lejupielādētu SNAPSHOT versiju uz nexus

GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

Kad šis uzdevums tiek palaists, tiek aktivizēts attiecīgais uzdevums izvietošanas projektā (piemērs).

apgriezts baļķis

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] ------------------------------------------------------------------------

Rezultātā tiek ielādēta nexus versija 1.0.0-SNAPSHOT.

Visas momentuzņēmumu versijas var noņemt no vietnes krātuves oss.sonatype.org zem sava konta.

GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

Uz saturu

Izlaiduma versijas publicēšana

Kad tags ir iestatīts, attiecīgais uzdevums izvietošanas projektā tiek automātiski aktivizēts, lai augšupielādētu laidiena versiju nexus (piemērs).

GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

Labākā daļa ir tāda, ka ciešā atbrīvošana automātiski aktivizējas savienojumā.

[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] ------------------------------------------------------------------------

Un, ja kaut kas nogāja greizi, tad uzdevums neizdosies

[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] ------------------------------------------------------------------------

Rezultātā mums paliek tikai viena izvēle. Vai dzēsiet šo versiju vai publicējiet.

GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

Pēc izlaišanas, pēc kāda laika, artefakti būs iekšā GitLab CI iestatīšana, lai augšupielādētu java projektu Maven central

ne par tēmu

Man bija atklājums, ka maven indeksē citus publiskos repozitorijus.
Man bija jāaugšupielādē robots.txt, jo tas indeksēja manu veco repozitoriju.

Uz saturu

Secinājums

Kas mums ir

  • Atsevišķs izvietošanas projekts, kurā varat īstenot vairākus CI uzdevumus, lai augšupielādētu artefaktus publiskajās krātuvēs dažādām izstrādes valodām.
  • Izvietošanas projekts ir izolēts no ārējiem traucējumiem, un to var mainīt tikai lietotāji ar īpašnieka un uzturētāja lomu.
  • Atsevišķs īpašs skrējējs ar “karstu” kešatmiņu, lai palaistu tikai izvietošanas uzdevumus.
  • Momentuzņēmumu/izlaiduma versiju publicēšana publiskā repozitorijā.
  • Automātiska izlaiduma versijas gatavības pārbaude publicēšanai Maven central.
  • Aizsardzība pret “neapstrādātu” versiju automātisku publicēšanu Maven Central.
  • Veidojiet un publicējiet momentuzņēmumu versijas “noklikšķinot”.
  • Viena repozitorija momentuzņēmumu/izlaiduma versiju iegūšanai.
  • Vispārējs cauruļvads Java projekta izveidei/testēšanai/publicēšanai.

GitLab CI iestatīšana nav tik sarežģīta tēma, kā šķiet no pirmā acu uzmetiena. Pietiek pāris reizes iestatīt CI pēc atslēgas principa, un tagad jūs šajā jautājumā esat tālu no amatiera. Turklāt GitLab dokumentācija ir ļoti lieka. Nebaidieties spert pirmo soli. Ceļš parādās zem ejošā cilvēka soļiem (neatceros, kurš to teica :)

Priecāšos par atsauksmēm.

Nākamajā rakstā es jums parādīšu, kā iestatīt GitLab CI, lai konkurētspējīgi izpildītu integrācijas testa uzdevumus (palaist testa pakalpojumus ar docker-compose), ja jums ir tikai viens čaulas palaidējs.

Uz saturu

Avots: www.habr.com

Pievieno komentāru