Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

Þessi grein er ætluð Java forriturum sem þurfa að birta vörur sínar fljótt í sonatype og/eða maven miðlægar geymslur með GitLab. Í þessari grein mun ég tala um að setja upp gitlab-runner, gitlab-ci og maven-plugin til að leysa þetta vandamál.

Forkröfur:

  • Örugg geymsla mvn og GPG lykla.
  • Örugg framkvæmd opinberra CI verkefna.
  • Hleður upp gripum (útgáfu/skynmynd) í opinberar geymslur.
  • Sjálfvirk athugun á útgáfuútgáfum til birtingar í Maven Central.
  • Almenn lausn til að hlaða upp gripum í geymslu fyrir mörg verkefni.
  • Einfaldleiki og auðveld notkun.

efni

Almennar upplýsingar

  • Ítarlegri lýsingu á vélbúnaðinum til að birta gripi til Maven Central í gegnum Sonatype OSS geymsluhýsingarþjónustuna er þegar lýst í Þessi grein notandi Googolplex, svo ég mun vísa í þessa grein á réttum stöðum.
  • Forskráning kl Sónagerð JIRA og byrjaðu á miða til að opna geymsluna (fyrir frekari upplýsingar, lestu kaflann Búðu til Sonatype JIRA miða). Eftir að geymslan hefur verið opnuð verður JIRA innskráning/lykilorð parið (hér eftir nefnt Sonatype reikningurinn) notað til að hlaða upp gripum í Sonatype tengslin.
  • Ennfremur er ferlinu við að búa til GPG lykil lýst mjög þurrt. Sjá kaflann fyrir frekari upplýsingar. Stillir GnuPG til að undirrita artifacts
  • Ef þú ert að nota Linux stjórnborðið til að búa til GPG lykil (gnupg/gnupg2), þá þarftu að setja upp RNG-verkfæri að búa til óreiðu. Annars getur lyklagerð tekið mjög langan tíma.
  • Geymsluþjónusta almennings GPG lyklar

Að innihaldinu

Að setja upp dreifingarverkefni í GitLab

  • Fyrst af öllu þarftu að búa til og stilla verkefni þar sem leiðslan verður geymd til að dreifa gripum. Ég kallaði verkefnið mitt einfaldlega og óbrotið - dreifa
  • Eftir að hafa búið til geymsluna þarftu að takmarka aðgang til að breyta geymslunni.
    Farðu í verkefnið -> Stillingar -> Geymsla -> Vernduð útibú. Við eyðum öllum reglum og bætum við einni reglu með Wildcard * með réttinum til að ýta og sameina aðeins fyrir notendur með viðhaldshlutverkið. Þessi regla mun virka fyrir alla notendur bæði þessa verkefnis og hópsins sem þetta verkefni tilheyrir.
    Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central
  • Ef það eru nokkrir umsjónarmenn, þá væri besta lausnin að takmarka aðgang að verkefninu í grundvallaratriðum.
    Farðu í verkefnið -> Stillingar -> Almennt -> Sýnileiki, eiginleikar verkefnisins, heimildir og stilltu Sýnileika verkefnis á Einka.
    Ég er með verkefni í almennum aðgangi, þar sem ég nota minn eigin GitLab Runner og aðeins ég hef aðgang til að breyta geymslunni. Jæja, reyndar er það ekki í mínum hagsmunum að sýna einkaupplýsingar í opinberum leiðsluskrám.
  • Herða reglur um breytingu á geymslunni
    Farðu í verkefnið -> Stillingar -> Geymsla -> Push Rules og stilltu fánana Committer limitation, Athugaðu hvort höfundur er GitLab notandi. Ég mæli líka með stillingu skuldbinda sig til að skrifa undir, og stilltu Reject unsigned commit flagið.
  • Næst þarftu að stilla kveikju til að keyra verkefni
    Farðu í verkefni -> Stillingar -> CI / CD -> Pipeline triggers og búðu til nýtt trigger-tákn
    Þessum tákni er strax hægt að bæta við almenna stillingu breyta fyrir hóp verkefna.
    Farðu í hópinn -> Stillingar -> CI / CD -> Breytur og bættu við breytu DEPLOY_TOKEN með trigger-token í gildinu.

Að innihaldinu

GitLab Runner

Þessi hluti lýsir uppsetningunni fyrir að keyra verkefni við uppsetningu með því að nota innfædda (sérstaka) og opinbera (samnýttu) hlauparann.

Sérstakur hlaupari

Ég nota mína eigin hlaupara, því fyrst og fremst er það þægilegt, hratt, ódýrt.
Fyrir hlaupara mæli ég með Linux VDS með 1 CPU, 2 GB vinnsluminni, 20 GB HDD. Útgáfuverð ~3000 ₽ á ári.

Hlauparinn minn

Fyrir hlauparann ​​tók ég VDS 4 CPU, 4 GB vinnsluminni, 50 GB SSD. Það kostaði ~11000₽ og sá aldrei eftir því.
Ég á alls 7 vélar. 5 á Aruba og 2 á ihor.

Svo erum við með hlaupara. Nú munum við setja það upp.
Við förum í vélina í gegnum SSH og setjum upp java, git, maven, gnupg2.

Að innihaldinu

Er að setja upp gitlab runner

  • Búðu til nýjan hóp runner
    sudo groupadd runner
  • Búðu til möppu fyrir maven skyndiminni og úthlutaðu hópréttindum runner
    Þú getur sleppt þessu skrefi ef þú ætlar ekki að keyra marga hlaupara á sömu vélinni.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Búðu til notanda gitlab-deployer og bæta í hópinn runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Bæta við skrá /etc/ssh/sshd_config næstu línu
    AllowUsers root@* [email protected]
  • Endurræstu sshd
    systemctl restart sshd
  • Stilltu lykilorð fyrir notandann gitlab-deployer (það getur verið einfalt, þar sem það er takmörkun fyrir localhost)
    passwd gitlab-deployer
  • Settu upp 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
  • Farðu á gitlab.com -> deploy-project -> Stillingar -> CI/CD -> Runners -> Specific Runners og afritaðu skráningartáknið

Skjár

Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

  • Skráning á hlaupara
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

ferlið

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!

  • Athugaðu hvort hlauparinn sé skráður. Farðu á gitlab.com -> deploy-project -> Stillingar -> CI/CD -> Hlauparar -> Sérstakir hlauparar -> Hlauparar virkjaðir fyrir þetta verkefni

Skjár

Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

  • Bæta við aðskilin þjónustu /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
  • Við hefjum þjónustuna.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Athugaðu hvort hlauparinn sé í gangi.

Dæmi

Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

Að innihaldinu

GPG lyklagerð

  • Frá sömu vél förum við um ssh undir notanda gitlab-deployer (þetta er mikilvægt fyrir GPG lyklagerð)

    ssh [email protected]

  • Við búum til lykil með því að svara spurningum. Ég notaði mitt eigið nafn og netfang.
    Vertu viss um að tilgreina lykilorð fyrir lykilinn. Munir verða undirritaðir með þessum lykli.

    gpg --gen-key 

  • Athuga

    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

  • Hleður upp almenningslyklinum okkar á lyklaþjóninn

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

Að innihaldinu

Maven uppsetning

  • Við förum undir notandann gitlab-deployer
    su gitlab-deployer 
  • Búðu til maven möppu geymsla og tengja við skyndiminni (ekki gera mistök)
    Þetta skref er hægt að sleppa ef þú ætlar ekki að keyra nokkra hlaupara á sömu vélinni.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Búðu til aðallykil
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Búðu til skrána ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Dulkóðar lykilorðið frá Sonatype reikningnum
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Búðu til skrána ~/.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>

hvar,
GPG_SECRET_KEY_PASSPHRASE - GPG lykilorð lykilorðs
SONATYPE_USERNAME - innskráning sonatype reiknings

Þetta lýkur uppsetningu hlaupara, þú getur haldið áfram í hlutann GitLab CI

Að innihaldinu

Sameiginlegur hlaupari

GPG lyklagerð

  • Fyrst af öllu þarftu að búa til GPG lykil. Til að gera þetta skaltu setja upp gnupg.

    yum install -y gnupg

  • Við búum til lykil með því að svara spurningum. Ég notaði mitt eigið nafn og netfang. Vertu viss um að tilgreina lykilorðið fyrir lykilinn.

    gpg --gen-key 

  • Sækja lykilupplýsingar

    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]

  • Hleður upp almenningslyklinum okkar á lyklaþjóninn

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

  • Að fá einkalykil

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

  • Farðu í verkefnastillingar -> Stillingar -> CI / CD -> Breytur og vistaðu einkalykilinn í breytu GPG_SECRET_KEY
    Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

Að innihaldinu

Maven uppsetning

  • Búðu til aðallykil
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Farðu í verkefnastillingar -> Stillingar -> CI / CD -> Breytur og vistaðu í breytu SETTINGS_SECURITY_XML eftirfarandi línur:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Dulkóðar lykilorðið frá Sonatype reikningnum
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Farðu í verkefnastillingar -> Stillingar -> CI / CD -> Breytur og vistaðu í breytu SETTINGS_XML eftirfarandi línur:
    <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>

hvar,
GPG_SECRET_KEY_PASSPHRASE - GPG lykilorð lykilorðs
SONATYPE_USERNAME - innskráning sonatype reiknings

Að innihaldinu

Settu upp bryggjumynd

  • Við búum til frekar einfalda Dockerfile til að keyra verkefni á dreifingu með æskilegri útgáfu af Java. Hér að neðan er dæmi um alpa.

    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/

  • Byggja gám fyrir verkefnið þitt

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

  • Við auðkennum og hleðum ílátið inn í skrásetninguna.

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

Að innihaldinu

GitLab CI

Senda verkefni

Bættu skránni .gitlab-ci.yml við rót dreifingarverkefnisins
Handritið sýnir tvö dreifingarverkefni sem útiloka hvor aðra. Sérstakur hlaupari eða sameiginlegur hlaupari í sömu röð.

.gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # Задача будет выполняться на вашем shell-раннере
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # Задача будет выполняться на публичном docker-раннере
  tags:
    - docker
  # Образ из раздела GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # Импортируем GPG ключ
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # Сохраняем maven конфигурацию
    - printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # Задача сработает по триггеру, если передана переменная DEPLOY со значением java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # отключаем клонирование текущего проекта
    GIT_STRATEGY: none
  script:
    # Предоставляем возможность хранения пароля в незашифрованном виде
    - git config --global credential.helper store
    # Сохраняем временные креды пользователя gitlab-ci-token
    # Токен работает для всех публичных проектов gitlab.com и для проектов группы
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
    # Полностью чистим текущую директорию
    - rm -rf .* *
    # Клонируем проект который, будем деплоить в Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # Переключаемся на нужный коммит
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Если хоть один pom.xml содержит параметр autoReleaseAfterClose валим сборку.
    # В противном случае есть риск залить сырые артефакты в maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
          exit 1;
        fi;
      done
    # Если параметр DEPLOY_CI_COMMIT_TAG пустой, то принудительно ставим SNAPSHOT-версию
    - >
      if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
        mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
      else
        VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
        if [[ "${VERSION}" == *-SNAPSHOT ]]; then
          mvn versions:set -DnewVersion=${VERSION}
        else
          mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
        fi
      fi
    # Запускаем задачу на сборку и деплой артефактов
    - mvn clean deploy -DskipTests=true

Að innihaldinu

Java verkefni

Í java verkefnum sem eiga að vera hlaðið upp á opinberar geymslur þarftu að bæta við 2 skrefum til að hlaða niður útgáfu og skyndimynd útgáfum.

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

Í þessari lausn gekk ég aðeins lengra og ákvað að nota eitt CI sniðmát fyrir java verkefni.

Nánari upplýsingar

Ég bjó til sérstakt verkefni gitlab-ci þar sem hann setti CI sniðmátið fyrir java verkefni algengt.yml.

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

Fyrir vikið lítur .gitlab-ci.yml út í java-verkefnunum sjálfum mjög fyrirferðarlítið og ekki orðrétt.

.gitlab-ci.yml

include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml

Shields4J:
  extends: .build_java_project

Sphinx doc:
  extends: .build_sphinx_doc
  variables:
    DOCKERFILE: .docs/Dockerfile

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

Að innihaldinu

pom.xml stillingar

Þessu efni er lýst mjög ítarlega. Googolplex в Að setja upp maven til að undirrita sjálfkrafa og hlaða upp gripum í skyndimynda- og sviðsetningargeymslur, svo ég mun lýsa nokkrum blæbrigðum þess að nota viðbætur. Ég mun líka lýsa því hversu auðveldlega og náttúrulega þú getur notað nexus-staging-maven-pluginef þú vilt ekki eða getur ekki notað org.sonatype.oss:oss-parent sem foreldri fyrir verkefnið þitt.

maven-install-plugin

Setur upp einingar í staðbundinni geymslu.
Mjög gagnlegt fyrir staðbundna sannprófun á lausnum í öðrum verkefnum, sem og eftirlitssumma.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-project</id>
      <!-- Если у вас многомодульный проект с деплоем родительского помика -->
      <phase>install</phase>
      <!-- Явно указываем файлы для локальной установки -->
      <configuration>
        <file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
        <pomFile>dependency-reduced-pom.xml</pomFile>
        <!-- Принудительное обновление метаданных проекта -->
        <updateReleaseInfo>true</updateReleaseInfo>
        <!-- Контрольные суммы для проверки целостности -->
        <createChecksum>true</createChecksum>
      </configuration>
    </execution>
  </executions>
</plugin>

Að innihaldinu

maven-javadoc-viðbót

Búa til javadoc fyrir verkefnið.

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

Ef þú ert með einingu sem inniheldur ekki Java (til dæmis aðeins tilföng)
Eða þú vilt ekki búa til javadoc í grundvallaratriðum, þá til að hjálpa maven-jar-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>empty-javadoc-jar</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <classifier>javadoc</classifier>
        <classesDirectory>${basedir}/javadoc</classesDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Að innihaldinu

maven-gpg-viðbót

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- Сборка будет падать, если отсутствует GPG ключ -->
      <!-- Подписываем артефакты только на фазе deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Að innihaldinu

nexus-staging-maven-plugin

Stillingar:

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

Ef þú ert með verkefni með mörgum einingum og þú þarft ekki að hlaða upp ákveðinni einingu í geymsluna, þá þarftu að bæta við pom.xml þessarar einingar nexus-staging-maven-plugin með fána skipNexusStagingDeployMojo

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

Eftir að hafa hlaðið upp skyndimynd/útgáfu eru útgáfur fáanlegar í sviðsetningargeymslur

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

Fleiri plúsar

  • Mjög ríkur listi yfir markmið til að vinna með nexus geymsluna (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Sjálfvirk losunarathugun á niðurhalshæfni í maven central

Að innihaldinu

Niðurstaðan

Gefa út SNAPSHOT útgáfu

Þegar verkefni er byggt er hægt að hefja handvirkt verkefni til að hlaða niður SNAPSHOT útgáfunni á nexus

Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

Þegar þetta verkefni er sett af stað er samsvarandi verkefni í dreifingarverkefninu ræst (Dæmi).

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

Fyrir vikið er nexus útgáfan hlaðin 1.0.0-SNAPSHOT.

Hægt er að fjarlægja allar myndatökuútgáfur úr geymslunni á síðunni oss.sonatype.org undir reikningnum þínum.

Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

Að innihaldinu

Útgáfa útgáfu útgáfunnar

Þegar merkið er stillt er samsvarandi verkefni í dreifingarverkefninu sjálfkrafa ræst til að hlaða upp útgáfuútgáfunni á nexus (Dæmi).

Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

Það besta er að lokaútgáfa fer sjálfkrafa af stað í 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] ------------------------------------------------------------------------

Og ef eitthvað fór úrskeiðis, þá mun verkefnið mistakast

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

Þar af leiðandi stöndum við eftir með aðeins eitt val. Eða eyða þessari útgáfu eða birta.

Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

Eftir útgáfuna, eftir nokkurn tíma, verða gripirnir komnir inn Að setja upp GitLab CI til að hlaða upp Java verkefni á Maven Central

utan umræðuefnis

Það var mér opinberun að Maven verðtryggir aðrar opinberar geymslur.
Ég þurfti að hlaða upp robots.txt vegna þess að það skráði gömlu geymsluna mína.

Að innihaldinu

Ályktun

Það sem við höfum

  • Sérstakt dreifingarverkefni þar sem þú getur innleitt nokkur CI verkefni til að hlaða upp gripum í opinberar geymslur fyrir ýmis þróunartungumál.
  • Dreifingarverkefnið er einangrað frá utanaðkomandi truflunum og einungis er hægt að breyta því af notendum með hlutverkin Owner og Maintainer.
  • Sérstakur hlaupari með „heitu“ skyndiminni til að keyra aðeins dreifingarverkefni.
  • Birting skyndimynda/útgáfuútgáfu í opinberri geymslu.
  • Sjálfvirk athugun á útgáfuútgáfunni til að vera reiðubúin til birtingar í Maven Central.
  • Vörn gegn sjálfvirkri birtingu á „hráum“ útgáfum í Maven Central.
  • Byggja og birta skyndimyndaútgáfur „með smelli“.
  • Ein geymsla til að fá skyndimynd/útgáfur.
  • Almenn leiðsla til að byggja / prófa / gefa út java verkefni.

Uppsetning GitLab CI er ekki eins flókið efni og það virðist við fyrstu sýn. Það er nóg að setja CI upp á turnkey grunni nokkrum sinnum, og nú ertu langt frá því að vera áhugamaður í þessu máli. Þar að auki eru GitLab skjöl mjög óþarfi. Ekki vera hræddur við að taka fyrsta skrefið. Vegurinn birtist undir tröppum þess sem gengur (ég man ekki hver sagði það :)

Ég mun vera fegin að fá endurgjöf.

Í næstu grein mun ég sýna þér hvernig á að setja upp GitLab CI til að keyra samþættingarprófunarverkefni samkeppnishæft (að keyra prófunarþjónustu með docker-compose) ef þú ert aðeins með einn skelhlaupara.

Að innihaldinu

Heimild: www.habr.com

Bæta við athugasemd