Поставување на GitLab CI за прикачување на java проект на maven central

Оваа статија е наменета за развивачите на Java кои треба брзо да ги објават своите производи во централните складишта сонатип и/или мавен користејќи GitLab. Во оваа статија, ќе зборувам за поставување gitlab-runner, gitlab-ci и maven-plugin за да се реши овој проблем.

Предуслови:

  • Безбедно складирање на клучеви mvn и GPG.
  • Безбедно извршување на јавни CI задачи.
  • Поставување артефакти (издание/снимка) во јавни складишта.
  • Автоматска проверка на верзиите за објавување во maven central.
  • Општо решение за поставување артефакти во складиште за повеќе проекти.
  • Едноставност и леснотија на користење.

содржина

Општи информации

  • Детален опис на механизмот за објавување артефакти на Maven Central преку услугата за хостирање на складиштето Sonatype OSS е веќе опишан во Оваа статија корисник Гуголплекс, па затоа ќе се осврнам на оваа статија на вистинските места.
  • Регистрирајте се однапред на Сонатип ЈИРА и започнете билет за отворање на складиштето (за повеќе детали, прочитајте го делот Направете билет за Sonatype JIRA). По отворањето на складиштето, парот за најава/лозинка JIRA (во натамошниот текст како сметка на Sonatype) ќе се користи за поставување артефакти во врската Sonatype.
  • Понатаму, процесот на генерирање на клуч GPG е опишан многу суво. Погледнете го делот за повеќе детали. Конфигурирање на GnuPG за потпишување артефакти
  • Ако ја користите конзолата на Linux за да генерирате клуч GPG (gnupg/gnupg2), тогаш треба да инсталирате rng-алатки да генерира ентропија. Во спротивно, генерирањето клучеви може да потрае многу долго.
  • Услуги за складирање јавен GPG клучеви

Кон содржината

Поставување проект за распоредување во GitLab

  • Пред сè, треба да креирате и конфигурирате проект во кој гасоводот ќе се складира за распоредување на артефакти. Го нареков мојот проект едноставно и некомплицирано - распоредување
  • По креирањето на складиштето, треба да го ограничите пристапот за да го промените складиштето.
    Одете во проектот -> Поставки -> Репозиториум -> Заштитени гранки. Ги бришеме сите правила и додаваме едно правило со Wildcard * со право на туркање и спојување само за корисниците со улогата Одржувачи. Ова правило ќе работи за сите корисници и на овој проект и на групата на која припаѓа овој проект.
    Поставување на GitLab CI за прикачување на java проект на maven central
  • Ако има неколку одржувачи, тогаш најдобро решение би било во принцип да се ограничи пристапот до проектот.
    Одете во проектот -> Поставки -> Општо -> Видливост, карактеристики на проектот, дозволи и поставете ја видливоста на проектот на Приватен.
    Имам проект во јавен пристап, бидејќи го користам мојот сопствен GitLab Runner и само јас имам пристап да го менувам складиштето. Па, всушност, не е во мој интерес да прикажувам приватни информации во јавните дневници на гасоводот.
  • Заострување на правилата за промена на складиштето
    Одете до проектот -> Поставки -> Репозиториум -> Правила за притиснување и поставете го ограничувањето на Committer, Проверете дали авторот е кориснички знаменца на GitLab. Јас исто така препорачувам поставување заложат потпишување, и поставете го знамето Reject unsigned commits.
  • Следно, треба да конфигурирате активирач за извршување на задачите
    Одете до проект -> Поставки -> CI / CD -> Активатори на гасоводот и креирајте нов токен за активирање
    Овој токен може веднаш да се додаде во општата конфигурација на променливи за група проекти.
    Одете во групата -> Поставки -> CI / CD -> Променливи и додадете променлива DEPLOY_TOKEN со тригер-токен во вредноста.

Кон содржината

GitLab Runner

Овој дел ја опишува конфигурацијата за извршување задачи при распоредување со користење на мајчин (Специфичен) и јавен (Споделен) тркач.

Специфичен тркач

Јас користам свои тркачи, затоа што пред сè е погодно, брзо, евтино.
За ранер препорачувам Linux VDS со 1 процесор, 2 GB RAM, 20 GB HDD. Цена на издавање ~ 3000₽ годишно.

Мојот тркач

За ранер земав VDS 4 CPU, 4 GB RAM, 50 GB SSD. Чинеше ~ 11000₽ и никогаш не зажалив.
Имам вкупно 7 машини. 5 на Аруба и 2 на ихор.

Значи, имаме тркач. Сега ќе го поставиме.
Одиме до машината преку SSH и инсталираме java, git, maven, gnupg2.

Кон содржината

Инсталирање на gitlab runner

  • Направете нова група runner
    sudo groupadd runner
  • Направете директориум за кешот на Maven и доделете групни права runner
    Можете да го прескокнете овој чекор ако не планирате да извршувате повеќе тркачи на иста машина.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Креирај корисник gitlab-deployer и додадете во групата runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Додај во датотека /etc/ssh/sshd_config следниот ред
    AllowUsers root@* [email protected]
  • Рестартирај sshd
    systemctl restart sshd
  • Поставете лозинка за корисникот gitlab-deployer (може да биде едноставно, бидејќи има ограничување за локалниот домаќин)
    passwd gitlab-deployer
  • Инсталирајте го 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
  • Одете на gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners и копирајте го токенот за регистрација

Екран

Поставување на GitLab CI за прикачување на java проект на maven central

  • Регистрирање на тркачот
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

процес

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!

  • Проверете дали тркачот е регистриран. Одете на gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners активирани за овој проект

Екран

Поставување на GitLab CI за прикачување на java проект на maven central

  • Додај одвоени услуга /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
  • Ја започнуваме услугата.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Проверуваме дали тркачот трча.

Пример

Поставување на GitLab CI за прикачување на java проект на maven central

Кон содржината

Генерирање на клучеви GPG

  • Од истата машина одиме преку ssh под корисникот gitlab-deployer (ова е важно за генерирање на клучеви GPG)

    ssh [email protected]

  • Ние генерираме клуч со одговарање на прашања. Го користев моето име и е-пошта.
    Не заборавајте да ја наведете лозинката за клучот. Артефактите ќе бидат потпишани со овој клуч.

    gpg --gen-key 

  • Проверка

    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

  • Поставување на нашиот јавен клуч на серверот за клучеви

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

Кон содржината

Поставување на Maven

  • Одиме под корисникот gitlab-deployer
    su gitlab-deployer 
  • Креирај мавен директориум складиштето и поврзете се со кешот (не правете грешка)
    Овој чекор може да се прескокне ако не планирате да стартувате неколку тркачи на иста машина.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Создадете главен клуч
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Креирајте датотека ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Шифрирање на лозинката од сметката на Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Креирајте датотека ~/.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>

каде,
GPG_SECRET_KEY_PASSPHRASE - лозинка за клучот GPG
SONATYPE_USERNAME - најавување на сметката на sonatype

Ова го комплетира поставувањето на тркачот, можете да продолжите до делот GitLab CI

Кон содржината

Заеднички тркач

Генерирање на клучеви GPG

  • Пред сè, треба да креирате клуч GPG. За да го направите ова, инсталирајте gnupg.

    yum install -y gnupg

  • Ние генерираме клуч со одговарање на прашања. Го користев моето име и е-пошта. Не заборавајте да ја наведете лозинката за клучот.

    gpg --gen-key 

  • Добијте клучни информации

    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]

  • Поставување на нашиот јавен клуч на серверот за клучеви

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

  • Добивање приватен клуч

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

  • Одете во поставките на проектот -> Поставки -> CI / CD -> Променливи и зачувајте го приватниот клуч во променлива GPG_SECRET_KEY
    Поставување на GitLab CI за прикачување на java проект на maven central

Кон содржината

Поставување на Maven

  • Создадете главен клуч
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Одете во поставките за проектот -> Поставки -> CI / CD -> Променливи и зачувајте во променлива SETTINGS_SECURITY_XML следните линии:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Шифрирање на лозинката од сметката на Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Одете во поставките за проектот -> Поставки -> CI / CD -> Променливи и зачувајте во променлива 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>

каде,
GPG_SECRET_KEY_PASSPHRASE - лозинка за клучот GPG
SONATYPE_USERNAME - најавување на сметката на sonatype

Кон содржината

Распоредете ја докерската слика

  • Ние создаваме прилично едноставен Dockerfile за извршување задачи при распоредување со саканата верзија на Java. Подолу е пример за алпски.

    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/

  • Изградба на контејнер за вашиот проект

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

  • Ние го автентицираме и вчитуваме контејнерот во регистарот.

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

Кон содржината

GitLab CI

Распоредување на проектот

Додадете ја датотеката .gitlab-ci.yml во коренот на проектот за распоредување
Сценариото претставува две взаемно ексклузивни задачи за распоредување. Специфичен тркач или споделен тркач соодветно.

.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

Кон содржината

Јава проект

Во java проектите што треба да се прикачат во јавни складишта, треба да додадете 2 чекори за да ги преземете верзиите Release и 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}

Во ова решение, отидов малку подалеку и решив да користам еден CI шаблон за java проекти.

Повеќе детали

Направив посебен проект гитлаб-ци во кој го сместил CI шаблонот за java проекти заеднички.yml.

заеднички.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

Како резултат на тоа, во самите Java-проекти, .gitlab-ci.yml изгледа многу компактно и не прецизно

.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

Кон содржината

pom.xml конфигурација

Оваа тема е опишана во многу детали. Гуголплекс в Поставување на maven за автоматско потпишување и поставување артефакти во складишта за слики и поставување, па ќе опишам некои од нијансите на користење на приклучоци. Исто така, ќе ви опишам колку лесно и природно можете да го користите nexus-staging-maven-pluginако не сакате или не можете да го користите org.sonatype.oss:oss-parent како родител за вашиот проект.

maven-install-plugin

Инсталира модули во локалното складиште.
Многу корисно за локална верификација на решенија во други проекти, како и контролна сума.

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

Кон содржината

maven-javadoc-приклучок

Генерирање javadoc за проектот.

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

Ако имате модул кој не содржи java (на пример само ресурси)
Или во принцип не сакате да генерирате javadoc, па да помогнете 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>

Кон содржината

maven-gpg-приклучок

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

Кон содржината

nexus-staging-maven-plugin

Конфигурација:

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

Ако имате проект со повеќе модули и не треба да прикачувате одреден модул во складиштето, тогаш треба да додадете во pom.xml на овој модул nexus-staging-maven-plugin со знаме skipNexusStagingDeployMojo

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

По поставувањето на снимката/верзиите за издавање се достапни во стационирање складишта

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

Повеќе плус

  • Многу богата листа на цели за работа со складиштето на nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Автоматска проверка на ослободување за можност за преземање во Maven Central

Кон содржината

Резултира

Објавување на SNAPSHOT верзија

Кога градите проект, можно е рачно да започнете задача за да ја преземете верзијата SNAPSHOT на nexus

Поставување на GitLab CI за прикачување на java проект на maven central

Кога ќе се стартува оваа задача, се активира соодветната задача во проектот за распоредување (пример).

исечен дневник

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

Како резултат на тоа, верзијата е вчитана во nexus 1.0.0-СНЕГ.

Сите верзии на слики може да се отстранат од складиштето на страницата oss.sonatype.org под вашата сметка.

Поставување на GitLab CI за прикачување на java проект на maven central

Кон содржината

Објавување на верзијата за ослободување

Кога ознаката е поставена, соодветната задача во проектот за распоредување автоматски се активира за да се постави верзијата за издавање на nexus (пример).

Поставување на GitLab CI за прикачување на java проект на maven central

Најдобриот дел е што затворањето автоматски се активира во 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] ------------------------------------------------------------------------

И ако нешто тргна наопаку, тогаш задачата ќе пропадне

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

Како резултат на тоа, ни останува само еден избор. Или избришете ја оваа верзија или објавете.

Поставување на GitLab CI за прикачување на java проект на maven central

По пуштањето, по некое време, артефактите ќе бидат внатре Поставување на GitLab CI за прикачување на java проект на maven central

надвор од темата

За мене беше откритие дека Maven индексира други јавни складишта.
Морав да подигнам robots.txt бидејќи го индексираше моето старо складиште.

Кон содржината

Заклучок

Она што го имаме

  • Посебен проект за распоредување во кој можете да имплементирате неколку CI задачи за поставување артефакти во јавни складишта за различни јазици за развој.
  • Проектот за распоредување е изолиран од надворешни пречки и може да се менува само од корисници со улоги Сопственик и Одржувач.
  • Посебен Специфичен тркач со „жешка“ кеш за извршување само распоредување задачи.
  • Објавување на верзии на слика/издание во јавно складиште.
  • Автоматска проверка на верзијата за пуштање за подготвеност за објавување во maven central.
  • Заштита од автоматско објавување на „суровини“ верзии во maven central.
  • Изградете и објавувајте верзии на снимки „на кликнување“.
  • Единечно складиште за добивање верзии на слики/изданија.
  • Генерален цевковод за градење / тестирање / објавување на java проект.

Поставувањето на GitLab CI не е толку комплицирана тема како што изгледа на прв поглед. Доволно е неколку пати да поставите CI на клуч на рака, а сега сте далеку од аматер во ова прашање. Покрај тоа, GitLab документацијата е многу излишна. Не плашете се да го направите првиот чекор. Патот се појавува под чекорите на човекот што оди (не се сеќавам кој го кажа тоа :)

Ќе ми биде драго да имам повратни информации.

Во следната статија, ќе ви покажам како да го поставите GitLab CI за конкурентно да ги извршува задачите за тестирање на интеграцијата (водење услуги за тестирање со docker-compose) ако имате само еден ранер на школка.

Кон содржината

Извор: www.habr.com

Додадете коментар