ProHoster > Blog > Administrasi > Nganggo Gradle sareng Github Actions pikeun nyebarkeun Proyék Java ka Sonatype Maven Central Repository
Nganggo Gradle sareng Github Actions pikeun nyebarkeun Proyék Java ka Sonatype Maven Central Repository
Dina artikel ieu, abdi hoyong nyandak katingal ngadeukeutan dina prosés medarkeun hiji artefak Java ti scratch ngaliwatan Github Aksi ka Sonatype Maven Central Repository ngagunakeun pembina Gradle.
Kuring mutuskeun nulis artikel ieu alatan kurangna tutorial normal di hiji tempat. Sadaya inpormasi kedah dikumpulkeun sapotong-sapotong tina sababaraha sumber, komo deui, henteu sadayana seger. Anu paduli, wilujeng sumping handapeun ucing.
Nyiptakeun gudang di Sonatype
Hambalan munggaran nyaéta nyieun gudang di Sonatype Maven Tengah. Pikeun ieu urang balik di dieu, ngadaptar sarta nyieun tugas anyar, nanyakeun kami nyieun gudang. Urang ngajalankeun di urang GroupId proyék, URL proyék link proyék jeung URL SCM link ka sistem kontrol versi nu lokasina proyék. GroupId Ieu kedah janten bentuk com.example, com.example.domain, com.example.testsupport, sareng tiasa ogé dina bentuk tautan ka github anjeun: github.com/yurusername -> io.github.yourusername. Dina naon waé, anjeun kedah pariksa kapamilikan domain atanapi profil ieu. Upami anjeun netepkeun profil github, anjeun bakal dipenta pikeun nyiptakeun gudang umum kalayan nami anu dipikahoyong.
Sababaraha waktu sanggeus konfirmasi, GroupId anjeun bakal dijieun tur urang bisa ngaléngkah ka lengkah saterusna, konfigurasi Gradle.
Ngonpigurasikeun Gradle
Dina waktos nyerat, kuring henteu mendakan plugin Gradle anu tiasa ngabantosan nyebarkeun artefak. ieu hijina plugin nu kuring kapanggih, kumaha oge, pangarang nampik salajengna ngarojong eta. Ku alatan éta, kuring mutuskeun pikeun ngalakukeun sagalana sorangan, sabab teu teuing hésé ngalakukeun ieu.
Hal kahiji anu kedah terang nyaéta syarat Sonatype pikeun nyebarkeun. Aranjeunna di handap ieu:
Kasadiaan kode sumber sareng JavaDoc, nyaéta. kudu hadir -sources.jar и-javadoc.jar file. Sakumaha anu dinyatakeun dina dokuméntasi, upami teu mungkin nyayogikeun kode sumber atanapi dokuméntasi, anjeun tiasa ngadamel dummy. -sources.jar atawa -javadoc.jar kalawan README basajan jero pikeun lulus ujian.
Sadaya file kedah ditandatanganan GPG/PGPjeung .asc file nu ngandung signature kudu kaasup pikeun tiap file.
kasadiaan pom file
Niléy anu leres groupId, artifactId и version. Versina tiasa janten senar sawenang sareng teu tiasa ditungtungan -SNAPSHOT
Ayana diperlukeun name, description и url
Ayana inpormasi ngeunaan lisénsi, pamekar sareng sistem kontrol versi
Ieu mangrupikeun aturan dasar anu kedah dituturkeun nalika nyebarkeun. Inpormasi lengkep sayogi di dieu.
Urang ngalaksanakeun sarat ieu dina build.gradle berkas. Mimiti, hayu urang tambahkeun sadaya inpormasi anu dipikabutuh ngeunaan pamekar, lisénsi, sistem kontrol versi, sareng ogé nyetél url, nami sareng pedaran proyék. Hayu urang nulis metoda basajan pikeun ieu:
def customizePom(pom) {
pom.withXml {
def root = asNode()
root.dependencies.removeAll { dep ->
dep.scope == "test"
}
root.children().last() + {
resolveStrategy = DELEGATE_FIRST
description 'Some description of artifact'
name 'Artifct name'
url 'https://github.com/login/projectname'
organization {
name 'com.github.login'
url 'https://github.com/login'
}
issueManagement {
system 'GitHub'
url 'https://github.com/login/projectname/issues'
}
licenses {
license {
name 'The Apache License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
scm {
url 'https://github.com/login/projectname'
connection 'scm:https://github.com/login/projectname.git'
developerConnection 'scm:git://github.com/login/projectname.git'
}
developers {
developer {
id 'dev'
name 'DevName'
email '[email protected]'
}
}
}
}
}
Salajengna, Anjeun kudu nangtukeun yén salila assembly dihasilkeun -sources.jar и-javadoc.jar file. Pikeun bagian ieu java anjeun kedah nambihan ieu:
java {
withJavadocJar()
withSourcesJar()
}
Hayu urang ngaléngkah ka sarat anu terakhir, nyetél tanda tangan GPG/PGP. Jang ngalampahkeun ieu, sambungkeun plugin signing:
plugins {
id 'signing'
}
Sareng tambahkeun bagian:
signing {
sign publishing.publications
}
Tungtungna, hayu urang tambahkeun bagian publishing:
publishing {
publications {
mavenJava(MavenPublication) {
customizePom(pom)
groupId group
artifactId archivesBaseName
version version
from components.java
}
}
repositories {
maven {
url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
credentials {
username sonatypeUsername
password sonatypePassword
}
}
}
}
Ieu téh sonatypeUsername и sonatypePassword variabel ngandung login sarta sandi dijieun salila pendaptaran on sonatype.org.
Kituna final build.gradle bakal kasampak kawas kieu:
Kode build.gradle pinuh
plugins {
id 'java'
id 'maven-publish'
id 'signing'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
withJavadocJar()
withSourcesJar()
}
group 'io.github.githublogin'
archivesBaseName = 'projectname'
version = System.getenv('RELEASE_VERSION') ?: "0.0.1"
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.2'
}
test {
useJUnitPlatform()
}
jar {
from sourceSets.main.output
from sourceSets.main.allJava
}
signing {
sign publishing.publications
}
publishing {
publications {
mavenJava(MavenPublication) {
customizePom(pom)
groupId group
artifactId archivesBaseName
version version
from components.java
}
}
repositories {
maven {
url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
credentials {
username sonatypeUsername
password sonatypePassword
}
}
}
}
def customizePom(pom) {
pom.withXml {
def root = asNode()
root.dependencies.removeAll { dep ->
dep.scope == "test"
}
root.children().last() + {
resolveStrategy = DELEGATE_FIRST
description 'Some description of artifact'
name 'Artifct name'
url 'https://github.com/login/projectname'
organization {
name 'com.github.login'
url 'https://github.com/githublogin'
}
issueManagement {
system 'GitHub'
url 'https://github.com/githublogin/projectname/issues'
}
licenses {
license {
name 'The Apache License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
scm {
url 'https://github.com/githublogin/projectname'
connection 'scm:https://github.com/githublogin/projectname.git'
developerConnection 'scm:git://github.com/githublogin/projectname.git'
}
developers {
developer {
id 'dev'
name 'DevName'
email '[email protected]'
}
}
}
}
}
Abdi hoyong dicatet yén urang nampi versi tina variabel lingkungan: System.getenv('RELEASE_VERSION'). Urang bakal ngalaan eta salila assembly sarta nyokot tina ngaran tag.
Generasi konci PGP
Salah sahiji sarat Sonatype nyaéta yén sadaya file ditandatanganan ku konci GPG/PGP. Pikeun ieu urang balik di dieu tur ngundeur utilitas GnuPG pikeun sistem operasi Anjeun.
Urang ngahasilkeun pasangan konci: gpg --gen-key, asupkeun ngaran pamaké, e-mail, sarta ogé nyetel kecap akses.
Urang manggihan id konci kami kalayan paréntah: gpg --list-secret-keys --keyid-format short. Id bakal dieusian saatos garis miring, contona: rsa2048/9B695056
Nyebarkeun konci umum ka server https://keys.openpgp.org paréntah: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
Urang ngekspor konci rusiah ka tempat anu sawenang-wenang, urang bakal butuh ka hareup: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg
Nyetél Aksi Github
Hayu urang ngaléngkah ka tahap ahir, nyetél ngawangun sareng nyebarkeun otomatis nganggo Github Actions.
Github Actions mangrupikeun fitur anu ngamungkinkeun anjeun pikeun ngajadikeun otomatis alur kerja ku ngalaksanakeun siklus CI / CD lengkep. Ngawangun, nguji, sareng nyebarkeun tiasa dipicu ku sababaraha kajadian: push kode, nyiptakeun sékrési, atanapi masalah. Fungsionalitas ieu leres pisan gratis pikeun repositori umum.
Dina bagian ieu, kuring bakal nunjukkeun anjeun kumaha nyetél ngawangun sareng nyorong kode sareng nyebarkeun kana gudang Sonatype nalika dileupaskeun, ogé nyetél rusiah.
Urang nyetel rusiah
Pikeun assembly otomatis tur deployment, urang peryogi sababaraha nilai rusiah, kayaning id konci, kecap akses nu urang diasupkeun nalika generating konci, konci PGP sorangan, sarta Sonatype login / sandi. Anjeun tiasa nyetél éta dina bagian khusus dina setélan gudang:
Urang nangtukeun variabel handap:
SONATYPE_USERNAME / SONATYPE_PASSWORD - login / sandi anu kami lebetkeun nalika ngadaptar sareng Sonatype
SIGNING_KEYID/SIGNING_PASSWORD — id konci PGP sareng kecap akses disetel salami generasi.
Abdi hoyong cicing dina variabel GPG_KEY_CONTENTS langkung jéntré. Kanyataanna nyaéta pikeun publikasi urang peryogi konci PGP swasta. Dina raraga posting eta dina Rahasia, kuring dipaké pitunjuk sarta Sajaba dijieun sababaraha lampah.
Hayu urang énkripsi konci kami nganggo gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgku cara nuliskeun kecap akses. Eta kudu disimpen dina variabel: SECRET_PASSPHRASE
Hayu urang tarjamahkeun konci énkripsi anu ditampi kana bentuk téks nganggo base64: base64 9B695056.gpg.gpg > 9B695056.txt. Eusi bakal disimpen dina variabel: GPG_KEY_CONTENTS.
Ngawangun setelan nalika ngadorong kode sareng nyiptakeun PR
Mimiti anjeun kedah nyiptakeun polder dina akar proyék anjeun: .github/workflows.
Di jerona, cirian file, contona, gradle-ci-build.yml kalawan eusi handap:
name: build
on:
push:
branches:
- master
- dev
- testing
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 8
uses: actions/setup-java@v1
with:
java-version: 8
- name: Build with Gradle
uses: eskatos/gradle-command-action@v1
with:
gradle-version: current
arguments: build -PsonatypeUsername=${{secrets.SONATYPE_USERNAME}} -PsonatypePassword=${{secrets.SONATYPE_PASSWORD}}
Alur kerja ieu bakal dieksekusi nalika ngadorong ka dahan master, dev и testing, ogé nalika nyieun requests tarikan.
Bagian padamelan netepkeun léngkah-léngkah anu bakal dilaksanakeun dina acara anu ditangtukeun. Dina hal ieu, urang bakal ngawangun dina versi panganyarna tina ubuntu, ngagunakeun Java 8, sarta ogé ngagunakeun plugin pikeun Gradle. eskatos/gradle-command-action@v1nu, ngagunakeun versi panganyarna tina pembina, bakal ngajalankeun Paréntah dieusian dina arguments. Variabel secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD ieu Rahasia kami naroskeun tadi.
Hasil ngawangun bakal ditingali dina tab Aksi:
Nyebarkeun otomatis nalika pelepasan énggal dileupaskeun
Hayu urang nyieun file workflow misah pikeun autodeploy gradle-ci-publish.yml:
name: publish
on:
push:
tags:
- 'v*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 8
uses: actions/setup-java@v1
with:
java-version: 8
- name: Prepare to publish
run: |
echo '${{secrets.GPG_KEY_CONTENTS}}' | base64 -d > publish_key.gpg
gpg --quiet --batch --yes --decrypt --passphrase="${{secrets.SECRET_PASSPHRASE}}"
--output secret.gpg publish_key.gpg
echo "::set-env name=RELEASE_VERSION::${GITHUB_REF:11}"
- name: Publish with Gradle
uses: eskatos/gradle-command-action@v1
with:
gradle-version: current
arguments: test publish -Psigning.secretKeyRingFile=secret.gpg -Psigning.keyId=${{secrets.SIGNING_KEYID}} -Psigning.password=${{secrets.SIGNING_PASSWORD}} -PsonatypeUsername=${{secrets.SONATYPE_USERNAME}} -PsonatypePassword=${{secrets.SONATYPE_PASSWORD}}
Berkasna ampir sami sareng anu saacanna, iwal ti acara dimana éta bakal dipicu. Dina hal ieu, ieu acara nyieun tag kalawan ngaran dimimitian ku v.
Sateuacan nyebarkeun, urang kedah nimba konci PGP tina Rahasia sareng nempatkeun kana akar proyék, ogé ngadekrip éta. Salajengna, urang kedah nyetél variabel lingkungan khusus RELEASE_VERSION nu urang rujuk gradle.build berkas. Sadaya ieu dilakukeun dina bagian Prepare to publish. Kami kéngingkeun konci tina variabel GPG_KEY_CONTENTS, tarjamahkeun kana file gpg, teras ngadekrip ku cara nempatkeun kana file. secret.gpg.
Salajengna, urang balikkeun ka variabel husus GITHUB_REF, ti mana urang tiasa nampi versi anu urang setel nalika nyiptakeun tag. Variabel ieu relevan dina hal ieu. refs/tags/v0.0.2 ti mana urang neukteuk off kahiji 11 karakter pikeun meunangkeun versi husus. Salajengna, kami nganggo paréntah Gradle standar pikeun nyebarkeun: test publish
Mariksa hasil panyebaran dina gudang Sonatype
Saatos sékrési didamel, alur kerja anu dijelaskeun dina bagian sateuacana kedah ngamimitian. Jang ngalampahkeun ieu, jieun pelepasan:
ngaran tag kudu dimimitian ku v. Upami, saatos ngaklik Publikasikeun pelepasan, alur kerja parantos réngsé, urang tiasa angkat ka Sonatype Nexus pikeun mastikeun:
Artéfak éta muncul dina gudang Pementasan. Langsung nembongan dina status Buka, teras kedah ditransfer sacara manual ka status Tutup ku mencét tombol anu pas. Saatos mariksa yen sakabeh sarat anu patepung, artefak nu mana kana status Tutup tur euweuh sadia pikeun modifikasi. Dina formulir ieu, éta bakal mungkas nepi di MavenCentral. Upami sadayana leres, anjeun tiasa pencét tombol ngabebaskeun, sarta artefak bakal mungkas nepi di Repository Sonatype.
Pikeun artefak asup ka MavenCentral, anjeun kedah naroskeun éta dina tugas anu urang damel di awal. Anjeun ngan ukur kedah ngalakukeun ieu sakali, janten kami nyebarkeun heula. Dina waktos salajengna, ieu henteu diperyogikeun, sadayana bakal disingkronkeun sacara otomatis. Aranjeunna ngahurungkeun sinkronisasi pikeun kuring gancang, tapi nyandak ngeunaan 5 poé pikeun artefak sadia di MavenCentral.
Éta sadayana, kami parantos nyebarkeun artefak kami di MavenCentral.