A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

Ez a cikk azoknak a java-fejlesztőknek szól, akiknek gyorsan közzé kell tenniük termékeiket a Sonatype és/vagy a Maven központi adattáraiban a GitLab segítségével. Ebben a cikkben a gitlab-runner, a gitlab-ci és a maven-plugin beállításáról fogok beszélni a probléma megoldására.

Feltételek:

  • Mvn és GPG kulcsok biztonságos tárolása.
  • A közcélú CI-feladatok biztonságos végrehajtása.
  • Műtermékek (kiadás/pillanatkép) feltöltése nyilvános adattárakba.
  • A kiadási verziók automatikus ellenőrzése közzétételhez a maven centralban.
  • Általános megoldás műtermékek feltöltésére több projekt tárházába.
  • Egyszerűség és könnyű használat.

Tartalom

Általános információk

  • A Maven Centralban a Sonatype OSS Repository Hosting szolgáltatáson keresztüli közreadásának mechanizmusának részletes leírását már leírtuk ez a cikk felhasználó googolplex, ezért a megfelelő helyeken hivatkozni fogok erre a cikkre.
  • Előzetes regisztráció a JIRA szonátípia és nyissa meg a jegyet a tároló megnyitásához (további részletekért olvassa el a részt Hozzon létre jegyet a Sonatype JIRA-n). Az adattár megnyitása után a JIRA bejelentkezési/jelszópárját (a továbbiakban: Sonatype fiók) a rendszer a műtermékek Sonatype nexusba való feltöltésére fogja használni.
  • Ezután nagyon szárazon leírjuk a GPG-kulcs létrehozásának folyamatát. További részletekért lásd a részt A GnuPG beállítása műtermékek aláírására
  • Ha a Linux konzolt használja GPG kulcs létrehozásához (gnupg/gnupg2), akkor telepítenie kell rng-eszközök entrópiát generálni. Ellenkező esetben a kulcs előállítása nagyon sokáig tarthat.
  • Tárolási szolgáltatások nyilvános GPG kulcsok

A tartalomhoz

Telepítési projekt beállítása a GitLabban

  • Először is létre kell hoznia és be kell állítania egy projektet, amelyben a folyamatot a műtermékek telepítéséhez tárolja. A projektemet egyszerűen és egyszerűen elneveztem - telepíteni
  • A tár létrehozása után korlátozni kell a hozzáférést a tár megváltoztatásához.
    Lépjen a projekt -> Beállítások -> Leraktár -> Védett ágak menüpontra. Töröljük az összes szabályt, és egyetlen szabályt adunk hozzá helyettesítő karakterrel *, amely csak a fenntartói szerepkörrel rendelkező felhasználók számára jogosult a leküldésre és egyesítésre. Ez a szabály mind ennek a projektnek, mind annak a csoportnak az összes felhasználója számára működik, amelyhez a projekt tartozik.
    A GitLab CI beállítása java projekt feltöltéséhez a maven centralba
  • Ha több karbantartó van, akkor a legjobb megoldás a projekthez való hozzáférés elvi korlátozása lenne.
    Lépjen a projekt -> Beállítások -> Általános -> Láthatóság, projektfunkciók, engedélyek menüpontra, és állítsa be a Projekt láthatóságát értékre Magán.
    Van egy nyilvánosan elérhető projektem, mivel a saját GitLab Runneremet használom, és csak nekem van hozzáférésem a tárhely módosításához. Nos, valójában nem érdekem, hogy privát információkat jelenítsek meg a nyilvános csővezeték-naplókban.
  • Az adattár megváltoztatására vonatkozó szabályok szigorítása
    Menjen a projekthez -> Beállítások -> Repository -> Push Rules, és állítsa be a Committer korlátozást, ellenőrizze, hogy a szerző GitLab-felhasználó-e. Javaslom a beállítást is aláírást vállalni, és állítsa be az aláíratlan véglegesítések elutasítása jelzőt.
  • Ezután konfigurálnia kell egy triggert a feladatok elindításához
    Lépjen a projekt -> Beállítások -> CI / CD -> Pipeline triggerek menüpontra, és hozzon létre egy új trigger-token
    Ez a token azonnal hozzáadható egy projektcsoport változóinak általános konfigurációjához.
    Lépjen a csoport -> Beállítások -> CI / CD -> Változók menüpontra, és adjon hozzá egy változót DEPLOY_TOKEN trigger-token értékkel.

A tartalomhoz

GitLab Runner

Ez a szakasz a saját (specifikus) és nyilvános (Megosztott) futtató használatával futtatandó feladatok konfigurációját írja le.

Konkrét futó

Saját futókat használok, mert mindenekelőtt kényelmes, gyors és olcsó.
Futónak linuxos VDS-t ajánlok 1 CPU-val, 2 GB RAM-mal, 20 GB HDD-vel. A kibocsátási ár ~3000₽ évente.

A futóm

A futóhoz VDS 4 CPU-t, 4 GB RAM-ot, 50 GB SSD-t vettem. Ára ~11000 XNUMX₽, és soha nem bántam meg.
Összesen 7 gépem van. 5 arubán és 2 ihoron.

Szóval van egy futónk. Most konfiguráljuk.
SSH-n keresztül megyünk a géphez és telepítjük a java, git, maven, gnupg2-t.

A tartalomhoz

Gitlab runner telepítése

  • Hozzon létre egy új csoportot runner
    sudo groupadd runner
  • Hozzon létre egy könyvtárat a maven gyorsítótár számára, és rendeljen hozzá csoportengedélyeket runner
    Ezt a pontot kihagyhatja, ha nem tervezi több futó futtatását egy gépen.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Hozzon létre egy felhasználót gitlab-deployer és add hozzá a csoporthoz runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Hozzáadás a fájlhoz /etc/ssh/sshd_config következő sor
    AllowUsers root@* [email protected]
  • Újraindítás sshd
    systemctl restart sshd
  • Jelszó beállítása a felhasználó számára gitlab-deployer (egyszerű lehet, mivel a localhost számára korlátozás van)
    passwd gitlab-deployer
  • A GitLab Runner telepítése (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
  • Nyissa meg a gitlab.com webhelyet -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners, és másolja ki a regisztrációs tokent

Képernyő

A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

  • Futó regisztrációja
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

folyamat

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!

  • Ellenőrizzük, hogy a futó regisztrálva van-e. Nyissa meg a gitlab.com webhelyet -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners activated for this project.

Képernyő

A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

  • hozzáadása különálló szolgáltatás /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
  • Indítsuk el a szolgáltatást.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Ellenőrizzük, hogy a futó fut-e.

Példa

A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

A tartalomhoz

GPG kulcsok generálása

  • Ugyanarról a gépről lépünk be ssh-n keresztül a user alatt gitlab-deployer (ez fontos a GPG kulcs generálásához)

    ssh [email protected]

  • A kérdések megválaszolásával kulcsot generálunk. A saját nevemet és email címemet használtam.
    Feltétlenül adja meg a kulcs jelszavát. A műtermékek aláírása ezzel a kulccsal történik.

    gpg --gen-key 

  • Ellenőrzés

    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

  • Nyilvános kulcsunk feltöltése a kulcsszerverre

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

A tartalomhoz

A Maven beállítása

  • Bejelentkezés felhasználóként gitlab-deployer
    su gitlab-deployer 
  • Hozzon létre egy maven könyvtárat raktár és link a gyorsítótárhoz (nem tévedés)
    Ezt a pontot kihagyhatja, ha nem tervezi több futó futtatását egy gépen.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Hozzon létre egy mesterkulcsot
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Hozzon létre egy ~/.m2/settings-security.xml fájlt
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • A Sonatype fiók jelszavának titkosítása
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Hozzon létre egy ~/.m2/settings.xml fájlt
    <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>

ahol,
GPG_SECRET_KEY_PASSPHRASE – jelszó a GPG kulcshoz
SONATYPE_USERNAME – Sonatype fiók bejelentkezés

Ezzel befejeződött a futó beállítása, továbbléphet a szakaszra GitLab CI

A tartalomhoz

Megosztott Runner

GPG kulcsok generálása

  • Először is létre kell hoznia egy GPG kulcsot. Ehhez telepítse a gnupg-t.

    yum install -y gnupg

  • A kérdések megválaszolásával kulcsot generálunk. A saját nevemet és email címemet használtam. Feltétlenül adja meg a kulcs jelszavát.

    gpg --gen-key 

  • Információk megjelenítése a kulcson

    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]

  • Nyilvános kulcsunk feltöltése a kulcsszerverre

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

  • Megkapjuk a privát kulcsot

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

  • Lépjen a projektbeállítások -> Beállítások -> CI / CD -> Változók menüpontra, és mentse el a privát kulcsot egy változóba. GPG_SECRET_KEY
    A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

A tartalomhoz

A Maven beállítása

  • Hozzon létre egy mesterkulcsot
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Lépjen a projektbeállítások -> Beállítások -> CI / CD -> Változók menüpontra, és mentse el egy változóba SETTINGS_SECURITY_XML a következő sorokat:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • A Sonatype fiók jelszavának titkosítása
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Lépjen a projektbeállítások -> Beállítások -> CI / CD -> Változók menüpontra, és mentse el egy változóba SETTINGS_XML a következő sorokat:
    <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>

ahol,
GPG_SECRET_KEY_PASSPHRASE – jelszó a GPG kulcshoz
SONATYPE_USERNAME – Sonatype fiók bejelentkezés

A tartalomhoz

Docker image telepítése

  • Létrehozunk egy meglehetősen egyszerű Dockerfile-t a telepítési feladatok futtatásához a Java szükséges verziójával. Az alábbiakban egy példa az alpesi területre.

    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/

  • Konténer összeállítása a projekthez

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

  • Hitelesítjük és betöltjük a tárolót a rendszerleíró adatbázisba.

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

A tartalomhoz

GitLab CI

Telepítse a projektet

Adja hozzá a .gitlab-ci.yml fájlt a telepítési projekt gyökeréhez
A szkript két, egymást kölcsönösen kizáró telepítési feladatot mutat be. Adott futó vagy megosztott futó.

.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

A tartalomhoz

Java projekt

Azoknál a java projekteknél, amelyeket fel kell tölteni nyilvános adattárakba, 2 lépést kell hozzáadnia a kiadási és pillanatfelvételi verziók letöltéséhez.

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

Ebben a megoldásban egy kicsit tovább mentem, és úgy döntöttem, hogy egy CI-sablont használok a java projektekhez.

További részletek

Létrehoztam egy külön projektet gitlab-ci amelyben elhelyeztem egy CI-sablont a java projektekhez gyakori.yml.

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

Ennek eredményeként magukban a java projektekben a .gitlab-ci.yml nagyon kompaktnak és nem bőbeszédűnek tűnik

.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

A tartalomhoz

Pom.xml konfiguráció

Ez a téma nagyon részletesen le van írva. googolplex в A maven beállítása, hogy automatikusan aláírja és feltöltse a műtermékeket pillanatkép- és állomáshelyre, ezért leírom a bővítmények használatának néhány árnyalatát. Azt is leírom, hogy milyen egyszerűen és nyugodtan tudod használni nexus-staging-maven-pluginha nem akarja vagy nem tudja használni az org.sonatype.oss:oss-parent szülőként a projektet.

maven-install-plugin

Modulokat telepít a helyi tárolóba.
Nagyon hasznos megoldások helyi ellenőrzéséhez más projektekben, valamint ellenőrző összegként.

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

A tartalomhoz

maven-javadoc-plugin

Javadoc generálása a projekthez.

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

Ha olyan modulja van, amely nem tartalmaz Java-t (például csak erőforrásokat)
Vagy elvileg nem akarsz javadocot generálni, akkor segíts 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>

A tartalomhoz

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>

A tartalomhoz

nexus-staging-maven-plugin

Konfiguráció:

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

Ha több modulos projektje van, és nem kell egy adott modult feltöltenie a tárolóba, akkor hozzá kell adnia nexus-staging-maven-plugin zászlóval skipNexusStagingDeployMojo

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

A letöltés után a pillanatfelvétel/kiadás verziók elérhetők állomásozó adattárak

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

Még több plusz

  • Nagyon gazdag célok listája a nexus adattárral való munkához (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Automatikus kiadás-ellenőrzés a maven centralba való feltöltéshez

A tartalomhoz

Eredmény

SNAPSHOT verzió közzététele

Projekt felépítésekor lehetőség van egy feladat manuális elindítására a SNAPSHOT verzió letöltéséhez a nexusra

A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

Amikor ez a feladat elindul, a telepítési projektben a megfelelő feladat aktiválódik (példa).

Vágott rönk

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

Ennek eredményeként a verzió betöltődik a nexusba 1.0.0-PILLANATFELVÉTEL.

Az összes pillanatkép-verzió törölhető a webhelyen található tárhelyből oss.sonatype.org fiókja alatt.

A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

A tartalomhoz

Kiadási verzió közzététele

Ha telepítve van egy címke, a telepítési projektben a megfelelő feladat automatikusan elindul a kiadási verzió letöltéséhez a nexus (példa).

A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

A legjobb az egészben az, hogy a közeli feloldás automatikusan aktiválódik a nexusban.

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

És ha valami elromlik, a feladat biztosan meghiúsul

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

Ennek eredményeként csak egy választásunk marad. Vagy törölje ezt a verziót, vagy tegye közzé.

A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

A kiadás után egy idő után a műtermékek bekerülnek A GitLab CI beállítása java projekt feltöltéséhez a maven centralba

off topic

Felfedezés volt számomra, hogy a maven más nyilvános adattárakat is indexel.
Hozzá kellett adnom a robots.txt fájlt, mert indexelte a régi tárhelyemet.

A tartalomhoz

Következtetés

Amink van

  • Egy külön telepítési projekt, amelyben számos CI-feladatot hajthat végre a köztermékek nyilvános tárolókba való feltöltéséhez különböző fejlesztési nyelvekhez.
  • A Telepítési projekt el van szigetelve a külső zavaroktól, és csak a tulajdonosi és karbantartói szerepkörrel rendelkező felhasználók módosíthatják.
  • Egy külön speciális futtató „forró” gyorsítótárral, amely csak a telepítési feladatokat futtatja.
  • Pillanatkép/kiadási verziók közzététele nyilvános lerakatban.
  • A kiadási verzió automatikus ellenőrzése a Maven Centralban való közzétételre.
  • Védelem a „nyers” verziók automatikus közzététele ellen a maven centralban.
  • Pillanatkép-verziók létrehozása és közzététele „kattintásra”.
  • Egyetlen tároló a pillanatkép/kiadási verziók beszerzéséhez.
  • Általános folyamat Java projektek felépítéséhez/teszteléséhez/közzétételéhez.

A GitLab CI beállítása nem olyan bonyolult téma, mint amilyennek első pillantásra tűnik. Elég, ha párszor kulcsrakészen beállítod a CI-t, és most már messze nem vagy amatőr ebben a kérdésben. Ráadásul a GitLab dokumentációja nagyon redundáns. Ne félj megtenni az első lépést. Az út megjelenik a sétáló ember lépcsője alatt (már nem emlékszem, ki mondta :)

Szívesen fogadok visszajelzést.

A következő cikkben arról fogok beszélni, hogyan konfigurálhatja a GitLab CI-t úgy, hogy versenyképesen futtasson integrációs teszteket tartalmazó feladatokat (a tesztelés alatt álló szolgáltatások futtatása a docker-compose használatával), ha csak egy shell-futtatója van.

A tartalomhoz

Forrás: will.com

Hozzászólás