
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
- Penjelasan terperinci tentang mekanisme untuk mempublikasikan artefak ke Maven Central melalui Layanan Hosting Repositori Sonatype OSS telah dijelaskan dalam artikel ini oleh Googolplex , jadi saya akan merujuk artikel ini di tempat yang tepat.
- Kami melakukan pra-registrasi dengan Sonatype JIRA dan memulai tiket untuk membuka repositori (untuk lebih jelasnya, baca bagian Membuat tiket untuk Sonatype JIRA ). Setelah membuka repositori, pasangan login / kata sandi JIRA (selanjutnya akun Sonatype) akan digunakan untuk mengunggah artefak ke Sonatype nexus.
- Selanjutnya, proses menghasilkan kunci GPG dijelaskan dengan sangat kering. Lihat Mengkonfigurasi GnuPG untuk menandatangani artefak untuk informasi lebih lanjut.
- Jika Anda menggunakan konsol Linux untuk menghasilkan kunci GPG (gnupg / gnupg2), maka Anda perlu menginstal rng-tools untuk menghasilkan entropi. Jika tidak, pembuatan kunci dapat memakan waktu yang sangat lama.
- Layanan untuk menyimpan kunci GPG publik
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 sayaUntuk 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
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
- 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.
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 detailSaya 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> <phase>prepare-package</phase> <configuration> <failOnError>true</failOnError> <failOnWarnings>true</failOnWarnings> <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> <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> <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> </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 <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. 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] ------------------------------------------------------------------------
. .

, 
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