Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

Mae'r erthygl hon wedi'i bwriadu ar gyfer datblygwyr java sydd angen cyhoeddi eu cynnyrch yn gyflym i ystorfeydd sonoteip a / neu maven canolog gan ddefnyddio GitLab. Yn yr erthygl hon, byddaf yn siarad am sefydlu gitlab-runner, gitlab-ci a maven-plugin i ddatrys y broblem hon.

Rhagofynion:

  • Storio allweddi mvn a GPG yn ddiogel.
  • Cyflawni tasgau CI cyhoeddus yn ddiogel.
  • Lanlwytho arteffactau (rhyddhau/ciplun) i gadwrfeydd cyhoeddus.
  • Gwiriad awtomatig o fersiynau rhyddhau i'w cyhoeddi yn maven ganolog.
  • Datrysiad cyffredinol ar gyfer uwchlwytho arteffactau i gadwrfa ar gyfer prosiectau lluosog.
  • Symlrwydd a rhwyddineb defnydd.

Cynnwys

Gwybodaeth gyffredinol

  • Mae disgrifiad manwl o'r mecanwaith ar gyfer cyhoeddi arteffactau i Maven Central trwy'r Gwasanaeth Lletya Storfa Sonatype OSS eisoes wedi'i ddisgrifio yn yr erthygl hon defnyddiwr Googolplex, felly cyfeiriaf at yr erthygl hon yn y mannau cywir.
  • Rhag-gofrestru yn Sonatype JIRA a dechrau tocyn i agor y gadwrfa (am fwy o fanylion, darllenwch yr adran Creu tocyn JIRA Sonatype). Ar ôl agor yr ystorfa, bydd y pâr mewngofnodi / cyfrinair JIRA (y cyfeirir ato o hyn ymlaen fel y cyfrif Sonatype) yn cael ei ddefnyddio i uwchlwytho arteffactau i'r nexus Sonatype.
  • Ymhellach, disgrifir y broses o gynhyrchu allwedd GPG yn sych iawn. Gweler yr adran am ragor o fanylion. Ffurfweddu GnuPG i Arteffactau Arwyddo
  • Os ydych chi'n defnyddio'r consol Linux i gynhyrchu allwedd GPG (gnupg/gnupg2), yna mae angen i chi osod rng-offer i gynhyrchu entropi. Fel arall, gall cynhyrchu allweddol gymryd amser hir iawn.
  • Gwasanaethau Storio cyhoeddus Allweddi GPG

I'r cynnwys

Sefydlu prosiect lleoli yn GitLab

  • Yn gyntaf oll, mae angen i chi greu a ffurfweddu prosiect lle bydd y biblinell yn cael ei storio ar gyfer defnyddio arteffactau. Galwais fy mhrosiect yn syml ac yn syml - defnyddio
  • Ar ôl creu'r ystorfa, mae angen i chi gyfyngu mynediad i newid yr ystorfa.
    Ewch i'r prosiect -> Gosodiadau -> Ystorfa -> Canghennau Gwarchodedig. Rydym yn dileu'r holl reolau ac yn ychwanegu un rheol gyda Wildcard * gyda'r hawl i wthio ac uno dim ond ar gyfer defnyddwyr â rôl y Cynhalwyr. Bydd y rheol hon yn gweithio i holl ddefnyddwyr y prosiect hwn a'r grŵp y mae'r prosiect hwn yn perthyn iddo.
    Sefydlu GitLab CI i uwchlwytho prosiect java i maven central
  • Os oes sawl cynhaliwr, yna'r ateb gorau fyddai cyfyngu mynediad i'r prosiect mewn egwyddor.
    Ewch i'r prosiect -> Gosodiadau -> Cyffredinol -> Gwelededd, nodweddion y prosiect, caniatâd a gosodwch welededd y Prosiect i Preifat.
    Mae gen i brosiect mynediad cyhoeddus, gan fy mod yn defnyddio fy NgitLab Runner fy hun a dim ond gen i fynediad i addasu'r ystorfa. Wel, mewn gwirionedd nid yw o fudd i mi ddangos gwybodaeth breifat mewn logiau piblinellau cyhoeddus.
  • Tynhau'r rheolau ar gyfer newid yr ystorfa
    Ewch i'r prosiect -> Gosodiadau -> Ystorfa -> Gwthiwch Reolau a gosodwch gyfyngiad y Committer baneri, Gwiriwch a yw'r awdur yn ddefnyddiwr GitLab. Rwyf hefyd yn argymell gosod ymrwymo arwyddo, a gosod y Faner Ymrwymiad Gwrthod heb ei harwyddo.
  • Nesaf, mae angen i chi ffurfweddu sbardun i redeg tasgau
    Ewch i'r prosiect -> Gosodiadau -> CI / CD -> Piblinell yn sbarduno a chreu tocyn sbardun newydd
    Gellir ychwanegu'r tocyn hwn ar unwaith at gyfluniad cyffredinol newidynnau ar gyfer grŵp o brosiectau.
    Ewch i'r grŵp -> Gosodiadau -> CI / CD -> Newidynnau ac ychwanegu newidyn DEPLOY_TOKEN gyda sbardun-tocyn yn y gwerth.

I'r cynnwys

Rhedwr GitLab

Mae'r adran hon yn disgrifio'r ffurfweddiad ar gyfer rhedeg tasgau wrth ddefnyddio'r rhedwr brodorol (Penodol) a chyhoeddus (Rhannu).

Rhedwr Penodol

Rwy'n defnyddio fy rhedwyr fy hun, oherwydd yn gyntaf oll mae'n gyfleus, yn gyflym, yn rhad.
Ar gyfer rhedwr rwy'n argymell Linux VDS gyda 1 CPU, 2 GB RAM, 20 GB HDD. Pris cyhoeddi ~ 3000₽ y flwyddyn.

Fy rhedwr

Ar gyfer y rhedwr cymerais VDS 4 CPU, 4 GB RAM, 50 GB SSD. Costiodd ~11000₽ a byth yn difaru.
Mae gen i gyfanswm o 7 peiriant. 5 ar aruba a 2 ar ihor.

Felly, mae gennym rhedwr. Nawr byddwn yn ei sefydlu.
Rydyn ni'n mynd i'r peiriant trwy SSH ac yn gosod java, git, maven, gnupg2.

I'r cynnwys

Gosod rhedwr gitlab

  • Creu grŵp newydd runner
    sudo groupadd runner
  • Creu cyfeiriadur ar gyfer y storfa maven a neilltuo hawliau grŵp runner
    Gallwch hepgor y cam hwn os nad ydych yn bwriadu rhedeg rhedwyr lluosog ar yr un peiriant.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Creu defnyddiwr gitlab-deployer ac ychwanegu at y grŵp runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Ychwanegu at ffeil /etc/ssh/sshd_config llinell nesaf
    AllowUsers root@* [email protected]
  • Ailgychwyn sshd
    systemctl restart sshd
  • Gosod cyfrinair ar gyfer y defnyddiwr gitlab-deployer (gall fod yn syml, gan fod cyfyngiad ar gyfer localhost)
    passwd gitlab-deployer
  • Gosod 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
  • Ewch i gitlab.com -> deploy-project -> Gosodiadau -> CI/CD -> Rhedwyr -> Rhedwyr Penodol a chopïwch y tocyn cofrestru

Sgrin

Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

  • Cofrestru'r rhedwr
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

proses

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!

  • Gwiriwch fod y rhedwr wedi'i gofrestru. Ewch i gitlab.com -> deploy-project -> Gosodiadau -> CI/CD -> Rhedwyr -> Rhedwyr Penodol -> Rhedwyr wedi'u gweithredu ar gyfer y prosiect hwn

Sgrin

Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

  • Ychwanegu ar wahân gwasanaeth /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
  • Rydyn ni'n dechrau'r gwasanaeth.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Gwiriwch fod y rhedwr yn rhedeg.

Enghraifft

Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

I'r cynnwys

Cynhyrchu allwedd GPG

  • O'r un peiriant rydyn ni'n mynd trwy ssh o dan y defnyddiwr gitlab-deployer (mae hyn yn bwysig ar gyfer cynhyrchu allwedd GPG)

    ssh [email protected]

  • Rydym yn cynhyrchu allwedd trwy ateb cwestiynau. Defnyddiais fy enw fy hun ac e-bost.
    Byddwch yn siwr i nodi'r cyfrinair ar gyfer yr allwedd. Bydd arteffactau yn cael eu llofnodi gyda'r allwedd hon.

    gpg --gen-key 

  • Gwiriwch

    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

  • Lanlwytho ein allwedd gyhoeddus i'r gweinydd allweddi

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

I'r cynnwys

Maven setup

  • Rydym yn mynd o dan y defnyddiwr gitlab-deployer
    su gitlab-deployer 
  • Creu cyfeiriadur maven ystorfa a chysylltu â'r storfa (peidiwch â gwneud unrhyw gamgymeriad)
    Gellir hepgor y cam hwn os nad ydych yn bwriadu rhedeg sawl rhedwr ar yr un peiriant.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Creu allwedd meistr
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Creu ffeil ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Amgryptio'r cyfrinair o'r cyfrif Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Creu ffeil ~/.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>

ble,
GPG_SECRET_KEY_PASSPHRASE - Cyfrinair allwedd GPG
SONATYPE_USERNAME - mewngofnodi cyfrif sonatype

Mae hyn yn cwblhau'r gosodiad rhedwr, gallwch fynd ymlaen i'r adran GitLab CI

I'r cynnwys

Rhedwr a Rennir

Cynhyrchu allwedd GPG

  • Yn gyntaf oll, mae angen i chi greu allwedd GPG. I wneud hyn, gosodwch gnupg.

    yum install -y gnupg

  • Rydym yn cynhyrchu allwedd trwy ateb cwestiynau. Defnyddiais fy enw fy hun ac e-bost. Byddwch yn siwr i nodi'r cyfrinair ar gyfer yr allwedd.

    gpg --gen-key 

  • Adalw gwybodaeth allweddol

    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]

  • Lanlwytho ein allwedd gyhoeddus i'r gweinydd allweddi

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

  • Cael allwedd breifat

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

  • Ewch i osodiadau prosiect -> Gosodiadau -> CI / CD -> Newidynnau a chadw'r allwedd breifat mewn newidyn GPG_SECRET_KEY
    Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

I'r cynnwys

Maven setup

  • Creu allwedd meistr
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Ewch i osodiadau prosiect -> Gosodiadau -> CI / CD -> Newidynnau a chadw mewn newidyn SETTINGS_SECURITY_XML y llinellau canlynol:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Amgryptio'r cyfrinair o'r cyfrif Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Ewch i osodiadau prosiect -> Gosodiadau -> CI / CD -> Newidynnau a chadw mewn newidyn SETTINGS_XML y llinellau canlynol:
    <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>

ble,
GPG_SECRET_KEY_PASSPHRASE - Cyfrinair allwedd GPG
SONATYPE_USERNAME - mewngofnodi cyfrif sonatype

I'r cynnwys

Defnyddio delwedd docwr

  • Rydyn ni'n creu Dockerfile gweddol syml i redeg tasgau wrth eu defnyddio gyda'r fersiwn dymunol o Java. Isod mae enghraifft ar gyfer alpaidd.

    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/

  • Adeiladu cynhwysydd ar gyfer eich prosiect

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

  • Rydym yn dilysu ac yn llwytho'r cynhwysydd i'r gofrestrfa.

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

I'r cynnwys

GitLab CI

Defnyddio prosiect

Ychwanegu'r ffeil .gitlab-ci.yml at wraidd y prosiect defnyddio
Mae'r sgript yn cyflwyno dwy dasg lleoli sy'n annibynnol ar ei gilydd. Rhedwr Penodol neu Rhedwr a Rennir yn y drefn honno.

.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

I'r cynnwys

Prosiect Java

Mewn prosiectau java sydd i fod i gael eu huwchlwytho i ystorfeydd cyhoeddus, mae angen ichi ychwanegu 2 gam i lawrlwytho'r fersiynau Rhyddhau a Ciplun.

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

Yn yr ateb hwn, es ychydig ymhellach a phenderfynais ddefnyddio un templed CI ar gyfer prosiectau java.

Mewn manylion

Creais brosiect ar wahân gitlab-ci lle gosododd y templed CI ar gyfer prosiectau java cyffredin.yml.

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

O ganlyniad, yn y prosiectau java eu ​​hunain, mae .gitlab-ci.yml yn edrych yn gryno iawn ac nid ar lafar

.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

I'r cynnwys

cyfluniad pom.xml

Disgrifir y pwnc hwn yn fanwl iawn. Googolplex в Sefydlu maven i lofnodi a lanlwytho arteffactau yn awtomatig i gadwrfeydd ciplun a llwyfannu, felly byddaf yn disgrifio rhai o'r naws o ddefnyddio ategion. Byddaf hefyd yn disgrifio pa mor hawdd a naturiol y gallwch chi ei ddefnyddio nexus-staging-maven-pluginos nad ydych chi eisiau neu os na allwch ddefnyddio org.sonatype.oss:oss-parent fel rhiant eich prosiect.

maven-install-ategyn

Yn gosod modiwlau yn y gadwrfa leol.
Defnyddiol iawn ar gyfer dilysu lleol o atebion mewn prosiectau eraill, yn ogystal â 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>

I'r cynnwys

maven-javadoc-plugin

Cynhyrchu javadoc ar gyfer y prosiect.

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

Os oes gennych fodiwl nad yw'n cynnwys java (er enghraifft adnoddau yn unig)
Neu nid ydych am gynhyrchu javadoc mewn egwyddor, yna i helpu 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>

I'r cynnwys

maven-gpg-ategyn

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

I'r cynnwys

nexus-staging-maven-plugin

Ffurfweddiad:

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

Os oes gennych chi brosiect aml-fodiwl, ac nid oes angen i chi uwchlwytho modiwl penodol i'r gadwrfa, yna mae angen i chi ychwanegu at pom.xml y modiwl hwn nexus-staging-maven-plugin gyda baner skipNexusStagingDeployMojo

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

Ar ôl uwchlwytho ciplun/rhyddhau mae fersiynau ar gael yn storfeydd llwyfannu

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

Mwy o fanteision

  • Rhestr gyfoethog iawn o dargedau ar gyfer gweithio gyda'r gadwrfa nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Gwiriad rhyddhau awtomatig ar gyfer llwytho i lawr yn maven ganolog

I'r cynnwys

Canlyniad

Cyhoeddi Fersiwn ciplun

Wrth adeiladu prosiect, mae'n bosibl cychwyn tasg â llaw i lawrlwytho'r fersiwn SNAPSHOT i nexus

Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

Pan fydd y dasg hon yn cael ei lansio, mae'r dasg gyfatebol yn y prosiect lleoli yn cael ei sbarduno (enghraifft).

log wedi'i docio

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

O ganlyniad, mae'r fersiwn nexus yn cael ei lwytho 1.0.0-CRYNODEB.

Gellir tynnu pob fersiwn ciplun o'r ystorfa ar y wefan oss.sonatype.org dan eich cyfrif.

Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

I'r cynnwys

Cyhoeddi'r fersiwn rhyddhau

Pan fydd y tag wedi'i osod, mae'r dasg gyfatebol yn y prosiect lleoli yn cael ei sbarduno'n awtomatig i uwchlwytho'r fersiwn rhyddhau i nexus (enghraifft).

Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

Y rhan orau yw bod rhyddhau agos yn sbarduno'n awtomatig mewn 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] ------------------------------------------------------------------------

Ac os aeth rhywbeth o'i le, yna bydd y dasg yn methu

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

O ganlyniad, dim ond un dewis sydd gennym ar ôl. Neu dileu'r fersiwn hon neu ei chyhoeddi.

Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

Ar ôl y rhyddhau, ar ôl peth amser, bydd yr arteffactau i mewn Sefydlu GitLab CI i uwchlwytho prosiect java i maven central

offtopig

Roedd yn ddatguddiad i mi fod maven yn mynegeio cadwrfeydd cyhoeddus eraill.
Roedd yn rhaid i mi uwchlwytho robots.txt oherwydd ei fod yn mynegeio fy hen gadwrfa.

I'r cynnwys

Casgliad

Yr hyn sydd gennym

  • Prosiect defnyddio ar wahân lle gallwch chi weithredu sawl tasg CI ar gyfer uwchlwytho arteffactau i gadwrfeydd cyhoeddus ar gyfer ieithoedd datblygu amrywiol.
  • Mae'r prosiect lleoli wedi'i ynysu rhag ymyrraeth allanol a dim ond defnyddwyr sydd â rolau Perchennog a Chynhaliwr sy'n gallu ei addasu.
  • Отдельный Specific Runner с "горячим" кэшем для запуска только deploy задач.
  • Cyhoeddi fersiynau ciplun/rhyddhau mewn cadwrfa gyhoeddus.
  • Gwiriad awtomatig o'r fersiwn rhyddhau i weld a yw'n barod i'w gyhoeddi yn maven central.
  • Защита от автоматической публикации "сырых" версий в maven central.
  • Сборка и публикация snapshot версий "по клику".
  • Ystorfa sengl ar gyfer cael fersiynau ciplun/rhyddhau.
  • Piblinell gyffredinol ar gyfer adeiladu / profi / cyhoeddi prosiect java.

Настройка GitLab CI не такая сложная тема как кажется на первый взгляд. Достаточно пару раз настроить CI "под ключ" и вот, ты уже далеко не дилетант в этом деле. Тем более GitLab документация весьма избыточна. Не бойтесь делать первый шаг. Дорога возникает под шагами идущего (не помню кто сказал 🙂 ).

Byddaf yn falch o roi adborth.

Yn yr erthygl nesaf, byddaf yn dangos i chi sut i sefydlu GitLab CI i redeg tasgau prawf integreiddio yn gystadleuol (rhedeg gwasanaethau prawf gyda chyfansoddi docwyr) os mai dim ond un rhedwr cragen sydd gennych.

I'r cynnwys

Ffynhonnell: hab.com

Ychwanegu sylw