Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

Nkhaniyi idapangidwira opanga ma java omwe akufunika kufalitsa mwachangu zinthu zawo ku sonatype ndi/kapena maven central repositories pogwiritsa ntchito GitLab. M'nkhaniyi, ndilankhula za kukhazikitsa gitlab-runner, gitlab-ci ndi maven-plugin kuti athetse vutoli.

Zofunikira:

  • Kusungirako kotetezedwa kwa makiyi a mvn ndi GPG.
  • Kukonzekera kotetezedwa kwa ntchito zapagulu za CI.
  • Kukweza zinthu zakale (kutulutsa/chithunzi) kumalo osungira anthu.
  • Chongani chokha chamitundu yotulutsidwa kuti ifalitsidwe ku maven central.
  • Njira yothetsera kukweza zinthu zakale kunkhokwe yama projekiti angapo.
  • Zosavuta komanso zosavuta kugwiritsa ntchito.

Zamkatimu

Mfundo zambiri

  • Kufotokozera mwatsatanetsatane za makina osindikizira zinthu zakale ku Maven Central kudzera pa Sonatype OSS Repository Hosting Service zafotokozedwa kale mu Nkhani iyi wosuta googleplex, kotero ine nditchula nkhaniyi m'malo oyenera.
  • Lembetsanitu pa Sonatype JIRA ndikuyamba tikiti kuti mutsegule malo (kuti mumve zambiri, werengani gawoli Pangani tikiti ya Sonatype JIRA). Mukatsegula malo osungira, malowedwe / mawu achinsinsi a JIRA (omwe amatchedwanso akaunti ya Sonatype) adzagwiritsidwa ntchito kuyika zinthu zakale ku Sonatype nexus.
  • Kupitilira apo, njira yopangira kiyi ya GPG imafotokozedwa mowuma kwambiri. Onani gawoli kuti mumve zambiri. Kukonza GnuPG kuti isayinidwe ndi Artifacts
  • Ngati mukugwiritsa ntchito Linux console kuti mupange kiyi ya GPG (gnupg/gnupg2), ndiye muyenera kukhazikitsa. zida za rng kupanga entropy. Kupanda kutero, kupanga makiyi kumatha kutenga nthawi yayitali kwambiri.
  • Ntchito Zosungirako anthu onse GPG makiyi

Zolemba

Kukhazikitsa projekiti yotumiza ku GitLab

  • Choyamba, muyenera kupanga ndi kukonza pulojekiti yomwe payipi idzasungidwa kuti mutumize zinthu zakale. Ndinatcha projekiti yanga mophweka komanso yosavuta - tumizani
  • Mukapanga malo osungira, muyenera kuletsa mwayi wosintha malo.
    Pitani ku polojekiti -> Zikhazikiko -> Malo -> Nthambi Zotetezedwa. Timachotsa malamulo onse ndikuwonjezera lamulo limodzi ndi Wildcard * ndi ufulu wokankhira ndikuphatikiza okhawo omwe ali ndi udindo wa Maintainers. Lamuloli ligwira ntchito kwa onse ogwiritsa ntchito polojekitiyi komanso gulu lomwe polojekitiyi ili nayo.
    Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central
  • Ngati pali osamalira angapo, ndiye kuti njira yabwino ndiyo kuletsa mwayi wopeza polojekitiyi.
    Pitani ku polojekiti -> Zikhazikiko -> Zambiri -> Mawonekedwe, mawonekedwe a projekiti, zilolezo ndikuyika mawonekedwe a Project Private.
    Ndili ndi pulojekiti yopezeka pagulu, popeza ndimagwiritsa ntchito GitLab Runner yanga ndipo ndimangotha ​​kusintha malo. Chabwino, kwenikweni sizondikomera kuwonetsa zinsinsi pamapaipi amtundu wa anthu.
  • Kulimbitsa malamulo osintha malo osungira
    Pitani ku polojekiti -> Zikhazikiko -> Repository -> Push Malamulo ndikuyika zoletsa za Committer, Onani ngati wolemba ndi wogwiritsa ntchito GitLab. Ndikupangiranso kukhazikitsa perekani kusaina, ndikuyika mbendera ya Kukana osasainidwa.
  • Kenako, muyenera kukonza choyambitsa kuti mugwire ntchito
    Pitani ku polojekiti -> Zikhazikiko -> CI / CD -> Zoyambitsa mapaipi ndikupanga chizindikiro chatsopano
    Chizindikiro ichi chikhoza kuwonjezeredwa nthawi yomweyo ku kasinthidwe kawonse kamagulu a ntchito.
    Pitani ku gulu -> Zikhazikiko -> CI / CD -> Zosintha ndikuwonjezera zosinthika DEPLOY_TOKEN ndi choyambitsa-chizindikiro mu mtengo.

Zolemba

GitLab Wothamanga

Gawoli likufotokoza makonzedwe oyendetsera ntchito pa deploy pogwiritsa ntchito wamba (Specific) ndi public (Shared) wothamanga.

Specific Runner

Ndimagwiritsa ntchito othamanga anga, chifukwa choyamba ndichosavuta, chachangu, chotsika mtengo.
Kwa othamanga ndikupangira Linux VDS yokhala ndi 1 CPU, 2 GB RAM, 20 GB HDD. Mtengo wotulutsa ~ 3000₽ pachaka.

Wothamanga wanga

Kwa wothamanga ndinatenga VDS 4 CPU, 4 GB RAM, 50 GB SSD. Zinawononga ~ 11000 ₽ ndipo sindinanong'oneze bondo.
Ndili ndi makina 7 okwana. 5 pa aruba ndi 2 pa ihor.

Kotero, ife tiri ndi wothamanga. Tsopano tiyikhazikitsa.
Timapita kumakina kudzera pa SSH ndikuyika java, git, maven, gnupg2.

Zolemba

Kukhazikitsa gitlab runner

  • Pangani gulu latsopano runner
    sudo groupadd runner
  • Pangani chikwatu cha maven cache ndikugawa ufulu wamagulu runner
    Mutha kudumpha izi ngati simukukonzekera kuthamanga othamanga angapo pamakina amodzi.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Pangani wogwiritsa ntchito gitlab-deployer ndi kuwonjezera ku gulu runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Onjezani ku fayilo /etc/ssh/sshd_config mzere wotsatira
    AllowUsers root@* [email protected]
  • Yambitsaninso sshd
    systemctl restart sshd
  • Khazikitsani mawu achinsinsi kwa wogwiritsa ntchito gitlab-deployer (atha kukhala osavuta, popeza pali choletsa kwa localhost)
    passwd gitlab-deployer
  • Ikani 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
  • Pitani ku gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners ndikutengera chizindikiro cholembetsa

Chophimba

Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

  • Kulembetsa wothamanga
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

ndondomeko

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!

  • Onetsetsani kuti wothamangayo adalembetsa. Pitani ku gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Othamanga omwe adayambitsa ntchitoyi

Chophimba

Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

  • Onjezani kupatukana utumiki /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
  • Timayamba utumiki.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Onetsetsani kuti wothamanga akuthamanga.

Chitsanzo:

Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

Zolemba

Kusintha kwamphamvu kwa GPG

  • Kuchokera pamakina omwewo timapita kudzera pa ssh pansi pa wosuta gitlab-deployer (izi ndizofunikira pakupanga makiyi a GPG)

    ssh [email protected]

  • Timapanga makiyi poyankha mafunso. Ndinagwiritsa ntchito dzina langa ndi imelo.
    Onetsetsani kuti mwatchula mawu achinsinsi a kiyi. Zinthu zakale zidzasainidwa ndi kiyi iyi.

    gpg --gen-key 

  • Chongani

    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

  • Kuyika kiyi yathu yapagulu ku keyserver

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

Zolemba

Kupanga Maven

  • Timapita pansi pa wosuta gitlab-deployer
    su gitlab-deployer 
  • Pangani chikwatu cha maven malo ndi kulumikizana ndi cache (musalakwitse)
    Izi zitha kudumphidwa ngati simukukonzekera kuthamanga othamanga angapo pamakina amodzi.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Pangani key key
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Pangani fayilo ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Kusunga mawu achinsinsi kuchokera ku akaunti ya Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Pangani fayilo ~/.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>

kuti,
GPG_SECRET_KEY_PASSPHRASE - GPG mawu achinsinsi
SONATYPE_USERNAME - kulowa mu akaunti ya sonatype

Izi zimamaliza kukhazikitsa othamanga, mutha kupita ku gawolo GitLab CI

Zolemba

Wothamanga Wogawana

Kusintha kwamphamvu kwa GPG

  • Choyamba, muyenera kupanga kiyi ya GPG. Kuti muchite izi, ikani gnupg.

    yum install -y gnupg

  • Timapanga makiyi poyankha mafunso. Ndinagwiritsa ntchito dzina langa ndi imelo. Onetsetsani kuti mwatchula mawu achinsinsi a kiyi.

    gpg --gen-key 

  • Pezani mfundo zazikuluzikulu

    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]

  • Kuyika kiyi yathu yapagulu ku keyserver

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

  • Kupeza kiyi yachinsinsi

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

  • Pitani ku makonda a projekiti -> Zikhazikiko -> CI / CD -> Zosintha ndikusunga kiyi yachinsinsi pakusintha GPG_SECRET_KEY
    Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

Zolemba

Kupanga Maven

  • Pangani key key
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Pitani ku makonda a polojekiti -> Zikhazikiko -> CI / CD -> Zosintha ndikusunga zosinthika SETTINGS_SECURITY_XML mizere iyi:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Kusunga mawu achinsinsi kuchokera ku akaunti ya Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Pitani ku makonda a polojekiti -> Zikhazikiko -> CI / CD -> Zosintha ndikusunga zosinthika SETTINGS_XML mizere iyi:
    <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>

kuti,
GPG_SECRET_KEY_PASSPHRASE - GPG mawu achinsinsi
SONATYPE_USERNAME - kulowa mu akaunti ya sonatype

Zolemba

Ikani chithunzi cha docker

  • Timapanga Dockerfile yosavuta kuti tigwiritse ntchito potumiza ndi mtundu womwe tikufuna wa Java. Pansipa pali chitsanzo cha 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/

  • Kumanga chidebe cha polojekiti yanu

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

  • Timatsimikizira ndikuyika chidebecho mu registry.

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

Zolemba

GitLab CI

Perekani polojekiti

Onjezani fayilo .gitlab-ci.yml ku mizu ya polojekiti yotumiza
Script ili ndi ntchito ziwiri zotumizirana zinthu zosiyanasiyana. Specific Runner kapena Shared Runner motsatana.

.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

Zolemba

Ntchito ya Java

M'mapulojekiti a java omwe akuyenera kukwezedwa kumalo osungirako anthu, muyenera kuwonjezera masitepe awiri kuti mutsitse Mawonekedwe a Release ndi 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}

Mu yankho ili, ndinapita patsogolo pang'ono ndipo ndinaganiza zogwiritsa ntchito template imodzi ya CI pama projekiti a java.

Zambiri

Ndinapanga polojekiti yosiyana gitlab-ci momwe adayika template ya CI yama projekiti a java wamba.yml.

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

Zotsatira zake, mumapulojekiti a java okha, .gitlab-ci.yml imawoneka yophatikizika kwambiri osati mawu omveka.

.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

Zolemba

pom.xml kasinthidwe

Mutuwu ukufotokozedwa mwatsatanetsatane. googleplex в Kukhazikitsa maven kuti asayine ndi kuyika zinthu zakale kuti azitha kujambula ndi nkhokwe, kotero ine ndikufotokozera ena mwa nuances ntchito mapulagini. Ndifotokozanso momwe mungagwiritsire ntchito mosavuta komanso mwachilengedwe nexus-staging-maven-pluginngati simukufuna kapena simungathe kugwiritsa ntchito org.sonatype.oss:oss-parent monga kholo la polojekiti yanu.

maven-install-plugin

Imayika ma module munkhokwe yapafupi.
Zothandiza kwambiri pakutsimikizira mayankho akumaloko pama projekiti ena, komanso cheke.

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

Zolemba

maven-javadoc-plugin

Kupanga javadoc kwa polojekitiyi.

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

Ngati muli ndi gawo lomwe lilibe java (mwachitsanzo zothandizira zokha)
Kapena simukufuna kupanga javadoc kwenikweni, ndiye kuthandiza 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>

Zolemba

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>

Zolemba

nexus-staging-maven-plugin

Kusintha:

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

Ngati muli ndi projekiti ya ma module angapo, ndipo simukufunika kukweza gawo linalake kunkhokwe, muyenera kuwonjezera pom.xml ya gawoli nexus-staging-maven-plugin ndi mbendera skipNexusStagingDeployMojo

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

Pambuyo kutsitsa zithunzi / zotulutsa zimapezeka mkati zosungirako zosungirako

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

Zowonjezera zambiri

  • Mndandanda wolemera kwambiri wa zolinga zogwirira ntchito ndi nexus repository (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Chongani chotsitsa chodziwikiratu kuti mutsitsidwe mu maven central

Zolemba

chifukwa

Kusindikiza SNAPSHOT Version

Mukamanga pulojekiti, ndizotheka kuyambitsa pamanja ntchito kutsitsa mtundu wa SNAPSHOT ku nexus

Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

Ntchitoyi ikayambika, ntchito yofananira mu projekiti yotumizira imayambika (chitsanzo).

chipika chodulidwa

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

Zotsatira zake, mtundu wa Nexus umadzazidwa 1.0.0-ZINTHU ZONSE.

Mitundu yonse yazithunzi imatha kuchotsedwa pamalo osungira patsamba oss.sonatype.org pansi pa akaunti yanu.

Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

Zolemba

Kusindikizidwa kwa mtundu womasulidwa

Chizindikirocho chikakhazikitsidwa, ntchito yofananira mu projekiti yotumizira imayambitsidwa kuti ikweze mtundu womasulidwa ku nexus (chitsanzo).

Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

Gawo labwino kwambiri ndikuti kumasulidwa kwapafupi kumayambitsa nexus.

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1037".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  9.603 s]
[INFO] test-core .......................................... SUCCESS [  3.419 s]
[INFO] Shields4J client ................................... SUCCESS [  9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

Ndipo ngati chinachake chalakwika, ndiye kuti ntchitoyo idzalephera

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

Chifukwa chake, tatsala ndi chosankha chimodzi chokha. Kapena chotsani mtundu uwu kapena kufalitsa.

Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

Pambuyo pa kutulutsidwa, pakapita nthawi, zinthuzo zidzalowetsedwa Kukhazikitsa GitLab CI kuti ikweze pulojekiti ya java ku maven central

zakunja

Linali vumbulutso kwa ine kuti maven amalozera nkhokwe zina zapagulu.
Ndidayenera kukweza robots.txt chifukwa idalozera malo anga akale.

Zolemba

Pomaliza

Zomwe tili nazo

  • Pulojekiti yogawa yomwe mungagwiritse ntchito zingapo za CI pokweza zinthu zakale kumalo osungirako anthu azilankhulo zosiyanasiyana zachitukuko.
  • Ntchito yotumizira imasiyanitsidwa ndi kusokoneza kwakunja ndipo ingasinthidwe ndi ogwiritsa ntchito omwe ali ndi maudindo a Mwini ndi Wosamalira.
  • Wosiyana Wapadera Wothamanga wokhala ndi "hot" cache kuti agwiritse ntchito zotumiza zokha.
  • Kusindikizidwa kwa zithunzithunzi/zotuluka m'malo osungira anthu.
  • Onani zokha za mtundu womwe watulutsidwa kuti ukhale wokonzeka kufalitsidwa mu maven central.
  • Kutetezedwa motsutsana ndi kusindikizidwa kokha kwamitundu "yaiwisi" pakati pa maven.
  • Pangani ndi kufalitsa zithunzithunzi "pa dinani".
  • Chosungira chimodzi chopezera zithunzi / zotulutsa.
  • Mapaipi ambiri omanga / kuyesa / kusindikiza projekiti ya java.

Kukhazikitsa GitLab CI si nkhani yovuta monga momwe imawonekera poyang'ana koyamba. Ndikokwanira kukhazikitsa CI pa turnkey kangapo, ndipo tsopano muli kutali ndi amateur pankhaniyi. Komanso, zolemba za GitLab ndizosowa kwambiri. Osawopa kutenga sitepe yoyamba. Msewu umawoneka pansi pa masitepe a munthu amene akuyenda (sindikukumbukira yemwe ananena :)

Ndikhala wokondwa kuyankha.

M'nkhani yotsatira, ndikuwonetsani momwe mungakhazikitsire GitLab CI kuti muyendetse ntchito zoyeserera mopikisana (kuyendetsa ntchito zoyesa ndi docker-compose) ngati muli ndi wothamanga m'modzi yekha.

Zolemba

Source: www.habr.com

Kuwonjezera ndemanga