Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

Artikel ini ditujukan untuk pembangun java yang perlu menerbitkan produk mereka dengan cepat ke sonataip dan/atau membuat repositori pusat menggunakan GitLab. Dalam artikel ini, saya akan bercakap tentang menyediakan gitlab-runner, gitlab-ci dan maven-plugin untuk menyelesaikan masalah ini.

Prasyarat:

  • Penyimpanan selamat bagi kunci mvn dan GPG.
  • Pelaksanaan tugas CI awam yang selamat.
  • Memuat naik artifak (keluaran/gambar) ke repositori awam.
  • Semakan automatik versi keluaran untuk penerbitan di pusat maven.
  • Penyelesaian umum untuk memuat naik artifak ke repositori untuk berbilang projek.
  • Kesederhanaan dan kemudahan penggunaan.

Содержание

Maklumat am

  • Penerangan terperinci tentang mekanisme untuk menerbitkan artifak kepada Maven Central melalui Perkhidmatan Pengehosan Repositori Sonatype OSS telah diterangkan dalam artikel ini pengguna Googolplex, jadi saya akan merujuk artikel ini di tempat yang betul.
  • Pradaftar di Sonatype JIRA dan mulakan tiket untuk membuka repositori (untuk butiran lanjut, baca bahagian Buat tiket Sonatype JIRA). Selepas membuka repositori, pasangan log masuk/kata laluan JIRA (selepas ini dirujuk sebagai akaun Sonatype) akan digunakan untuk memuat naik artifak ke perhubungan Sonatype.
  • Selanjutnya, proses penjanaan kunci GPG diterangkan dengan sangat kering. Lihat bahagian untuk butiran lanjut. Mengkonfigurasi GnuPG untuk Menandatangani Artifak
  • Jika anda menggunakan konsol Linux untuk menjana kunci GPG (gnupg/gnupg2), maka anda perlu memasang rng-tools untuk menghasilkan entropi. Jika tidak, penjanaan utama boleh mengambil masa yang sangat lama.
  • Perkhidmatan penyimpanan awam kunci GPG

Kepada kandungan

Menyediakan projek penggunaan dalam GitLab

  • Pertama sekali, anda perlu mencipta dan mengkonfigurasi projek di mana saluran paip akan disimpan untuk penggunaan artifak. Saya memanggil projek saya secara ringkas dan tidak rumit - menggunakan
  • Selepas mencipta repositori, anda perlu menyekat akses untuk menukar repositori.
    Pergi ke projek -> Tetapan -> Repositori -> Cawangan Dilindungi. Kami memadamkan semua peraturan dan menambah satu peraturan dengan Wildcard * dengan hak untuk menolak dan bergabung hanya untuk pengguna dengan peranan Maintainers. Peraturan ini akan berfungsi untuk semua pengguna projek ini dan kumpulan yang menjadi milik projek ini.
    Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven
  • Jika terdapat beberapa penyelenggara, maka penyelesaian terbaik adalah untuk menyekat akses kepada projek pada dasarnya.
    Pergi ke projek -> Tetapan -> Umum -> Keterlihatan, ciri projek, kebenaran dan tetapkan keterlihatan Projek kepada Swasta.
    Saya mempunyai projek dalam akses awam, kerana saya menggunakan GitLab Runner saya sendiri dan hanya saya mempunyai akses untuk mengubah suai repositori. Sebenarnya, saya tidak berminat untuk menunjukkan maklumat peribadi dalam log saluran paip awam.
  • Mengetatkan peraturan untuk menukar repositori
    Pergi ke projek -> Tetapan -> Repositori -> Peraturan Tolak dan tetapkan bendera Sekatan pemacu, Semak sama ada pengarang ialah pengguna GitLab. Saya juga mengesyorkan tetapan menandatangani komitmen, dan tetapkan bendera Tolak komit yang tidak ditandatangani.
  • Seterusnya, anda perlu mengkonfigurasi pencetus untuk menjalankan tugas
    Pergi ke projek -> Tetapan -> CI / CD -> Pencetus saluran paip dan buat token pencetus baharu
    Token ini boleh ditambah serta-merta pada konfigurasi umum pembolehubah untuk sekumpulan projek.
    Pergi ke kumpulan -> Tetapan -> CI / CD -> Pembolehubah dan tambah pembolehubah DEPLOY_TOKEN dengan token pencetus dalam nilai.

Kepada kandungan

Pelari GitLab

Bahagian ini menerangkan konfigurasi untuk menjalankan tugasan menggunakan pelari asli (Khusus) dan awam (Dikongsi).

Pelari Khusus

Saya menggunakan pelari saya sendiri, kerana pertama sekali ia mudah, cepat, murah.
Untuk pelari saya cadangkan Linux VDS dengan 1 CPU, 2 GB RAM, 20 GB HDD. Harga terbitan ~ 3000₽ setahun.

pelari saya

Untuk pelari saya mengambil VDS 4 CPU, 4 GB RAM, 50 GB SSD. Ia berharga ~11000₽ dan tidak pernah menyesalinya.
Saya mempunyai 7 mesin. 5 pada aruba dan 2 pada ihor.

Jadi, kita ada pelari. Sekarang kita akan menetapkannya.
Kami pergi ke mesin melalui SSH dan memasang java, git, maven, gnupg2.

Kepada kandungan

Memasang gitlab runner

  • Buat kumpulan baharu runner
    sudo groupadd runner
  • Buat direktori untuk cache maven dan tetapkan hak kumpulan runner
    Anda boleh melangkau langkah ini jika anda tidak bercadang untuk menjalankan berbilang pelari pada mesin yang sama.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Buat pengguna gitlab-deployer dan tambah pada kumpulan runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Tambahkan pada fail /etc/ssh/sshd_config baris seterusnya
    AllowUsers root@* [email protected]
  • But semula sshd
    systemctl restart sshd
  • Tetapkan kata laluan untuk pengguna gitlab-deployer (ia boleh menjadi mudah, kerana terdapat sekatan untuk localhost)
    passwd gitlab-deployer
  • Pasang 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
  • Pergi ke gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners dan salin token pendaftaran

Skrin

Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

  • Mendaftarkan pelari
    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!

  • Semak bahawa pelari telah didaftarkan. Pergi ke gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners diaktifkan untuk projek ini

Skrin

Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

  • Tambah terpisah perkhidmatan /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
  • Kami memulakan perkhidmatan.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Semak bahawa pelari sedang berlari.

Contoh

Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

Kepada kandungan

Penjanaan kunci GPG

  • Dari mesin yang sama kami pergi melalui ssh di bawah pengguna gitlab-deployer (ini penting untuk penjanaan kunci GPG)

    ssh [email protected]

  • Kami menjana kunci dengan menjawab soalan. Saya menggunakan nama dan e-mel saya sendiri.
    Pastikan anda menentukan kata laluan untuk kunci. Artifak akan ditandatangani dengan kunci ini.

    gpg --gen-key 

  • Memeriksa

    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

  • Memuat naik kunci awam kami ke pelayan kunci

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

Kepada kandungan

Persediaan Maven

  • Kami pergi di bawah pengguna gitlab-deployer
    su gitlab-deployer 
  • Buat direktori maven repositori dan pautkan dengan cache (jangan silap)
    Langkah ini boleh dilangkau jika anda tidak merancang untuk menjalankan beberapa pelari pada mesin yang sama.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Buat kunci induk
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Cipta fail ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Menyulitkan kata laluan daripada akaun Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Cipta fail ~/.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>

di mana,
GPG_SECRET_KEY_PASSPHRASE - kata laluan kunci GPG
SONATYPE_USERNAME - log masuk akaun sonatype

Ini melengkapkan persediaan pelari, anda boleh meneruskan ke bahagian GitLab CI

Kepada kandungan

Pelari Dikongsi

Penjanaan kunci GPG

  • Pertama sekali, anda perlu membuat kunci GPG. Untuk melakukan ini, pasang gnupg.

    yum install -y gnupg

  • Kami menjana kunci dengan menjawab soalan. Saya menggunakan nama dan e-mel saya sendiri. Pastikan anda menentukan kata laluan untuk kunci.

    gpg --gen-key 

  • Dapatkan maklumat penting

    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]

  • Memuat naik kunci awam kami ke pelayan kunci

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

  • Mendapatkan kunci peribadi

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

  • Pergi ke tetapan projek -> Tetapan -> CI / CD -> Pembolehubah dan simpan kunci peribadi dalam pembolehubah GPG_SECRET_KEY
    Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

Kepada kandungan

Persediaan Maven

  • Buat kunci induk
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Pergi ke tetapan projek -> Tetapan -> CI / CD -> Pembolehubah dan simpan dalam pembolehubah SETTINGS_SECURITY_XML baris berikut:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Menyulitkan kata laluan daripada akaun Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Pergi ke tetapan projek -> Tetapan -> CI / CD -> Pembolehubah dan simpan dalam pembolehubah SETTINGS_XML baris berikut:
    <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>

di mana,
GPG_SECRET_KEY_PASSPHRASE - kata laluan kunci GPG
SONATYPE_USERNAME - log masuk akaun sonatype

Kepada kandungan

Gunakan imej buruh pelabuhan

  • Kami mencipta fail Docker yang agak mudah untuk menjalankan tugas pada penggunaan dengan versi Java yang dikehendaki. Di bawah adalah contoh untuk alpine.

    FROM java:8u111-jdk-alpine
    RUN apk add gnupg maven git --update-cache 
    --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && 
    mkdir ~/.m2/

  • Membina bekas untuk projek anda

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

  • Kami mengesahkan dan memuatkan bekas ke dalam pendaftaran.

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

Kepada kandungan

GitLab CI

Sebarkan projek

Tambahkan fail .gitlab-ci.yml pada akar projek letak
Skrip membentangkan dua tugas penggunaan yang saling eksklusif. Pelari Khusus atau Pelari Dikongsi masing-masing.

.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

Kepada kandungan

projek Java

Dalam projek java yang sepatutnya dimuat naik ke repositori awam, anda perlu menambah 2 langkah untuk memuat turun versi Keluaran dan Syot Kilat.

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

Dalam penyelesaian ini, saya pergi sedikit lebih jauh dan memutuskan untuk menggunakan satu templat CI untuk projek java.

Maklumat lanjut

Saya membuat projek berasingan gitlab-ci di mana dia meletakkan templat CI untuk projek java biasa.yml.

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

Akibatnya, dalam projek java itu sendiri, .gitlab-ci.yml kelihatan sangat padat dan tidak bertele-tele

.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

Kepada kandungan

konfigurasi pom.xml

Topik ini diterangkan dengan terperinci. Googolplex в Menyediakan maven untuk menandatangani dan memuat naik artifak secara automatik ke repositori syot kilat dan pementasan, jadi saya akan menerangkan beberapa nuansa menggunakan pemalam. Saya juga akan menerangkan betapa mudah dan semulajadi anda boleh gunakan nexus-staging-maven-pluginjika anda tidak mahu atau tidak boleh menggunakan org.sonatype.oss:oss-parent sebagai induk untuk projek anda.

maven-install-plugin

Memasang modul dalam repositori tempatan.
Sangat berguna untuk pengesahan tempatan penyelesaian dalam projek lain, serta checksum.

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

Kepada kandungan

maven-javadoc-plugin

Menjana javadoc untuk projek.

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

Jika anda mempunyai modul yang tidak mengandungi java (contohnya hanya sumber)
Atau anda tidak mahu menjana javadoc pada dasarnya, kemudian untuk membantu 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>

Kepada kandungan

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>

Kepada kandungan

nexus-staging-maven-plugin

Konfigurasi:

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

Jika anda mempunyai projek berbilang modul dan anda tidak perlu memuat naik modul tertentu ke repositori, maka anda perlu menambah pada pom.xml modul ini nexus-staging-maven-plugin dengan bendera skipNexusStagingDeployMojo

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

Selepas memuat naik gambar/versi keluaran tersedia dalam repositori pementasan

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

Lebih banyak kelebihan

  • Senarai sasaran yang sangat kaya untuk bekerja dengan repositori nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Semakan keluaran automatik untuk keboleh muat turun di pusat maven

Kepada kandungan

Keputusan

Menerbitkan Versi SNAPSHOT

Apabila membina projek, adalah mungkin untuk memulakan tugas secara manual untuk memuat turun versi SNAPSHOT ke nexus

Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

Apabila tugasan ini dilancarkan, tugasan yang sepadan dalam projek penyebaran akan dicetuskan (contoh).

log dipangkas

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

Akibatnya, versi nexus dimuatkan 1.0.0-GAMBAR GAMBAR.

Semua versi syot kilat boleh dialih keluar daripada repositori di tapak oss.sonatype.org di bawah akaun anda.

Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

Kepada kandungan

Penerbitan versi keluaran

Apabila teg ditetapkan, tugasan yang sepadan dalam projek penggunaan dicetuskan secara automatik untuk memuat naik versi keluaran ke nexus (contoh).

Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

Bahagian yang terbaik ialah pelepasan rapat secara automatik mencetuskan dalam perhubungan.

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

Dan jika ada masalah, maka tugas itu akan gagal

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

Akibatnya, kita hanya tinggal satu pilihan. Atau padam versi ini atau terbitkan.

Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

Selepas dikeluarkan, selepas beberapa lama, artifak akan masuk Menyediakan GitLab CI untuk memuat naik projek java ke pusat maven

luar topik

Ia adalah satu pendedahan kepada saya bahawa maven mengindeks repositori awam yang lain.
Saya terpaksa memuat naik robots.txt kerana ia mengindeks repositori lama saya.

Kepada kandungan

Kesimpulan

Apa yang kita ada

  • Projek penggunaan berasingan di mana anda boleh melaksanakan beberapa tugas CI untuk memuat naik artifak ke repositori awam untuk pelbagai bahasa pembangunan.
  • Projek pelaksanaan diasingkan daripada gangguan luar dan hanya boleh diubah suai oleh pengguna dengan peranan Pemilik dan Penyelenggara.
  • Pelari Spesifik yang berasingan dengan cache "panas" untuk menjalankan hanya mengatur tugas.
  • Penerbitan versi syot kilat/keluaran dalam repositori awam.
  • Semakan automatik versi keluaran untuk kesediaan untuk penerbitan di pusat maven.
  • Perlindungan terhadap penerbitan automatik versi "mentah" di pusat maven.
  • Bina dan terbitkan versi syot kilat "pada klik".
  • Repositori tunggal untuk mendapatkan versi syot kilat/keluaran.
  • Saluran paip umum untuk membina / menguji / menerbitkan projek java.

Menyediakan GitLab CI bukanlah topik yang rumit seperti yang kelihatan pada pandangan pertama. Ia cukup untuk menyediakan CI secara turnkey beberapa kali, dan kini anda jauh daripada seorang amatur dalam perkara ini. Selain itu, dokumentasi GitLab sangat berlebihan. Jangan takut untuk mengambil langkah pertama. Jalan kelihatan di bawah tangga orang yang berjalan (saya tidak ingat siapa yang mengatakannya :)

Saya akan gembira untuk maklum balas.

Dalam artikel seterusnya, saya akan menunjukkan kepada anda cara menyediakan GitLab CI untuk menjalankan tugas ujian integrasi secara kompetitif (menjalankan perkhidmatan ujian dengan docker-compose) jika anda hanya mempunyai satu shell runner.

Kepada kandungan

Sumber: www.habr.com

Tambah komen