Mengkonfigurasi GitLab CI untuk memuat proyek java di maven central


Artikel ini ditujukan untuk pengembang java yang perlu dengan cepat mempublikasikan produk mereka di sonatype dan / atau repositori sentral pakar menggunakan GitLab. Pada artikel ini saya akan berbicara tentang pengaturan gitlab-runner, gitlab-ci dan maven-plugin untuk menyelesaikan masalah ini.


Prasyarat:


  • Penyimpanan yang aman dari kunci mvn dan GPG.
  • Eksekusi aman dari tugas CI publik.
  • Unggah artefak (rilis / snapshot) ke repositori publik.
  • Secara otomatis memeriksa versi rilis untuk publikasi di pakar pusat.
  • Solusi umum untuk mengunggah artefak ke repositori untuk beberapa proyek.
  • Kesederhanaan dan kegunaan.


Isi




Informasi umum



Untuk konten



Mengkonfigurasi proyek penyebaran di GitLab


  • Pertama-tama, perlu membuat dan mengkonfigurasi proyek di mana pipa akan disimpan untuk menyebarkan artefak. Saya menyebut proyek saya sederhana dan mudah - penyebaran
  • Setelah membuat repositori, Anda harus membatasi akses untuk mengubah repositori.
    Pergi ke proyek -> Pengaturan -> Repositori -> Cabang yang Dilindungi. Kami menghapus semua aturan dan menambahkan satu-satunya aturan dengan Wildcard * dengan hak untuk mendorong dan menggabungkan hanya untuk pengguna dengan peran Maintainers. Aturan ini akan berfungsi untuk semua pengguna proyek ini, serta grup di mana proyek ini menjadi anggota.
  • Jika ada beberapa pengelola, maka solusi terbaik adalah membatasi akses ke proyek pada prinsipnya.
    Pergi ke proyek -> Pengaturan -> Umum -> Visibilitas, fitur proyek, izin dan atur visibilitas Proyek ke Privat .
    Saya memiliki proyek di domain publik, karena saya menggunakan GitLab Runner saya sendiri dan hanya saya yang memiliki akses untuk mengubah repositori. Sebenarnya, bukan kepentingan saya untuk menyinari informasi pribadi dalam log pipa publik.
  • Aturan yang lebih ketat untuk mengubah repositori
    Pergi ke proyek -> Pengaturan -> Repositori -> Aturan Push dan atur bendera pembatasan Committer, Periksa apakah pembuatnya adalah pengguna GitLab. Saya juga menyarankan Anda mengkonfigurasi tanda tangan dari komit , dan mengatur tanda Tolak komit yang ditandatangani.
  • Selanjutnya, Anda perlu mengkonfigurasi pemicu untuk menjalankan tugas
    Buka proyek -> Pengaturan -> CI / CD -> Pemicu perpipaan dan buat token pemicu baru
    Token ini dapat segera ditambahkan ke konfigurasi umum variabel untuk sekelompok proyek.
    Buka grup -> Pengaturan -> CI / CD -> Variabel dan tambahkan variabel DEPLOY_TOKEN dengan nilai trigger-token.

Untuk konten



Pelari Gitlab


Bagian ini menjelaskan konfigurasi untuk meluncurkan tugas pada penggunaan menggunakan pelari (khusus) dan publik (bersama) sendiri.



Pelari spesifik


Saya menggunakan pelari saya sendiri, karena pertama-tama nyaman, cepat, murah.
Untuk pelari, saya merekomendasikan Linux VDS dengan 1 CPU, 2 GB RAM, 20 GB HDD. Harga masalah ~ 3000₽ per tahun.


Pelari saya

Untuk pelari, saya mengambil VDS 4 CPU, 4 GB RAM, 50 GB SSD. Harganya ~ 11.000 rubel dan tidak pernah menyesalinya.
Saya memiliki total 7 mobil. 5 di aruba dan 2 di ihor.


Jadi, kita punya pelari. Sekarang kita akan mengkonfigurasinya.
Kami pergi ke mesin pada SSH dan menginstal java, git, maven, gnupg2.


Untuk konten



Instal gitlab runner


  • Buat grup runner baru

     sudo groupadd runner 
  • Buat direktori untuk cache maven dan lampirkan hak grup runner
    Anda dapat melewati item ini jika Anda tidak berencana untuk menjalankan beberapa pelari di mesin yang sama.

     mkdir -p /usr/cache/.m2/repository chown -R :runner /usr/cache chmod -R 770 /usr/cache 
  • Buat pengguna gitlab-deployer dan tambahkan runner ke grup

     useradd -m -d /home/gitlab-deployer gitlab-deployer usermod -a -G runner gitlab-deployer 
  • Tambahkan baris berikut ke file /etc/ssh/sshd_config

     AllowUsers root@* gitlab-deployer@127.0.0.1 
  • Mulai ulang sshd

     systemctl restart sshd 
  • Kami menetapkan kata sandi untuk pengguna gitlab-deployer (bisa sederhana, karena pembatasan untuk localhost berlaku)

     passwd gitlab-deployer 
  • Instal 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 
  • Buka gitlab.com -> deploy-project -> Pengaturan -> CI / CD -> Pelari -> Pelari Tertentu dan salin token pendaftaran

Layar


  • Daftar pelari

     gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml 

Prosesnya
 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 (eg 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! 

  • Pastikan pelari terdaftar. Pergi ke gitlab.com -> deploy-project -> Settings -> CI / CD -> Runners -> Runner Tertentu -> Runners diaktifkan untuk proyek ini

Layar


  • Tambahkan layanan /etc/systemd/system/gitlab-deployer.service terpisah

     [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 memulai layanan.

     systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service 
  • Periksa apakah pelari berjalan.

Contoh


Untuk konten



Generasi kunci GPG


  • Dari mesin yang sama, kita membahas ssh di bawah pengguna gitlab-deployer (ini penting untuk menghasilkan kunci GPG)


     ssh gitlab-deployer@127.0.0.1 

  • Kami menghasilkan kunci dengan menjawab pertanyaan. Saya menggunakan nama dan surat saya sendiri.
    Pastikan untuk menentukan kata sandi untuk kunci tersebut. Kunci ini akan menandatangani artefak.


     gpg --gen-key 

  • Periksa


     gpg --list-keys -a /home/gitlab-deployer/.gnupg/pubring.gpg ---------------------------------------- pub 4096R/00000000 2019-04-19 uid Petruha Petrov <pp@example.com> sub 4096R/11111111 2019-04-19 

  • Mengunggah kunci publik kami ke server kunci


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


Untuk konten



Pengaturan Maven


  • Kami pergi di bawah pengguna gitlab-deployer

     su gitlab-deployer 
  • Buat repositori pakar dan tautan ke cache (jangan salah)
    Anda dapat melewati item ini jika Anda tidak berencana meluncurkan beberapa pelari di mesin yang sama.

     mkdir -p ~/.m2/repository ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository 
  • Buat kunci utama

     mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} 
  • Buat file ~ / .m2 / settings-security.xml

     <settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity> 
  • Kami mengenkripsi kata sandi untuk akun Sonatype

     mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} 
  • Buat file ~ / .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> 

dimana
GPG_SECRET_KEY_PASSPHRASE - kata sandi dari kunci GPG
SONATYPE_USERNAME - login akun sonatype


Ini menyelesaikan pengaturan pelari, Anda dapat pergi ke bagian GitLab CI


Untuk konten



Pelari bersama



Generasi kunci GPG


  • Pertama-tama, Anda perlu membuat kunci GPG. Untuk melakukan ini, instal gnupg.


     yum install -y gnupg 

  • Kami menghasilkan kunci dengan menjawab pertanyaan. Saya menggunakan nama dan surat saya sendiri. Pastikan untuk menentukan kata sandi untuk kunci tersebut.


     gpg --gen-key 

  • Kami menampilkan informasi pada tombol


     gpg --list-keys -a pub rsa3072 2019-04-24 [SC] [expires: 2021-04-23] 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 uid [ultimate] tttemp <temp@temp.temp> sub rsa3072 2019-04-24 [E] [expires: none] 

  • Mengunggah kunci publik kami ke server kunci


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

  • Dapatkan kunci pribadi


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

  • Buka pengaturan proyek -> Pengaturan -> CI / CD -> Variabel dan simpan kunci pribadi dalam variabel GPG_SECRET_KEY



Untuk konten



Pengaturan Maven


  • Buat kunci utama

     mvn --encrypt-master-password password {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=} 
  • Buka pengaturan proyek -> Pengaturan -> CI / CD -> Variabel dan simpan baris berikut dalam variabel SETTINGS_SECURITY_XML :
     <settingsSecurity> <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master> </settingsSecurity> 
  • Kami mengenkripsi kata sandi untuk akun Sonatype
     mvn --encrypt-password SONATYPE_PASSWORD {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J} 
  • Buka pengaturan proyek -> Pengaturan -> CI / CD -> Variabel dan simpan baris berikut dalam variabel 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> 

dimana
GPG_SECRET_KEY_PASSPHRASE - kata sandi dari kunci GPG
SONATYPE_USERNAME - login akun sonatype


Untuk konten



Sebarkan gambar buruh pelabuhan


  • Buat Dockerfile cukup sederhana untuk menjalankan tugas pada penyebaran dengan versi Java yang benar. Di bawah ini 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/ 

  • Kami mengumpulkan wadah untuk proyek Anda


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

  • Otentikasi dan muat wadah dalam registri.


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


Untuk konten



Gitlab ci



Menyebarkan proyek


Tambahkan file .gitlab-ci.yml ke root dari proyek deploy
Script menyajikan dua tugas yang saling eksklusif pada penyebaran. Pelari Khusus atau Pelari Bersama 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 

Untuk konten



Proyek Java


Dalam proyek java yang seharusnya diunggah ke repositori publik, Anda perlu menambahkan 2 langkah untuk mengunduh versi Release dan Snapshot.


.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 solusi ini, saya melangkah lebih jauh dan memutuskan untuk menggunakan satu templat CI untuk proyek-proyek java.


Lebih detail

Saya membuat proyek gitlab-ci terpisah di mana saya menempatkan template CI untuk proyek java common.yml .


common.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 proyek java sendiri .gitlab-ci.yml terlihat sangat kompak 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 

Untuk konten



Konfigurasi Pom.xml


Topik ini dijelaskan dengan sangat rinci oleh Googolplex dalam Mengkonfigurasi pakar untuk penandatanganan otomatis dan mengunggah artefak ke snapshot dan pementasan repositori , jadi saya akan menjelaskan beberapa nuansa menggunakan plugin. Saya juga akan menjelaskan betapa mudah dan alami Anda dapat menggunakan nexus-staging-maven-plugin jika Anda tidak ingin atau tidak dapat menggunakan org.sonatype.oss: oss-parent sebagai induk untuk proyek Anda.



maven-install-plugin


Menginstal modul di repositori lokal.
Sangat berguna untuk verifikasi solusi lokal di proyek 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> 

Untuk konten



maven-javadoc-plugin


Menghasilkan javadoc untuk proyek tersebut.


 <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 memiliki modul yang tidak mengandung java (mis. Hanya sumber daya)
Atau Anda tidak ingin membuat javadoc pada prinsipnya, maka maven-jar-plugin membantu


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

Untuk konten



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> 

Untuk konten



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 memiliki proyek multi-modul dan Anda tidak perlu memuat modul tertentu ke dalam repositori, kemudian tambahkan nexus-staging-maven-plugin dengan flag skipNexusStagingDeployMojo ke pom.xml modul ini


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

Setelah diunduh, versi snapshot / rilis tersedia di repositori pementasan.


 <repositories> <repository> <id>SonatypeNexus</id> <url>https://oss.sonatype.org/content/groups/staging/</url> <!--     snapshot/release   --> </repository> </repositories> 

Lebih banyak keuntungan


  • Daftar tujuan yang sangat kaya untuk bekerja dengan repositori nexus ( mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin ).
  • Secara otomatis memeriksa rilis untuk kemampuan mengunduh di maven central

Untuk konten



Hasil



Publikasikan versi SNAPSHOT


Ketika membangun sebuah proyek, ada kemungkinan memulai tugas secara manual untuk mengunduh versi SNAPSHOT di nexus



Ketika tugas ini dimulai, tugas yang sesuai dalam proyek penyebaran dipicu ( contoh ).


Log yang 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 1.0.0-SNAPSHOT dimuat ke nexus.


Semua versi snapshot dapat dihapus dari repositori di oss.sonatype.org di bawah akun Anda.



Untuk konten



Publikasikan versi rilis


Ketika tag dipasang, tugas yang sesuai dalam proyek penyebaran dipicu secara otomatis untuk mengunduh versi rilis di nexus ( contoh ).



Bagian terbaiknya adalah rilis dekat pada nexus secara otomatis dipicu.


 [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 yang salah, maka tugas itu pasti 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] ------------------------------------------------------------------------ 

. .



, Maven pusat


, maven .
robots.txt, .


Untuk konten



Kesimpulan



  • deploy- CI .
  • Deploy- Owner Maintainer.
  • Specific Runner "" deploy .
  • snapshot/release .
  • release maven central.
  • "" maven central.
  • snapshot " ".
  • snapshot/release .
  • // java .

GitLab CI . CI " " , . GitLab . . ( :) ).


.


, GitLab CI ( docker-compose), shell .


Untuk konten

Source: https://habr.com/ru/post/id449664/


All Articles