Postavljanje GitLab CI za prijenos java projekta na maven central

Ovaj je članak namijenjen Java programerima koji trebaju brzo objaviti svoje proizvode u sonatype i/ili maven središnjim spremištima pomoću GitLaba. U ovom ću članku govoriti o postavljanju gitlab-runnera, gitlab-ci i maven-plugina za rješavanje ovog problema.

Preduvjeti:

  • Sigurno skladištenje mvn i GPG ključeva.
  • Sigurno izvršavanje javnih CI zadataka.
  • Prijenos artefakata (izdanje/snimak) u javna spremišta.
  • Automatska provjera verzija izdanja za objavljivanje u maven centrali.
  • Općenito rješenje za učitavanje artefakata u repozitorij za više projekata.
  • Jednostavnost i lakoća korištenja.

sadržaj

Opće informacije

  • Detaljan opis mehanizma za objavljivanje artefakata u Maven Central putem Sonatype OSS Repository Hosting Service već je opisan u ovaj članak korisnik googolplex, pa ću se referirati na ovaj članak na pravim mjestima.
  • Predbilježbe na Sonatip JIRA i pokrenite ulaznicu za otvaranje spremišta (za više detalja pročitajte odjeljak Izradite kartu Sonatype JIRA). Nakon otvaranja repozitorija, JIRA par prijava/lozinka (u daljnjem tekstu Sonatype račun) koristit će se za učitavanje artefakata na Sonatype nexus.
  • Nadalje, proces generiranja GPG ključa opisan je vrlo suhoparno. Za više detalja pogledajte odjeljak. Konfiguriranje GnuPG-a za potpisivanje artefakata
  • Ako koristite Linux konzolu za generiranje GPG ključa (gnupg/gnupg2), tada trebate instalirati RNG-alati za stvaranje entropije. U suprotnom, generiranje ključa može potrajati jako dugo.
  • Usluge skladištenja javnost GPG ključevi

Na sadržaj

Postavljanje projekta implementacije u GitLabu

  • Prije svega, morate stvoriti i konfigurirati projekt u kojem će se cjevovod pohraniti za implementaciju artefakata. Svoj sam projekt nazvao jednostavno i nekomplicirano - razviti
  • Nakon stvaranja repozitorija, morate ograničiti pristup za promjenu repozitorija.
    Idite na projekt -> Postavke -> Repozitorij -> Zaštićene grane. Brišemo sva pravila i dodajemo jedno pravilo sa zamjenskim znakom * s pravom guranja i spajanja samo za korisnike s ulogom održavatelja. Ovo pravilo će raditi za sve korisnike i ovog projekta i grupe kojoj ovaj projekt pripada.
    Postavljanje GitLab CI za prijenos java projekta na maven central
  • Ako postoji više održavatelja, onda bi najbolje rješenje bilo načelno ograničiti pristup projektu.
    Idite na projekt -> Postavke -> Općenito -> Vidljivost, značajke projekta, dopuštenja i postavite vidljivost projekta na Privatni.
    Imam projekt u javnom pristupu, budući da koristim vlastiti GitLab Runner i samo ja imam pristup modificiranju repozitorija. Pa, zapravo nije u mom interesu prikazivati ​​privatne podatke u javnim zapisnicima cjevovoda.
  • Pooštravanje pravila za promjenu repozitorija
    Idite na projekt -> Postavke -> Repozitorij -> Push Rules i postavite zastavice Ograničenje predavača, Provjerite je li autor korisnik GitLaba. Također preporučujem postavljanje izvršiti potpisivanje, i postavite oznaku Odbaci nepotpisane obveze.
  • Zatim trebate konfigurirati okidač za pokretanje zadataka
    Idite na projekt -> Postavke -> CI / CD -> Okidači cjevovoda i izradite novi token okidača
    Ovaj se token može odmah dodati općoj konfiguraciji varijabli za grupu projekata.
    Idite na grupu -> Postavke -> CI / CD -> Varijable i dodajte varijablu DEPLOY_TOKEN s trigger-tokenom u vrijednosti.

Na sadržaj

GitLab trkač

Ovaj odjeljak opisuje konfiguraciju za pokretanje zadataka pri implementaciji pomoću izvornog (specifičnog) i javnog (dijeljenog) pokretača.

Specifični trkač

Koristim vlastite trkače, jer je prije svega zgodno, brzo, jeftino.
Za trkače preporučujem Linux VDS s 1 CPU, 2 GB RAM-a, 20 GB HDD. Cijena izdavanja ~ 3000₽ godišnje.

Moj trkač

Za runner sam uzeo VDS 4 CPU, 4 GB RAM-a, 50 GB SSD. Koštao je ~11000₽ i nikada nisam požalio.
Imam ukupno 7 mašina. 5 na arubi i 2 na ihoru.

Dakle, imamo trkača. Sada ćemo to postaviti.
Idemo na stroj preko SSH-a i instaliramo java, git, maven, gnupg2.

Na sadržaj

Instalacija gitlab runnera

  • Stvorite novu grupu runner
    sudo groupadd runner
  • Stvorite direktorij za maven cache i dodijelite grupna prava runner
    Ovaj korak možete preskočiti ako ne planirate pokretati više runnera na istom stroju.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Stvorite korisnika gitlab-deployer i dodati u grupu runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Dodaj u datoteku /etc/ssh/sshd_config sljedeći redak
    AllowUsers root@* [email protected]
  • Ponovno podizanje sustava sshd
    systemctl restart sshd
  • Postavite lozinku za korisnika gitlab-deployer (može biti jednostavno, budući da postoji ograničenje za localhost)
    passwd gitlab-deployer
  • Instalirajte 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
  • Idite na gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners i kopirajte registracijski token

Zaslon

Postavljanje GitLab CI za prijenos java projekta na maven central

  • Registracija trkača
    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!

  • Provjerite je li trkač registriran. Idite na gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners aktivirani za ovaj projekt

Zaslon

Postavljanje GitLab CI za prijenos java projekta na maven central

  • Dodavanje odvojen usluga /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
  • Pokrećemo uslugu.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Provjerite radi li trkač.

Primjer

Postavljanje GitLab CI za prijenos java projekta na maven central

Na sadržaj

Generiranje GPG ključa

  • S istog stroja idemo preko ssh-a pod korisnikom gitlab-deployer (ovo je važno za generiranje GPG ključa)

    ssh [email protected]

  • Generiramo ključ odgovarajućim na pitanja. Koristio sam svoje ime i e-mail.
    Obavezno navedite lozinku za ključ. Artefakti će biti potpisani ovim ključem.

    gpg --gen-key 

  • Provjeravanje

    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

  • Prijenos našeg javnog ključa na poslužitelj ključeva

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

Na sadržaj

Maven postava

  • Idemo ispod korisnika gitlab-deployer
    su gitlab-deployer 
  • Stvorite maven direktorij Skladište i povezati s predmemorijom (da ne bude greške)
    Ovaj se korak može preskočiti ako ne planirate pokrenuti nekoliko runnera na istom stroju.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Stvorite glavni ključ
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Stvorite datoteku ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Šifriranje lozinke sa Sonatype računa
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Stvorite datoteku ~/.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>

gdje,
GPG_SECRET_KEY_PASSPHRASE - lozinka GPG ključa
SONATYPE_USERNAME - prijava na sonatype račun

Ovo dovršava postavljanje trkača, možete nastaviti na odjeljak GitLab CI

Na sadržaj

Zajednički trkač

Generiranje GPG ključa

  • Prije svega, trebate izraditi GPG ključ. Da biste to učinili, instalirajte gnupg.

    yum install -y gnupg

  • Generiramo ključ odgovarajućim na pitanja. Koristio sam svoje ime i e-mail. Obavezno navedite lozinku za ključ.

    gpg --gen-key 

  • Dohvaćanje ključnih informacija

    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]

  • Prijenos našeg javnog ključa na poslužitelj ključeva

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

  • Dobivanje privatnog ključa

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

  • Idite na postavke projekta -> Postavke -> CI / CD -> Varijable i spremite privatni ključ u varijablu GPG_SECRET_KEY
    Postavljanje GitLab CI za prijenos java projekta na maven central

Na sadržaj

Maven postava

  • Stvorite glavni ključ
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Idite na postavke projekta -> Postavke -> CI / CD -> Varijable i spremite u varijablu SETTINGS_SECURITY_XML sljedeće retke:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Šifriranje lozinke sa Sonatype računa
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Idite na postavke projekta -> Postavke -> CI / CD -> Varijable i spremite u varijablu SETTINGS_XML sljedeće retke:
    <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>

gdje,
GPG_SECRET_KEY_PASSPHRASE - lozinka GPG ključa
SONATYPE_USERNAME - prijava na sonatype račun

Na sadržaj

Implementiraj docker sliku

  • Stvaramo prilično jednostavnu Dockerfile za pokretanje zadataka pri postavljanju sa željenom verzijom Jave. Ispod je primjer za 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/

  • Izrada kontejnera za vaš projekt

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

  • Provjeravamo autentičnost i učitavamo spremnik u registar.

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

Na sadržaj

GitLab CI

Implementacija projekta

Dodajte datoteku .gitlab-ci.yml u korijen projekta implementacije
Skripta predstavlja dva međusobno isključiva zadatka postavljanja. Određeni trkač ili zajednički trkač.

.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

Na sadržaj

Java projekt

U java projektima koji bi se trebali prenijeti u javna spremišta, morate dodati 2 koraka za preuzimanje verzija Release i 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}

U ovom rješenju otišao sam malo dalje i odlučio koristiti jedan CI predložak za java projekte.

Više pojedinosti

Napravio sam zaseban projekt gitlab-ci u koji je smjestio CI predložak za java projekte zajednički.yml.

zajednički.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

Kao rezultat toga, u samim java projektima, .gitlab-ci.yml izgleda vrlo kompaktno i nije opširno

.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

Na sadržaj

konfiguracija pom.xml

Ova tema je vrlo detaljno opisana. googolplex в Postavljanje maven-a za automatsko potpisivanje i učitavanje artefakata u spremišta snimaka i probnih repozitorija, pa ću opisati neke od nijansi korištenja dodataka. Također ću opisati koliko jednostavno i prirodno možete koristiti nexus-staging-maven-pluginako ne želite ili ne možete koristiti org.sonatype.oss:oss-parent kao nadređenog za svoj projekt.

maven-install-plugin

Instalira module u lokalno spremište.
Vrlo korisno za lokalnu provjeru rješenja u drugim projektima, kao i kontrolni zbroj.

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

Na sadržaj

maven-javadoc-dodatak

Generiranje javadoc za projekt.

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

Ako imate modul koji ne sadrži Java (na primjer samo resurse)
Ili ne želite generirati javadoc u načelu, onda pomoći 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>

Na sadržaj

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>

Na sadržaj

nexus-staging-maven-plugin

Konfiguracija:

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

Ako imate projekt s više modula i ne trebate učitati određeni modul u repozitorij, tada trebate dodati u pom.xml ovog modula nexus-staging-maven-plugin sa zastavom skipNexusStagingDeployMojo

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

Nakon učitavanja snimke/izdanja verzije su dostupne u scenska spremišta

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

Više pluseva

  • Vrlo bogat popis ciljeva za rad s nexus repozitorijem (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Automatsko izdanje provjerava mogućnost preuzimanja u maven centrali

Na sadržaj

Rezultirati

Objavljivanje SNAPSHOT verzije

Prilikom izrade projekta, moguće je ručno pokrenuti zadatak za preuzimanje SNAPSHOT verzije na nexus

Postavljanje GitLab CI za prijenos java projekta na maven central

Kada se ovaj zadatak pokrene, pokreće se odgovarajući zadatak u projektu implementacije (primjer).

obrezani balvan

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

Kao rezultat toga, učitava se verzija nexusa 1.0.0-SNIMKA.

Sve verzije snimaka mogu se ukloniti iz repozitorija na stranici oss.sonatype.org pod vašim računom.

Postavljanje GitLab CI za prijenos java projekta na maven central

Na sadržaj

Objava verzije izdanja

Kada je oznaka postavljena, automatski se pokreće odgovarajući zadatak u projektu implementacije za prijenos verzije izdanja na nexus (primjer).

Postavljanje GitLab CI za prijenos java projekta na maven central

Najbolji dio je što se zatvaranje automatski aktivira u nexusu.

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

A ako je nešto pošlo po zlu, zadatak neće uspjeti

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

Kao rezultat toga, ostaje nam samo jedan izbor. Ili izbrišite ovu verziju ili objavite.

Postavljanje GitLab CI za prijenos java projekta na maven central

Nakon izlaska, nakon nekog vremena, artefakti će biti unutra Postavljanje GitLab CI za prijenos java projekta na maven central

offtopic

Za mene je bilo otkriće da maven indeksira druga javna spremišta.
Morao sam učitati robots.txt jer je indeksirao moje staro spremište.

Na sadržaj

Zaključak

Ono što imamo

  • Zaseban implementacijski projekt u kojem možete implementirati nekoliko CI zadataka za učitavanje artefakata u javna spremišta za različite razvojne jezike.
  • Projekt implementacije izoliran je od vanjskih smetnji i mogu ga mijenjati samo korisnici s ulogama vlasnika i održavatelja.
  • Zasebni Specific Runner s "vrućom" predmemorijom za pokretanje samo zadataka implementacije.
  • Objava verzija snimke/izdanja u javnom repozitoriju.
  • Automatska provjera spremnosti verzije izdanja za objavljivanje u maven centrali.
  • Zaštita od automatskog objavljivanja "sirovih" verzija u maven centrali.
  • Izradite i objavite verzije snimki "na klik".
  • Jedno spremište za dobivanje verzija snimke/izdanja.
  • Opći cjevovod za izgradnju / testiranje / objavljivanje java projekta.

Postavljanje GitLab CI nije tako komplicirana tema kao što se na prvi pogled čini. Dovoljno je nekoliko puta postaviti CI po principu "ključ u ruke", a sada ste daleko od amatera po ovom pitanju. Štoviše, GitLab dokumentacija je vrlo suvišna. Nemojte se bojati napraviti prvi korak. Cesta se pojavljuje ispod koraka osobe koja hoda (ne sjećam se tko je to rekao :)

Bit će mi drago povratnim informacijama.

U sljedećem ću vam članku pokazati kako postaviti GitLab CI za konkurentno pokretanje zadataka testa integracije (izvođenje testnih usluga s docker-compose) ako imate samo jedan pokretač ljuske.

Na sadržaj

Izvor: www.habr.com

Dodajte komentar