Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

Bu makale, ürünlerini GitLab kullanarak hızlı bir şekilde sonatype ve/veya maven merkezi depolarında yayınlaması gereken java geliştiricilerine yöneliktir. Bu yazımda bu sorunu çözmek için gitlab-runner, gitlab-ci ve maven-plugin kurulumundan bahsedeceğim.

Önkoşullar:

  • Mvn ve GPG anahtarlarının güvenli şekilde saklanması.
  • Genel CI görevlerinin güvenli bir şekilde yürütülmesi.
  • Yapıtların (yayın/anlık görüntü) genel depolara yüklenmesi.
  • Maven Central'da yayınlanmak üzere yayın sürümlerinin otomatik olarak kontrol edilmesi.
  • Birden fazla proje için yapıların bir havuza yüklenmesine yönelik genel bir çözüm.
  • Basitlik ve kullanım kolaylığı.

Içerik

Genel bilgi

  • Yapıtların Sonatype OSS Depo Barındırma Hizmeti aracılığıyla Maven Central'da yayınlanmasına yönelik mekanizmanın ayrıntılı bir açıklaması zaten şurada açıklanmıştır: bu makale kullanıcı googolplexbu yüzden bu makaleye doğru yerlerde başvuracağım.
  • Şu adreste ön kayıt yaptırın: Sonatip JIRA ve depoyu açmak için bir bilet açın (daha fazla ayrıntı için bölümü okuyun) Sonatype JIRA'da bir bilet oluşturun). Depoyu açtıktan sonra JIRA kullanıcı adı/şifre çifti (bundan sonra Sonatype hesabı olarak anılacaktır), eserleri Sonatype nexus'a yüklemek için kullanılacaktır.
  • Ayrıca bir GPG anahtarı oluşturma süreci çok kuru bir şekilde anlatılmaktadır. Daha fazla ayrıntı için bölüme bakın. GnuPG'yi yapıtları imzalayacak şekilde yapılandırma
  • GPG anahtarı (gnupg/gnupg2) oluşturmak için Linux konsolunu kullanıyorsanız, rng araçları entropi üretmek. Aksi takdirde anahtar üretimi çok uzun zaman alabilir.
  • Depolama Hizmetleri kamu GPG anahtarları

İçeriğe

GitLab'da bir dağıtım projesi kurma

  • Her şeyden önce, yapıtların dağıtımı için işlem hattının depolanacağı bir proje oluşturmanız ve yapılandırmanız gerekir. Projemi basit ve karmaşık olmayan bir şekilde adlandırdım - dağıtmak
  • Depoyu oluşturduktan sonra depoyu değiştirmek için erişimi kısıtlamanız gerekir.
    Projeye gidin -> Ayarlar -> Depo -> Korumalı Dallar. Tüm kuralları siliyor ve yalnızca Bakımcı rolüne sahip kullanıcılar için aktarma ve birleştirme hakkına sahip Wildcard * ile tek bir kural ekliyoruz. Bu kural hem bu projenin hem de bu projenin ait olduğu grubun tüm kullanıcıları için geçerli olacaktır.
    Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu
  • Birden fazla bakımcı varsa en iyi çözüm, prensipte projeye erişimi kısıtlamak olacaktır.
    Projeye gidin -> Ayarlar -> Genel -> Görünürlük, proje özellikleri, izinler ve Proje görünürlüğünü şu şekilde ayarlayın: Özel Etkinlik.
    Kendi GitLab Runner'ımı kullandığım ve depoyu değiştirme erişimine yalnızca benim sahip olduğum için, genel erişime açık bir projem var. Aslında özel bilgilerin halka açık boru hattı kayıtlarında gösterilmesi benim çıkarıma uygun değil.
  • Depoyu değiştirme kurallarının sıkılaştırılması
    Projeye gidin -> Ayarlar -> Depo -> Push Kuralları ve Committer kısıtlamasını ayarlayın, Yazarın GitLab kullanıcı bayrakları olup olmadığını kontrol edin. Ayrıca kurulum yapmanızı da öneririm imzalamayı taahhüt etve İmzasız taahhütleri reddet bayrağını ayarlayın.
  • Daha sonra görevleri başlatmak için bir tetikleyici yapılandırmanız gerekir
    Projeye gidin -> Ayarlar -> CI / CD -> İşlem hattı tetikleyicileri ve yeni bir tetikleyici belirteç oluşturun
    Bu belirteç, bir grup proje için değişkenlerin genel yapılandırmasına hemen eklenebilir.
    Gruba gidin -> Ayarlar -> CI / CD -> Değişkenler ve bir değişken ekleyin DEPLOY_TOKEN değerde tetikleyici belirteci ile.

İçeriğe

GitLab Koşucusu

Bu bölümde, yerel (Özel) ve genel (Paylaşılan) çalıştırıcıyı kullanarak dağıtımda görevleri çalıştırmaya yönelik yapılandırma açıklanmaktadır.

Spesifik Koşucu

Kendi koşucularımı kullanıyorum çünkü her şeyden önce kullanışlı, hızlı ve ucuz.
Bir koşucu için 1 CPU, 2 GB RAM, 20 GB HDD'li bir Linux VDS öneririm. İhraç fiyatı yıllık ~3000₽'dir.

Koşucum

Koşucu için VDS 4 CPU, 4 GB RAM, 50 GB SSD aldım. ~11000₽'ye mal oldu ve asla pişman olmadı.
Toplam 7 makinem var. Aruba'da 5 ve ihor'da 2.

Yani bir koşucumuz var. Şimdi onu ayarlayacağız.
Makineye SSH üzerinden gidip java, git, maven, gnupg2'yi kuruyoruz.

İçeriğe

Gitlab runner'ı yükleme

  • Yeni bir grup oluştur runner
    sudo groupadd runner
  • Maven önbelleği için bir dizin oluşturun ve grup haklarını atayın runner
    Bir makinede birden fazla koşucu çalıştırmayı planlamıyorsanız bu noktayı atlayabilirsiniz.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Kullanıcı oluştur gitlab-deployer ve gruba ekleyin runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Dosyaya ekle /etc/ssh/sshd_config Sonraki satır
    AllowUsers root@* [email protected]
  • yeniden başlat sshd
    systemctl restart sshd
  • Kullanıcı için bir şifre belirleyin gitlab-deployer (localhost için bir kısıtlama olduğundan basit olabilir)
    passwd gitlab-deployer
  • GitLab Runner'ı yükleyin (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 -> konuşlandırma projesi -> Ayarlar -> CI/CD -> Koşucular -> Belirli Koşucular'a gidin ve kayıt jetonunu kopyalayın

Ekran

Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

  • Koşucunun kaydedilmesi
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

Süreç

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!

  • Koşucunun kayıtlı olup olmadığını kontrol ediyoruz. gitlab.com web sitesine gidin -> konuşlandırma projesi -> Ayarlar -> CI/CD -> Koşucular -> Belirli Koşucular -> Bu proje için etkinleştirilen koşucular

Ekran

Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

  • ekleme ayrı hizmet /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
  • Servise başlıyoruz.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Koşucunun çalıştığını kontrol edin.

Örnek

Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

İçeriğe

GPG anahtarı oluşturma

  • Aynı makineden kullanıcının altındaki ssh aracılığıyla gidiyoruz gitlab-deployer (bu GPG anahtarı üretimi için önemlidir)

    ssh [email protected]

  • Soruları cevaplayarak bir anahtar oluşturuyoruz. Kendi adımı ve e-posta adresimi kullandım.
    Anahtarın şifresini belirttiğinizden emin olun. Eserler bu anahtarla imzalanacak.

    gpg --gen-key 

  • kontrol

    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

  • Genel anahtarımızı anahtar sunucusuna yükleme

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

İçeriğe

Maven'i kurma

  • Kullanıcının altına giriyoruz gitlab-deployer
    su gitlab-deployer 
  • Bir maven dizini oluşturun Depo ve önbellekle bağlantı kurun (hata yapmayın)
    Aynı makinede birden fazla koşucu çalıştırmayı planlamıyorsanız bu adım atlanabilir.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Bir ana anahtar oluşturun
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • ~/.m2/settings-security.xml dosyasını oluştur
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype hesabının şifresini şifrelemek
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • ~/.m2/settings.xml dosyası oluşturun
    <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>

nerede,
GPG_SECRET_KEY_PASSPHRASE - GPG anahtar şifresi
SONATYPE_USERNAME - sonatype hesabı girişi

Bu, koşucu kurulumunu tamamlar, bölüme geçebilirsiniz. GitLab CI

İçeriğe

Paylaşılan Koşucu

GPG anahtarı oluşturma

  • Öncelikle bir GPG anahtarı oluşturmanız gerekiyor. Bunu yapmak için gnupg'yi yükleyin.

    yum install -y gnupg

  • Soruları cevaplayarak bir anahtar oluşturuyoruz. Kendi adımı ve e-posta adresimi kullandım. Anahtarın şifresini belirttiğinizden emin olun.

    gpg --gen-key 

  • Önemli bilgileri alın

    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]

  • Genel anahtarımızı anahtar sunucusuna yükleme

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

  • Özel anahtarı alıyoruz

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

  • Proje ayarları -> Ayarlar -> CI / CD -> Değişkenler'e gidin ve özel anahtarı bir değişkene kaydedin GPG_SECRET_KEY
    Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

İçeriğe

Maven'i kurma

  • Bir ana anahtar oluşturun
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Proje ayarlarına gidin -> Ayarlar -> CI / CD -> Değişkenler ve bir değişkene kaydedin SETTINGS_SECURITY_XML aşağıdaki satırlar:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype hesabının şifresini şifrelemek
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Proje ayarlarına gidin -> Ayarlar -> CI / CD -> Değişkenler ve bir değişkene kaydedin SETTINGS_XML aşağıdaki satırlar:
    <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>

nerede,
GPG_SECRET_KEY_PASSPHRASE - GPG anahtar şifresi
SONATYPE_USERNAME - sonatype hesabı girişi

İçeriğe

Liman işçisi görüntüsünü dağıt

  • İstenilen Java sürümüyle dağıtım sırasında görevleri çalıştırmak için oldukça basit bir Docker dosyası oluşturuyoruz. Aşağıda alp için bir örnek verilmiştir.

    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/

  • Projeniz için bir konteyner oluşturma

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

  • Kabın kimliğini doğrulayıp kayıt defterine yüklüyoruz.

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

İçeriğe

GitLab CI

Projeyi dağıt

.gitlab-ci.yml dosyasını dağıtım projesinin köküne ekleyin
Komut dosyası, birbirini dışlayan iki dağıtım görevi sunar. Sırasıyla Belirli Koşucu veya Paylaşılan Koşucu.

.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

İçeriğe

Java projesi

Public repository'lere yüklenmesi gereken Java projelerinde Release ve Snapshot versiyonlarını indirmek için 2 adım eklemeniz gerekmektedir.

.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 çözümde biraz daha ileri giderek Java projeleri için tek bir CI şablonu kullanmaya karar verdim.

Daha fazla bilgi

Ayrı bir proje oluşturdum gitlab-ci Java projeleri için CI şablonunu yerleştirdiği yer ortak.yml.

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

Sonuç olarak, Java projelerinde .gitlab-ci.yml çok kompakt görünüyor ve ayrıntılı değil

.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

İçeriğe

pom.xml yapılandırması

Bu konu çok detaylı bir şekilde anlatılmıştır. googolplex в Yapıları otomatik olarak imzalamak ve anlık görüntü ve hazırlama depolarına yüklemek için maven'i ayarlama, bu yüzden eklenti kullanmanın bazı nüanslarını anlatacağım. Ayrıca ne kadar kolay ve doğal bir şekilde kullanabileceğinizi de anlatacağım. nexus-staging-maven-pluginprojenizin üst öğesi olarak org.sonatype.oss:oss-parent öğesini kullanmak istemiyorsanız veya kullanamıyorsanız.

maven-kurulum-eklentisi

Modülleri yerel depoya yükler.
Sağlama toplamının yanı sıra diğer projelerdeki çözümlerin yerel olarak doğrulanması için de çok 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>

İçeriğe

maven-javadoc-eklentisi

Proje için javadoc oluşturuluyor.

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

Java içermeyen bir modülünüz varsa (örneğin yalnızca kaynaklar)
Veya prensipte javadoc oluşturmak istemiyorsanız, o zaman yardımcı olun 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>

İçeriğe

maven-gpg-eklentisi

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

İçeriğe

nexus-aşama-maven-eklentisi

yapılandırma:

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

Çok modüllü bir projeniz varsa ve depoya belirli bir modül yüklemeniz gerekmiyorsa bu modülün pom.xml dosyasına eklemeniz gerekir. nexus-staging-maven-plugin bayraklı skipNexusStagingDeployMojo

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

Anlık görüntü/yayın sürümleri yüklendikten sonra şurada mevcuttur: hazırlama depoları

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

Daha fazla artı

  • Nexus deposuyla çalışmak için çok zengin bir hedef listesi (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Maven Central'da indirilebilirlik için otomatik sürüm kontrolü

İçeriğe

sonuç

SNAPSHOT Sürümünü Yayınlama

Bir proje oluştururken, SNAPSHOT sürümünü nexus'a indirmek için bir görevi manuel olarak başlatmak mümkündür.

Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

Bu görev başlatıldığında dağıtım projesindeki ilgili görev tetiklenir (örnek).

kırpılmış günlük

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

Sonuç olarak sürüm nexus'a yüklenir 1.0.0-EN İYİ.

Tüm anlık görüntü sürümleri sitedeki depodan kaldırılabilir oss.sonatype.org hesabınızın altında.

Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

İçeriğe

Sürüm versiyonunun yayınlanması

Etiket ayarlandığında, dağıtım projesindeki ilgili görev, yayın sürümünü nexus'a yüklemek için otomatik olarak tetiklenir (örnek).

Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

En iyi yanı, yakın serbest bırakmanın nexus'ta otomatik olarak tetiklenmesidir.

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

Ve bir şeyler ters giderse görev başarısız olur

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

Sonuç olarak elimizde tek bir seçenek kalıyor. Veya bu sürümü silin veya yayınlayın.

Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

Serbest bırakıldıktan bir süre sonra eserler satışa sunulacak Maven Central'a bir java projesi yüklemek için GitLab CI kurulumu

oftop

Maven'in diğer halka açık depoları indekslemesi benim için bir keşifti.
Eski depomu indekslediği için robots.txt dosyasını eklemek zorunda kaldım.

İçeriğe

Sonuç

Neyimiz var

  • Yapıları çeşitli geliştirme dilleri için genel depolara yüklemek için çeşitli CI görevlerini uygulayabileceğiniz ayrı bir dağıtım projesi.
  • Dağıtım projesi dış müdahalelerden yalıtılmıştır ve yalnızca Sahip ve Bakımcı rollerine sahip kullanıcılar tarafından değiştirilebilir.
  • Yalnızca dağıtım görevlerini çalıştırmak için "etkin" önbelleğe sahip ayrı bir Özel Çalıştırıcı.
  • Anlık görüntü/yayın sürümlerinin halka açık bir depoda yayınlanması.
  • Maven Central'da yayına hazır olup olmadığının otomatik olarak kontrol edilmesi.
  • Maven Central'da "ham" sürümlerin otomatik olarak yayınlanmasına karşı koruma.
  • "Tıklamayla" anlık görüntü sürümlerini oluşturun ve yayınlayın.
  • Anlık görüntü/yayın sürümlerini almak için tek depo.
  • Bir Java projesi oluşturmak/test etmek/yayınlamak için genel işlem hattı.

GitLab CI kurulumu ilk bakışta göründüğü kadar karmaşık bir konu değildir. CI'yi birkaç kez anahtar teslimi olarak kurmak yeterlidir ve artık bu konuda amatör olmaktan çok uzaktasınız. Üstelik GitLab dokümantasyonu oldukça gereksizdir. İlk adımı atmaktan korkmayın. Yürüyen kişinin adımları altında yol beliriyor (Kimin söylediğini hatırlamıyorum :)

Geri bildirim almaktan memnuniyet duyacağım.

Bir sonraki makalede, yalnızca bir kabuk çalıştırıcınız varsa, entegrasyon testi görevlerini rekabetçi bir şekilde (test hizmetlerini docker-compose ile çalıştırmak) çalıştırmak için GitLab CI'yı nasıl ayarlayacağınızı göstereceğim.

İçeriğe

Kaynak: habr.com

Yorum ekle