ProHoster > Blog > Uprava > Uporaba dejanj Gradle in Github za objavo projekta Java v osrednjem skladišču Sonatype Maven
Uporaba dejanj Gradle in Github za objavo projekta Java v osrednjem skladišču Sonatype Maven
V tem članku si želim podrobno ogledati postopek objave artefakta Java od začetka prek Github Actions v Sonatype Maven Central Repository z graditeljem Gradle.
Za pisanje tega članka sem se odločil zaradi pomanjkanja običajnega tutoriala na enem mestu. Vse podatke je bilo treba zbirati po delih iz različnih virov, poleg tega ne povsem svežih. Kogar briga, dobrodošel pod kat.
Ustvarjanje repozitorija v Sonatype
Prvi korak je ustvariti repozitorij v Sonatype Maven Central. Za to gremo tukaj, se registrirajte in ustvarite novo nalogo ter nas prosite, da ustvarimo repozitorij. Vozimo se v našem GroupId projekt, URL projekta povezava projekta in URL SCM povezava do sistema za nadzor različic, v katerem se nahaja projekt. GroupId tukaj mora biti v obliki com.example, com.example.domain, com.example.testsupport, lahko pa tudi v obliki povezave do vašega githuba: github.com/vašeuporabniškoime -> io.github.vaše uporabniško ime. V vsakem primeru boste morali preveriti lastništvo te domene ali profila. Če ste določili profil github, boste pozvani, da ustvarite javno skladišče z želenim imenom.
Nekaj časa po potrditvi bo ustvarjen vaš GroupId in lahko nadaljujemo z naslednjim korakom, konfiguracijo Gradle.
Konfiguriranje Gradle
V času pisanja tega članka nisem našel vtičnikov Gradle, ki bi lahko pomagali pri objavi artefakta. To edini vtičnik, ki sem ga našel, pa je avtor zavrnil nadaljnjo podporo. Zato sem se odločil, da vse naredim sam, saj to ni preveč težko narediti.
Prva stvar, ki jo je treba ugotoviti, so zahteve Sonatype za objavo. To so naslednje:
Razpoložljivost izvornih kod in JavaDoc, tj. se mora udeležiti -sources.jar и-javadoc.jar datoteke. Kot je navedeno v dokumentaciji, če ni mogoče zagotoviti izvorne kode ali dokumentacije, lahko naredite lutko -sources.jar ali -javadoc.jar s preprostim README znotraj, da opravite preizkus.
Vse datoteke morajo biti podpisane z GPG/PGPIn .asc datoteka, ki vsebuje podpis, mora biti vključena v vsako datoteko.
razpoložljivost pom mapa
Pravilne vrednosti groupId, artifactId и version. Različica je lahko poljuben niz in se ne sme končati z -SNAPSHOT
Obvezna prisotnost name, description и url
Prisotnost informacij o licenci, razvijalcih in sistemu za nadzor različic
To so osnovna pravila, ki jih je treba upoštevati pri objavi. Na voljo so vse informacije tukaj.
Te zahteve izvajamo v build.gradle mapa. Najprej dodamo vse potrebne informacije o razvijalcih, licencah, sistemu za nadzor različic in nastavimo url, ime in opis projekta. Napišimo preprosto metodo za to:
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]'
}
}
}
}
}
Nato morate to določiti med ustvarjenim sklopom -sources.jar и-javadoc.jar datoteke. Za ta razdelek java morate dodati naslednje:
java {
withJavadocJar()
withSourcesJar()
}
Preidimo na zadnjo zahtevo, nastavitev podpisa GPG/PGP. Če želite to narediti, povežite vtičnik signing:
plugins {
id 'signing'
}
In dodajte razdelek:
signing {
sign publishing.publications
}
Nazadnje dodajmo razdelek 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
}
}
}
}
Tukaj sonatypeUsername и sonatypePassword spremenljivke, ki vsebujejo prijavo in geslo, ustvarjeno med registracijo na sonatype.org.
Torej finale build.gradle bo videti tako:
Celotna koda build.gradle
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]'
}
}
}
}
}
Želim opozoriti, da dobimo različico iz spremenljivke okolja: System.getenv('RELEASE_VERSION'). Izpostavili ga bomo med sestavljanjem in ga vzeli iz imena oznake.
Generiranje ključev PGP
Ena od zahtev družbe Sonatype je, da so vse datoteke podpisane s ključem GPG/PGP. Za to gremo tukaj in prenesite pripomoček GnuPG za vaš operacijski sistem.
Ustvarimo par ključev: gpg --gen-key, vnesite uporabniško ime, e-pošto in nastavite tudi geslo.
Ugotavljamo id naš ključ z ukazom: gpg --list-secret-keys --keyid-format short. ID bo naveden za poševnico, na primer: rsa2048/9B695056
Objava javnega ključa na strežniku https://keys.openpgp.org z ukazom: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
Skrivni ključ izvozimo na poljubno mesto, potrebovali ga bomo v prihodnosti: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg
Nastavitev Github Actions
Pojdimo na zadnjo stopnjo, nastavimo gradnjo in samodejno objavo z Github Actions.
Github Actions je funkcija, ki vam omogoča avtomatizacijo poteka dela z implementacijo celotnega cikla CI/CD. Gradnjo, testiranje in uvajanje lahko sprožijo različni dogodki: potiskanje kode, ustvarjanje izdaje ali težave. Ta funkcija je popolnoma brezplačna za javne repozitorije.
V tem razdelku vam bom pokazal, kako nastaviti kodo za gradnjo in potiskanje ter jo namestiti v repozitorij Sonatype ob izdaji, kot tudi nastaviti skrivnosti.
Postavljamo skrivnosti
Za samodejno sestavljanje in uvajanje potrebujemo številne tajne vrednosti, kot so ID ključa, geslo, ki smo ga vnesli pri generiranju ključa, sam ključ PGP in prijava/geslo Sonatype. Nastavite jih lahko v posebnem razdelku v nastavitvah repozitorija:
Nastavimo naslednje spremenljivke:
SONATYPE_USERNAME / SONATYPE_PASSWORD - prijava / geslo, ki smo ga vnesli ob registraciji pri Sonatype
SIGNING_KEYID/SIGNING_PASSWORD — ID ključa PGP in geslo, nastavljeno med ustvarjanjem.
Želim se podrobneje posvetiti spremenljivki GPG_KEY_CONTENTS. Dejstvo je, da za objavo potrebujemo zasebni ključ PGP. Da bi ga objavil v skrivnostih, sem uporabil navodilo in poleg tega izvedli številne ukrepe.
Šifrirajmo naš ključ z gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgz vnosom gesla. Postavite ga v spremenljivko: SECRET_PASSPHRASE
Prevedimo prejeti šifrirani ključ v besedilno obliko z uporabo base64: base64 9B695056.gpg.gpg > 9B695056.txt. Vsebina bo postavljena v spremenljivko: GPG_KEY_CONTENTS.
Nastavitev gradnje pri potiskanju kode in ustvarjanju PR
Najprej morate ustvariti mapo v korenu vašega projekta: .github/workflows.
V njej označite datoteko, npr. gradle-ci-build.yml z naslednjo vsebino:
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}}
Ta potek dela se bo izvajal pri potiskanju v veje master, dev и testing, tudi pri ustvarjanju zahtev za vlečenje.
Razdelek o opravilih določa korake, ki jih je treba izvesti ob podanih dogodkih. V tem primeru bomo gradili na najnovejši različici ubuntuja, uporabljali Javo 8 in uporabljali tudi vtičnik za Gradle eskatos/gradle-command-action@v1ki bo z uporabo najnovejše različice graditelja izvajal ukaze, določene v arguments. Spremenljivke secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD to so skrivnosti, ki smo jih vprašali prej.
Rezultati gradnje bodo prikazani na zavihku Dejanja:
Samodejno uvedi, ko je izdana nova izdaja
Ustvarimo ločeno datoteko poteka dela za samodejno uvajanje 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}}
Datoteka je skoraj enaka prejšnji, razen dogodka, v katerem se bo sprožila. V tem primeru je to dogodek ustvarjanja oznake z imenom, ki se začne z v.
Pred uvedbo moramo ključ PGP ekstrahirati iz skrivnosti in ga postaviti v koren projekta ter ga dešifrirati. Nato moramo nastaviti posebno spremenljivko okolja RELEASE_VERSION na katerega se sklicujemo gradle.build mapa. Vse to se naredi v razdelku Prepare to publish. Naš ključ dobimo iz spremenljivke GPG_KEY_CONTENTS, ga prevedemo v datoteko gpg, nato pa dešifriramo tako, da ga vstavimo v datoteko secret.gpg.
Nato se obrnemo na posebno spremenljivko GITHUB_REF, iz katerega lahko pridobimo različico, ki smo jo nastavili pri ustvarjanju oznake. Ta spremenljivka je v tem primeru pomembna. refs/tags/v0.0.2 iz katerega smo izrezali prvih 11 znakov, da dobimo točno določeno različico. Nato za objavo uporabimo standardne ukaze Gradle: test publish
Preverjanje rezultatov uvajanja v skladišču Sonatype
Ko je izdaja ustvarjena, se mora začeti potek dela, opisan v prejšnjem razdelku. Če želite to narediti, ustvarite izdajo:
ime oznake se mora začeti z v. Če se po kliku na Objavi izdajo potek dela uspešno zaključi, lahko gremo na Sonatip Nexus Prepričati se:
Artefakt se je pojavil v repozitoriju Staging. Takoj se prikaže v statusu Odprto, nato pa ga je treba ročno prenesti v stanje Zapri s pritiskom na ustrezno tipko. Po preverjanju, ali so izpolnjene vse zahteve, artefakt preide v stanje Zapri in ni več na voljo za spreminjanje. V tej obliki bo končal v MavenCentral. Če je vse v redu, lahko pritisnete gumb Sprostite, in artefakt bo končal v skladišču Sonatype.
Da artefakt pride v MavenCentral, ga morate zahtevati v nalogi, ki smo jo ustvarili na samem začetku. To morate storiti le enkrat, zato objavljamo prvič. V naslednjih časih to ni potrebno, vse se bo samodejno sinhroniziralo. Hitro so mi vklopili sinhronizacijo, vendar je trajalo približno 5 dni, da je artefakt postal na voljo v MavenCentral.
To je vse, naš artefakt smo objavili v MavenCentral.