java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

Bu məqalə GitLab istifadə edərək sonatip və/və ya maven mərkəzi repozitoriyalarında öz məhsullarını tez dərc etməli olan java tərtibatçıları üçün nəzərdə tutulub. Bu yazıda mən bu problemi həll etmək üçün gitlab-runner, gitlab-ci və maven-plugin qurmaq haqqında danışacağam.

Ön şərtlər:

  • Mvn və GPG açarlarının təhlükəsiz saxlanması.
  • İctimai CI tapşırıqlarının təhlükəsiz icrası.
  • Artefaktların (buraxılış/snapshot) ictimai depolara yüklənməsi.
  • Maven center-də dərc üçün buraxılış versiyalarının avtomatik yoxlanılması.
  • Artefaktları çoxsaylı layihələr üçün depoya yükləmək üçün ümumi həll.
  • Sadəlik və istifadə rahatlığı.

Məzmun

Ümumi məlumat

  • Sonatype OSS Repository Hosting Service vasitəsilə Maven Central-a artefaktların dərc edilməsi mexanizminin ətraflı təsviri artıq burada təsvir edilmişdir. bu məqalə istifadəçi Googolplex, buna görə də bu məqaləyə lazımi yerlərdə müraciət edəcəyəm.
  • Öncədən qeydiyyatdan keçin Sonatip JIRA və deponu açmaq üçün biletə başlayın (ətraflı məlumat üçün bölməni oxuyun Sonatype JIRA bileti yaradın). Repozitoriya açıldıqdan sonra JIRA giriş/parol cütü (bundan sonra Sonatype hesabı adlandırılacaq) Sonatype nexusuna artefaktları yükləmək üçün istifadə olunacaq.
  • Bundan əlavə, GPG açarının yaradılması prosesi çox quru şəkildə təsvir edilmişdir. Ətraflı məlumat üçün bölməyə baxın. Artefaktları imzalamaq üçün GnuPG konfiqurasiyası
  • Əgər siz GPG açarı (gnupg/gnupg2) yaratmaq üçün Linux konsolundan istifadə edirsinizsə, onda siz quraşdırmalısınız. rng-tools entropiya yaratmaq. Əks halda, açarın yaradılması çox uzun vaxt apara bilər.
  • Saxlama xidmətləri ictimaiyyət GPG açarları

Məzmuna

GitLab-da yerləşdirmə layihəsinin qurulması

  • İlk növbədə, artefaktların yerləşdirilməsi üçün boru kəmərinin saxlanacağı bir layihə yaratmalı və konfiqurasiya etməlisiniz. Layihəmi sadə və sadə adlandırdım - yerləşdirmək
  • Repozitoriya yaratdıqdan sonra repozitoriyanı dəyişdirmək üçün girişi məhdudlaşdırmalısınız.
    Layihə -> Parametrlər -> Repozitoriya -> Qorunan Filiallara gedin. Biz bütün qaydaları silir və yalnız Maintainers rolu olan istifadəçilər üçün təkan və birləşmə hüququ ilə Wildcard * ilə bir qayda əlavə edirik. Bu qayda həm bu layihənin bütün istifadəçiləri, həm də bu layihənin aid olduğu qrup üçün işləyəcək.
    java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması
  • Bir neçə baxıcı varsa, ən yaxşı həll prinsipcə layihəyə girişi məhdudlaşdırmaq olardı.
    Layihə -> Parametrlər -> Ümumi -> Görünüş, layihə xüsusiyyətləri, icazələrə gedin və Layihənin görünməsini təyin edin Xüsusi.
    Mən öz GitLab Runner-dən istifadə etdiyim üçün və yalnız deponu dəyişdirmək imkanım olduğu üçün ictimai çıxışda bir layihəm var. Əslində, ictimai boru kəməri jurnallarında şəxsi məlumatları göstərmək mənim maraqlarımda deyil.
  • Anbarın dəyişdirilməsi qaydalarının sərtləşdirilməsi
    Layihə -> Parametrlər -> Repozitoriya -> Push Qaydalarına gedin və Komitent məhdudiyyətini təyin edin, Müəllifin GitLab istifadəçisi olub olmadığını yoxlayın. Mən də təyin etməyi məsləhət görürəm imza atmaq, və İmzasız öhdəliyi rədd et bayrağını təyin edin.
  • Sonra, tapşırıqları yerinə yetirmək üçün bir tətiyi konfiqurasiya etməlisiniz
    Layihə -> Parametrlər -> CI / CD -> Boru kəməri tetikleyicilerine gedin və yeni trigger-token yaradın.
    Bu işarə dərhal bir qrup layihələr üçün dəyişənlərin ümumi konfiqurasiyasına əlavə edilə bilər.
    Qrupa gedin -> Parametrlər -> CI / CD -> Dəyişənlər və dəyişən əlavə edin DEPLOY_TOKEN dəyərdə trigger-token ilə.

Məzmuna

GitLab Runner

Bu bölmə yerli (Xüsusi) və ictimai (Paylaşılan) qaçışçıdan istifadə edərək yerləşdirmə zamanı tapşırıqların icrası üçün konfiqurasiyanı təsvir edir.

Xüsusi Runner

Mən öz qaçışlarımdan istifadə edirəm, çünki ilk növbədə rahat, sürətli, ucuzdur.
Qaçış üçün mən 1 CPU, 2 GB RAM, 20 GB HDD ilə Linux VDS tövsiyə edirəm. Buraxılış qiyməti ~ illik 3000₽.

Mənim qaçışçım

Qaçış üçün VDS 4 CPU, 4 GB RAM, 50 GB SSD götürdüm. Qiyməti ~11000₽ və heç vaxt peşman deyiləm.
Cəmi 7 maşınım var. Arubada 5, İhorda 2.

Beləliklə, bir qaçışçımız var. İndi biz onu quracağıq.
SSH vasitəsilə maşına gedirik və java, git, maven, gnupg2 quraşdırırıq.

Məzmuna

Gitlab runner quraşdırılması

  • Yeni qrup yaradın runner
    sudo groupadd runner
  • Maven keşi üçün kataloq yaradın və qrup hüquqları təyin edin runner
    Eyni maşında birdən çox qaçış keçirməyi planlaşdırmırsınızsa, bu addımı atlaya bilərsiniz.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • İstifadəçi yaradın gitlab-deployer və qrupa əlavə edin runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Fayla əlavə edin /etc/ssh/sshd_config növbəti sətir
    AllowUsers root@* [email protected]
  • Yenidən başladın sshd
    systemctl restart sshd
  • İstifadəçi üçün parol təyin edin gitlab-deployer (sadə ola bilər, çünki localhost üçün məhdudiyyət var)
    passwd gitlab-deployer
  • GitLab Runner quraşdırın (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
  • Gitlab.com -> Deploy-project -> Parametrlər -> CI/CD -> Runners -> Spesifik Qaçışçılara gedin və qeydiyyat nişanını kopyalayın

Ekran

java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

  • Qaçışçının qeydiyyatı
    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!

  • Qaçışçının qeydiyyatdan keçdiyini yoxlayın. Get gitlab.com -> Deploy-project -> Parametrlər -> CI/CD -> Runners -> Spesifik Qaçışçılar -> Bu layihə üçün aktivləşdirilmiş qaçışçılar

Ekran

java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

  • Əlavə edin ayrı xidmət /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
  • Xidmətə başlayırıq.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Qaçışın qaçdığını yoxlayın.

Misal

java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

Məzmuna

GPG açar generasiyası

  • Eyni maşından istifadəçinin altında ssh vasitəsilə gedirik gitlab-deployer (bu, GPG açarının yaradılması üçün vacibdir)

    ssh [email protected]

  • Suallara cavab verərək açar yaradırıq. Mən öz adımdan və e-poçtumdan istifadə etdim.
    Açar üçün parol təyin etməyinizə əmin olun. Artefaktlar bu açarla imzalanacaq.

    gpg --gen-key 

  • Yoxlayın

    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

  • Açıq açarımız açar serverə yüklənir

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

Məzmuna

Maven quraşdırma

  • İstifadəçinin altına giririk gitlab-deployer
    su gitlab-deployer 
  • Maven kataloqu yaradın saxlanılan yer və keş ilə əlaqə (səhv etmə)
    Eyni maşında bir neçə qaçış keçirməyi planlaşdırmırsınızsa, bu addım atlana bilər.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Əsas açar yaradın
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • ~/.m2/settings-security.xml faylı yaradın
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype hesabından parolun şifrələnməsi
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • ~/.m2/settings.xml faylı yaradın
    <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>

harada,
GPG_SECRET_KEY_PASSPHRASE - GPG açar parolu
SONATYPE_USERNAME - sonatype hesaba giriş

Bu, qaçışçının quraşdırılmasını tamamlayır, bölməyə davam edə bilərsiniz GitLab CI

Məzmuna

Paylaşılan Runner

GPG açar generasiyası

  • Əvvəlcə GPG açarı yaratmalısınız. Bunu etmək üçün gnupg quraşdırın.

    yum install -y gnupg

  • Suallara cavab verərək açar yaradırıq. Mən öz adımdan və e-poçtumdan istifadə etdim. Açar üçün parol təyin etməyinizə əmin olun.

    gpg --gen-key 

  • Əsas məlumatları əldə edin

    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]

  • Açıq açarımız açar serverə yüklənir

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

  • Şəxsi açarın əldə edilməsi

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

  • Layihə parametrlərinə keçin -> Parametrlər -> CI / CD -> Dəyişənlər və şəxsi açarı dəyişəndə ​​saxlayın GPG_SECRET_KEY
    java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

Məzmuna

Maven quraşdırma

  • Əsas açar yaradın
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Layihə parametrlərinə keçin -> Parametrlər -> CI / CD -> Dəyişənlər və dəyişəndə ​​yadda saxlayın SETTINGS_SECURITY_XML aşağıdakı sətirlər:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype hesabından parolun şifrələnməsi
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Layihə parametrlərinə keçin -> Parametrlər -> CI / CD -> Dəyişənlər və dəyişəndə ​​yadda saxlayın SETTINGS_XML aşağıdakı sətirlər:
    <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>

harada,
GPG_SECRET_KEY_PASSPHRASE - GPG açar parolu
SONATYPE_USERNAME - sonatype hesaba giriş

Məzmuna

Docker şəklini yerləşdirin

  • İstədiyiniz Java versiyası ilə yerləşdirmə zamanı tapşırıqları yerinə yetirmək üçün kifayət qədər sadə Dockerfile yaradırıq. Aşağıda alp üçün bir nümunə verilmişdir.

    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/

  • Layihəniz üçün konteyner tikmək

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

  • Konteyneri təsdiqləyirik və reyestrə yükləyirik.

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

Məzmuna

GitLab CI

Layihəni yerləşdirin

.gitlab-ci.yml faylını yerləşdirmə layihəsinin kökünə əlavə edin
Skript bir-birini istisna edən iki yerləşdirmə tapşırığını təqdim edir. Müvafiq olaraq Xüsusi Runner və ya Paylaşılan Runner.

.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

Məzmuna

Java layihəsi

İctimai repozitoriyalara yüklənməsi nəzərdə tutulan java layihələrində Release və Snapshot versiyalarını yükləmək üçün 2 addım əlavə etməlisiniz.

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

Bu həlldə mən bir qədər irəli getdim və java layihələri üçün bir CI şablonundan istifadə etmək qərarına gəldim.

Daha ətraflı məlumat

Ayrı bir layihə yaratdım gitlab-ci java layihələri üçün CI şablonunu yerləşdirdi ümumi.yml.

ümumi.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

Nəticədə, java layihələrinin özündə .gitlab-ci.yml çox yığcam görünür və ətraflı deyil

.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

Məzmuna

pom.xml konfiqurasiyası

Bu mövzu çox ətraflı təsvir edilmişdir. Googolplex в Avtomatik imzalamaq və artefaktları snapshot və səhnələşdirmə depolarına yükləmək üçün maven qurulması, buna görə də plaginlərdən istifadənin bəzi nüanslarını təsvir edəcəyəm. Nə qədər asan və təbii şəkildə istifadə edə biləcəyinizi də təsvir edəcəyəm nexus-staging-maven-pluginorg.sonatype.oss:oss-parent-i layihəniz üçün valideyn kimi istifadə etmək istəmirsinizsə və ya istifadə edə bilmirsinizsə.

maven-quraşdırma-plugin

Modulları yerli depoda quraşdırır.
Digər layihələrdə həllərin yerli yoxlanması, həmçinin yoxlama məbləği üçün çox faydalıdır.

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

Məzmuna

maven-javadoc-plugin

Layihə üçün javadoc yaradılır.

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

Əgər sizdə java olmayan modul varsa (məsələn, yalnız resurslar)
Və ya prinsipcə javadoc yaratmaq, sonra kömək etmək istəmirsiniz 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>

Məzmuna

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>

Məzmuna

nexus-staging-maven-plugin

Konfiqurasiya:

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

Çox modullu layihəniz varsa və anbara xüsusi modul yükləməyinizə ehtiyac yoxdursa, bu modulun pom.xml-ə əlavə etməlisiniz. nexus-staging-maven-plugin bayraqla skipNexusStagingDeployMojo

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

Snapshot/buraxılış versiyaları yükləndikdən sonra burada mövcuddur səhnələşdirmə anbarları

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

Daha çox üstünlüklər

  • Nexus repozitoriyası ilə işləmək üçün hədəflərin çox zəngin siyahısı (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Maven Central-da yükləmə qabiliyyətinin avtomatik buraxılış yoxlanışı

Məzmuna

Nəticə

SNAPSHOT Versiyasının nəşri

Layihə qurarkən, SNAPSHOT versiyasını nexus-a yükləmək üçün tapşırığı əl ilə başlamaq mümkündür

java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

Bu tapşırıq işə salındıqda, yerləşdirmə layihəsində müvafiq tapşırıq işə salınır (misal).

kəsilmiş 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] ------------------------------------------------------------------------

Nəticədə, nexus versiyası yüklənir 1.0.0-ŞƏRH.

Bütün snapshot versiyaları saytdakı depodan silinə bilər oss.sonatype.org hesabınızın altında.

java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

Məzmuna

Buraxılış versiyasının nəşri

Teq təyin edildikdə, buraxılış versiyasını Nexus-a yükləmək üçün yerləşdirmə layihəsində müvafiq tapşırıq avtomatik olaraq işə salınır (misal).

java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

Ən yaxşısı odur ki, yaxın buraxılış avtomatik olaraq nexus-da işə salınır.

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

Və bir şey səhv olarsa, tapşırıq uğursuz olacaq

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

Nəticədə qarşımızda yalnız bir seçim qalır. Və ya bu versiyanı silin və ya dərc edin.

java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

Buraxıldıqdan sonra bir müddət sonra əsərlər içəridə olacaq java layihəsini maven mərkəzinə yükləmək üçün GitLab CI-nin qurulması

mövzudan kənar

Maven'in digər ictimai depoları indeksləməsi mənə bir vəhy oldu.
Mən robots.txt faylını yükləməli oldum, çünki o, mənim köhnə depomu indeksləşdirdi.

Məzmuna

Nəticə

Bizdə nə var

  • Müxtəlif inkişaf dilləri üçün ictimai repozitoriyalara artefaktların yüklənməsi üçün bir neçə CI tapşırığını həyata keçirə biləcəyiniz ayrıca yerləşdirmə layihəsi.
  • Yerləşdirmə layihəsi kənar müdaxilədən təcrid olunub və yalnız Sahib və Təminatçı rolu olan istifadəçilər tərəfindən dəyişdirilə bilər.
  • Yalnız yerləşdirmə tapşırıqlarını yerinə yetirmək üçün "isti" keş ilə ayrıca Xüsusi Runner.
  • Snapshot/reliz versiyalarının ictimai depoda dərci.
  • Maven center-də nəşrə hazır olmaq üçün buraxılış versiyasının avtomatik yoxlanılması.
  • Maven center-də “xam” versiyaların avtomatik dərcinə qarşı qorunma.
  • Snapshot versiyalarını “kliklə” yaradın və dərc edin.
  • Snapshot/buraxılış versiyaları əldə etmək üçün tək depo.
  • Java layihəsinin qurulması / sınaqdan keçirilməsi / nəşri üçün ümumi boru kəməri.

GitLab CI-nin qurulması ilk baxışdan göründüyü qədər mürəkkəb bir mövzu deyil. Bir neçə dəfə açar təslim əsasında CI qurmaq kifayətdir və indi bu məsələdə həvəskardan uzaqsınız. Üstəlik, GitLab sənədləri çox lazımsızdır. İlk addımı atmaqdan qorxma. Yol gedən adamın addımlarının altında görünür (kimin dediyini xatırlamıram :)

Mən rəy bildirməkdən şad olaram.

Növbəti məqalədə mən sizə GitLab CI-ni inteqrasiya test tapşırıqlarını rəqabətli şəkildə yerinə yetirmək üçün necə quracağınızı göstərəcəyəm (docker-compose ilə test xidmətlərini yerinə yetirmək), əgər yalnız bir shell runneriniz varsa.

Məzmuna

Mənbə: www.habr.com

Добавить комментарий