Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

Kini nga artikulo gituyo alang sa mga developer sa java nga kinahanglan nga dali nga imantala ang ilang mga produkto sa sonatype ug/o maven central repository gamit ang GitLab. Niini nga artikulo, maghisgot ako bahin sa pag-set up sa gitlab-runner, gitlab-ci ug maven-plugin aron masulbad kini nga problema.

Kinahanglanon:

  • Luwas nga pagtipig sa mvn ug GPG nga mga yawe.
  • Luwas nga pagpatuman sa mga buluhaton sa publiko nga CI.
  • Pag-upload sa mga artifact (release/snapshot) sa mga public repository.
  • Awtomatikong pagsusi sa mga bersyon sa pagpagawas alang sa pagmantala sa sentro sa maven.
  • Usa ka kinatibuk-ang solusyon sa pag-upload sa mga artifact sa usa ka repository alang sa daghang mga proyekto.
  • Kayano ug kasayon ​​sa paggamit.

Mga sulod

Kinatibuk-ang nga impormasyon

  • Ang usa ka detalyado nga paghulagway sa mekanismo sa pagmantala sa mga artifact sa Maven Central pinaagi sa Sonatype OSS Repository Hosting Service gihulagway na sa niini nga artikulo tiggamit Googolplex, mao nga akong hisgotan kining artikuloha sa hustong mga dapit.
  • Pre-register sa Sonatype nga JIRA ug pagsugod og tiket para maablihan ang repository (para sa dugang detalye, basaha ang seksyon Paghimo og tiket sa Sonatype JIRA). Human sa pag-abli sa repository, ang JIRA login/password pares (gitawag nga Sonatype account) gamiton sa pag-upload sa mga artifact sa Sonatype nexus.
  • Dugang pa, ang proseso sa pagmugna og GPG nga yawe gihulagway nga uga kaayo. Tan-awa ang seksyon alang sa dugang nga mga detalye. Pag-configure sa GnuPG sa Pagpirma sa mga Artifact
  • Kung naggamit ka sa Linux console aron makamugna og GPG key (gnupg/gnupg2), nan kinahanglan nimo nga i-install rng-tools aron makamugna og entropy. Kay kon dili, ang yawe nga henerasyon mahimong magdugay kaayo.
  • Mga Serbisyo sa Pagtipig publiko GPG yawe

Ngadto sa sulud

Pag-set up sa usa ka proyekto sa pag-deploy sa GitLab

  • Una sa tanan, kinahanglan ka nga maghimo ug mag-configure sa usa ka proyekto diin ang pipeline itago alang sa pag-deploy sa mga artifact. Gitawag nako ang akong proyekto nga yano ug dili komplikado - i-deploy
  • Pagkahuman sa paghimo sa repository, kinahanglan nimo nga higpitan ang pag-access aron mabag-o ang repository.
    Lakaw ngadto sa proyekto -> Settings -> Repository -> Gipanalipdan nga mga Sanga. Among tangtangon ang tanang lagda ug idugang ang usa ka lagda nga adunay Wildcard * nga adunay katungod sa pagduso ug paghiusa alang lamang sa mga tiggamit nga adunay papel sa mga Maintainer. Kini nga lagda magamit alang sa tanan nga tiggamit niini nga proyekto ug sa grupo diin kini nga proyekto nahisakop.
    Pag-set up sa GitLab CI aron mag-upload og java project sa maven central
  • Kung adunay daghang mga tigmentinar, nan ang labing kaayo nga solusyon mao ang pagpugong sa pag-access sa proyekto sa prinsipyo.
    Lakaw ngadto sa proyekto -> Mga Setting -> Kinatibuk-an -> Pagtan-aw, mga bahin sa proyekto, mga permiso ug itakda ang visibility sa Proyekto sa Private.
    Naa koy proyekto sa publiko nga pag-access, tungod kay gigamit nako ang akong kaugalingon nga GitLab Runner ug ako ra ang adunay access aron mabag-o ang repository. Aw, sa tinuud dili sa akong interes ang pagpakita sa pribado nga kasayuran sa mga log sa publiko nga pipeline.
  • Paghugot sa mga lagda alang sa pagbag-o sa repository
    Lakaw ngadto sa proyekto -> Settings -> Repository -> Push Rules ug ibutang ang mga bandila Pagdili sa Committer, Susiha kung ang tagsulat usa ka tiggamit sa GitLab. Girekomenda usab nako ang setting pasalig sa pagpirma, ug ibutang ang Isalikway ang wala gipirmahan nga mga pasalig nga bandila.
  • Sunod, kinahanglan nimo nga i-configure ang usa ka gatilyo aron makadagan ang mga buluhaton
    Adto sa project -> Settings -> CI / CD -> Pipeline triggers ug paghimo og bag-ong trigger-token
    Kini nga timaan mahimong idugang dayon sa kinatibuk-ang pag-configure sa mga variable alang sa usa ka grupo sa mga proyekto.
    Adto sa grupo -> Mga Setting -> CI / CD -> Mga Variable ug pagdugang usa ka variable DEPLOY_TOKEN nga adunay trigger-token sa kantidad.

Ngadto sa sulud

GitLab Runner

Kini nga seksyon naghulagway sa configuration alang sa pagpadagan sa mga buluhaton sa pag-deploy gamit ang lumad (Piho) ug publiko (Gipaambit) nga runner.

Piho nga Runner

Gigamit nako ang akong kaugalingon nga mga runner, tungod kay una sa tanan kini sayon, paspas, barato.
Alang sa runner girekomenda ko ang Linux VDS nga adunay 1 CPU, 2 GB RAM, 20 GB HDD. Presyo sa isyu ~ 3000₽ kada tuig.

Akong runner

Alang sa runner gikuha nako ang VDS 4 CPU, 4 GB RAM, 50 GB SSD. Nagkantidad kini og ~11000₽ ug wala gayud magbasol niini.
Ako adunay total nga 7 ka makina. 5 sa aruba ug 2 sa ihor.

Busa, kami adunay usa ka runner. Karon atong ibutang kini.
Moadto kami sa makina pinaagi sa SSH ug i-install ang java, git, maven, gnupg2.

Ngadto sa sulud

Pag-instalar sa gitlab runner

  • Paghimo og bag-ong grupo runner
    sudo groupadd runner
  • Paghimo og direktoryo alang sa maven cache ug pag-assign sa mga katungod sa grupo runner
    Mahimo nimong laktawan kini nga lakang kung wala ka nagplano nga magpadagan og daghang mga runner sa parehas nga makina.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Paghimo og user gitlab-deployer ug idugang sa grupo runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Idugang sa file /etc/ssh/sshd_config sunod nga linya
    AllowUsers root@* [email protected]
  • Pag-usab sshd
    systemctl restart sshd
  • Paghimo usa ka password alang sa tiggamit gitlab-deployer (kini mahimo nga yano, tungod kay adunay usa ka pagdili alang sa localhost)
    passwd gitlab-deployer
  • I-install ang 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
  • Adto sa gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners ug kopyaha ang registration token

Screen

Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

  • Pagparehistro sa runner
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

proseso

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!

  • Susiha nga ang runner narehistro. Adto sa gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners activated for this project

Screen

Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

  • Pagdugang bulag serbisyo /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
  • Atong sugdan ang serbisyo.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Susiha nga ang magdadagan nagdagan.

Pananglitan:

Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

Ngadto sa sulud

GPG yawe nga henerasyon

  • Gikan sa sama nga makina kita moadto pinaagi sa ssh ubos sa user gitlab-deployer (Kini importante alang sa GPG key generation)

    ssh [email protected]

  • Naghimo kami usa ka yawe pinaagi sa pagtubag sa mga pangutana. Gigamit nako ang akong kaugalingon nga ngalan ug email.
    Siguroha nga ipiho ang password alang sa yawe. Ang mga artifact mapirmahan gamit kini nga yawe.

    gpg --gen-key 

  • Pagsusi

    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

  • Pag-upload sa among publikong yawe sa keyserver

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

Ngadto sa sulud

Maven setup

  • Kita moadto ubos sa user gitlab-deployer
    su gitlab-deployer 
  • Paghimo usa ka direktoryo sa maven repository ug sumpay sa cache (ayaw masayop)
    Kini nga lakang mahimong laktawan kung wala ka nagplano nga modagan og daghang mga runner sa parehas nga makina.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Paghimo og master key
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Paghimo og file ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Pag-encrypt sa password gikan sa Sonatype account
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Paghimo og file ~/.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>

diin,
GPG_SECRET_KEY_PASSPHRASE - GPG yawe nga password
SONATYPE_USERNAME - pag-login sa account sa sonatype

Nakompleto niini ang setup sa runner, makapadayon ka sa seksyon GitLab CI

Ngadto sa sulud

Gipaambit nga Runner

GPG yawe nga henerasyon

  • Una sa tanan, kinahanglan nimo nga maghimo usa ka yawe sa GPG. Aron mahimo kini, i-install ang gnupg.

    yum install -y gnupg

  • Naghimo kami usa ka yawe pinaagi sa pagtubag sa mga pangutana. Gigamit nako ang akong kaugalingon nga ngalan ug email. Siguroha nga ipiho ang password alang sa yawe.

    gpg --gen-key 

  • Kuhaa ang mahinungdanong impormasyon

    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]

  • Pag-upload sa among publikong yawe sa keyserver

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

  • Pagkuha ug pribadong yawe

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

  • Lakaw ngadto sa mga setting sa proyekto -> Mga Setting -> CI / CD -> Mga Variable ug i-save ang pribadong yawe sa usa ka variable GPG_SECRET_KEY
    Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

Ngadto sa sulud

Maven setup

  • Paghimo og master key
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Lakaw ngadto sa mga setting sa proyekto -> Mga Setting -> CI / CD -> Mga Variable ug i-save sa usa ka variable SETTINGS_SECURITY_XML sa mosunod nga mga linya:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Pag-encrypt sa password gikan sa Sonatype account
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Lakaw ngadto sa mga setting sa proyekto -> Mga Setting -> CI / CD -> Mga Variable ug i-save sa usa ka variable SETTINGS_XML sa mosunod nga mga linya:
    <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>

diin,
GPG_SECRET_KEY_PASSPHRASE - GPG yawe nga password
SONATYPE_USERNAME - pag-login sa account sa sonatype

Ngadto sa sulud

I-deploy ang docker nga imahe

  • Naghimo kami og usa ka yano nga Dockerfile aron sa pagpadagan sa mga buluhaton sa pag-deploy gamit ang gusto nga bersyon sa Java. Sa ubos usa ka pananglitan sa 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/

  • Paghimo og sudlanan alang sa imong proyekto

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

  • Among gipamatud-an ug gikarga ang sudlanan sa rehistro.

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

Ngadto sa sulud

GitLab CI

I-deploy ang proyekto

Idugang ang file .gitlab-ci.yml sa gamut sa deploy project
Gipresentar sa script ang duha nga eksklusibo nga mga buluhaton sa pag-deploy. Piho nga Runner o Shared Runner matag usa.

.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

Ngadto sa sulud

proyekto sa Java

Sa mga proyekto sa java nga kinahanglan nga i-upload sa mga pampublikong repositoryo, kinahanglan nimo nga idugang ang 2 nga mga lakang aron ma-download ang mga bersyon sa Release ug 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}

Niini nga solusyon, mipadayon ko og gamay ug nakahukom nga gamiton ang usa ka template sa CI alang sa mga proyekto sa java.

Sa mga detalye

Naghimo ako usa ka lahi nga proyekto gitlab-ci diin iyang gibutang ang template sa CI alang sa mga proyekto sa java komon.yml.

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

Ingon usa ka sangputanan, sa mga proyekto sa java mismo, ang .gitlab-ci.yml tan-awon kaayo nga compact ug dili verbose

.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

Ngadto sa sulud

pom.xml configuration

Kini nga hilisgutan gihulagway sa daghang detalye. Googolplex в Pag-set up sa maven aron awtomatiko nga mopirma ug mag-upload sa mga artifact sa snapshot ug staging repository, mao nga akong ihulagway ang pipila sa mga nuances sa paggamit sa mga plugins. Ihulagway usab nako kung unsa kadali ug natural nga magamit nimo nexus-staging-maven-pluginkung dili nimo gusto o dili magamit ang org.sonatype.oss:oss-parent isip ginikanan sa imong proyekto.

maven-install-plugin

Pag-instalar sa mga module sa lokal nga repositoryo.
Mapuslanon kaayo alang sa lokal nga pag-verify sa mga solusyon sa ubang mga proyekto, ingon man usa ka checksum.

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

Ngadto sa sulud

maven-javadoc-plugin

Paghimo og javadoc alang sa proyekto.

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

Kung naa kay module nga walay java (pananglitan mga resources lang)
O dili nimo gusto nga makamugna og javadoc sa prinsipyo, unya sa pagtabang 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>

Ngadto sa sulud

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>

Ngadto sa sulud

nexus-staging-maven-plugin

Configuration:

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

Kung ikaw adunay usa ka multi-module nga proyekto, ug dili nimo kinahanglan nga mag-upload sa usa ka piho nga module sa repository, nan kinahanglan nimo nga idugang sa pom.xml niini nga module nexus-staging-maven-plugin uban sa bandila skipNexusStagingDeployMojo

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

Human ma-upload ang snapshot/release nga mga bersyon anaa sa mga tipiganan sa dula

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

Dugang nga mga plus

  • Usa ka dato kaayo nga lista sa mga target alang sa pagtrabaho kauban ang nexus repository (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Awtomatikong pagpagawas nga pagsusi alang sa pag-download sa sentro sa maven

Ngadto sa sulud

resulta

Pagpatik ug SNAPSHOT nga Bersyon

Kung magtukod usa ka proyekto, posible nga mano-mano ang pagsugod sa usa ka buluhaton aron ma-download ang bersyon sa SNAPSHOT sa nexus

Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

Kung gilansad kini nga buluhaton, ang katugbang nga buluhaton sa proyekto sa pag-deploy ma-trigger (usa ka panig-ingnan).

giputol nga log

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

Ingon usa ka sangputanan, ang bersyon sa nexus gikarga 1.0.0-SNAPSHOT.

Ang tanan nga mga bersyon sa snapshot mahimong makuha gikan sa repository sa site oss.sonatype.org ubos sa imong account.

Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

Ngadto sa sulud

Pagmantala sa bersyon sa pagpagawas

Kung gitakda ang tag, ang katugbang nga buluhaton sa proyekto sa pag-deploy awtomatiko nga ma-trigger aron ma-upload ang bersyon sa pagpagawas sa nexus (usa ka panig-ingnan).

Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

Ang labing kaayo nga bahin mao nga ang hapit nga pagpagawas awtomatiko nga nag-trigger sa koneksyon.

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

Ug kung adunay sayup, nan ang buluhaton mapakyas

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

Ingon usa ka sangputanan, usa ra ang nahabilin nga kapilian. O kuhaa kini nga bersyon o imantala.

Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

Pagkahuman sa pagpagawas, pagkahuman sa pila ka oras, ang mga artifact masulod Pag-set up sa GitLab CI aron mag-upload og java project sa maven central

sa hilisgutan

Usa kadto ka pagpadayag kanako nga ang maven nag-indeks sa ubang mga publikong repositoryo.
Kinahanglan nako nga i-upload ang robots.txt tungod kay kini nag-index sa akong daan nga repository.

Ngadto sa sulud

konklusyon

Ang naa nato

  • Usa ka bulag nga proyekto sa pag-deploy diin mahimo nimong ipatuman ang daghang mga buluhaton sa CI alang sa pag-upload sa mga artifact sa mga pampublikong repositoryo alang sa lainlaing mga pinulongan sa pag-uswag.
  • Ang proyekto sa pag-deploy nahimulag gikan sa pagpanghilabot sa gawas ug mahimo ra nga usbon sa mga tiggamit nga adunay mga tahas sa Tag-iya ug Pagmentinar.
  • Usa ka bulag nga Piho nga Runner nga adunay "init" nga cache aron modagan lamang ang mga buluhaton.
  • Pagpublikar sa snapshot/release nga mga bersyon sa usa ka publikong repository.
  • Awtomatikong pagsusi sa bersyon sa pagpagawas alang sa pagkaandam alang sa pagmantala sa sentro sa maven.
  • Proteksyon batok sa awtomatikong pagmantala sa "hilaw" nga mga bersyon sa maven central.
  • Paghimo ug pagmantala sa mga bersyon sa snapshot "sa pag-klik".
  • Usa ka repository alang sa pagkuha sa mga bersyon sa snapshot / pagpagawas.
  • Kinatibuk-ang pipeline alang sa pagtukod / pagsulay / pagmantala sa usa ka proyekto sa java.

Ang pag-set up sa GitLab CI dili ingon ka komplikado sa usa ka hilisgutan sama sa una nga pagtan-aw. Igo na ang pag-set up sa CI sa usa ka turnkey nga basehan sa pipila ka mga higayon, ug karon layo ka sa usa ka amateur niini nga butang. Dugang pa, ang dokumentasyon sa GitLab sobra kaayo. Ayaw kahadlok sa paghimo sa unang lakang. Ang dalan makita sa ilawom sa mga lakang sa tawo nga naglakaw (wala ko kahinumdom kung kinsa ang nagsulti niini :)

Malipay ko sa feedback.

Sa sunod nga artikulo, ipakita ko kanimo kung giunsa ang pag-set up sa GitLab CI aron mapadagan ang mga buluhaton sa pagsulay sa panagsama nga kompetisyon (pagpadagan sa mga serbisyo sa pagsulay nga adunay docker-compose) kung adunay usa ra ka shell runner.

Ngadto sa sulud

Source: www.habr.com

Idugang sa usa ka comment