Selles artiklis kĂ€sitlen ma ĂŒksikasjalikult Java artefakti avaldamise protsessi nullist lĂ€bi Github Actions Sonatype Maven Central Repository's, kasutades Gradle'i ehitajat.
Otsustasin selle artikli kirjutada seoses korraliku Ă”petuse puudumisega ĂŒhest kohast. KĂ”ik vajalik teave tuli kokku koguda erinevatest, mitte just uusimatest allikatest. Kes on huvitatud, on teretulnud edasi lugema.
Repo loomine Sonatype'is
Esimese etapina peame looma repot Sonatype Maven Centralis. Selleks liigume , registreerime end ja loome uue ĂŒlesande, paludes meil repo luua. Sisestame oma GroupId VK grupp projekti URL-i lingi projekti jaoks ja SCM url versioonihaldussĂŒsteemi lingi, kus projekt asub. GroupId see peaks olema vormis com.example, com.example.domain, com.example.testsupport, samuti vĂ”ib olla lingina teie githubi kontole: -> io.github.yourusername. Igatahes peate tĂ”endama selle domeeni vĂ”i profiili omaniku. Kui olete mĂ€rkinud githubi profiili, palutakse luua avalik repo soovitud nimega.
MÔne aja pÀrast pÀrast kinnitamist loodetakse teie GroupId'i ja saame edasi liikuda jÀrgmise sammu, Gradle'i konfigureerimise juurde.
Konfigureerime Gradle'i
Artikli kirjutamise hetkeks ei leidnud ma Gradle'i jaoks lisandeid, mis aitaksid artefakti avaldamisel. Ainus leitud plugin, kuid autor on sellest loobunud. SeetÔttu otsustasin kÔik ise teha, Ônneks pole see liiga keeruline.
Esimene samm on vÀlja selgitada Sonatype'i avaldamise nÔuded. Need on jÀrgmised:
- Allikakoode ja JavaDoc'i olemasolu, st peavad olema olemas
-sources.jarja-javadoc.jarfailid. Nagu dokumentatsioonis öeldud, kui allikakoode vĂ”i dokumentatsiooni ei ole vĂ”imalik esitada, vĂ”ib teha tĂŒhja faili-sources.jarvĂ”i-javadoc.jarlihtsa README'ga, et lĂ€bida kontroll. - KĂ”ik failid peavad olema allkirjastatud
GPG/PGP, ja.ascfail, mis sisaldab allkirja, peab olema kaasatud iga faili jaoks. - Olemasolu
pomfaile - Sobivad vÀÀrtused
groupId,artifactIdjaversion. Versioon vÔib olla suvaline string ja ei tohi lÔppeda-SNAPSHOT - Peab olema olemas
name,descriptionjaurl - Teave litsentsi, arendajate ja versioonihalduse kohta peab olema olemas.
Need on pÔhireeglid, mida tuleb avaldamisel jÀrgida. TÀielik teave on saadaval .
Rakendame need nĂ”uded build.gradle faili. Esmalt lisame kogu vajaliku teabe arendajate, litsentsi, versioonikontrolli sĂŒsteemi kohta, samuti mÀÀrame projekti URL-i, nime ja kirjelduse. Selleks kirjutame lihtsa meetodi:
def customizePom(pom) {
pom.withXml {
def root = asNode()
root.dependencies.removeAll { dep ->
dep.scope == "test"
}
root.children().last() + {
resolveStrategy = DELEGATE_FIRST
description 'MÔned artefakti kirjeldused'
name 'Artefakti nimi'
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@dev.ru'
}
}
}
}
}SeejÀrel tuleb mÀrkida, et ehituse kÀigus genereeritakse -sources.jar ja-javadoc.jar failid. Selleks tuleb sektsiooni java lisada jÀrgmine:
java {
withJavadocJar()
withSourcesJar()
}Liigume viimase nĂ”udmise juurde, GPG/PGP allkirja seadistamine. Selleks ĂŒhendame pistikprogrammi allkirjastamine:
plugins {
id 'signing'
}Ja lisame sektsiooni :
signing {
sign publishing.publications
}LÔpuks lisame sektsiooni 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
}
}
}
}Siit sonatypeUsername ja sonatypePassword muutujad, mis sisaldavad sisselogimis- ja parooliteavet, mis loodi registreerimisel .
Seega nÀeb lÔplik build.gradle vÀlja jÀrgmine:
TĂ€ielik kood 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 'MÔned artefakti kirjeldavad andmed'
name 'Artefakti nimi'
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 'Apache License, Versioon 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@dev.ru'
}
}
}
}
}Tahan mĂ€rkida, et versiooni saame keskkonnamuutujast: System.getenv('RELEASE_VERSION'). Seadistame selle ĂŒles ehituse kĂ€igus ja vĂ”tame sildi nimest.
PGP vÔtme genereerimine
Ăks Sonatype'i nĂ”udeid on iga faili allkirjastamine GPG/PGP vĂ”tmega. Selleks lĂ€heme ja laadime alla GnuPG utiliidi oma operatsioonisĂŒsteemi jaoks.
- Genereerime vÔtme paari:
gpg --gen-key, sisestame kasutajanime, e-posti aadressi ja mÀÀrame parooli. - Selgitame vÀlja
idoma vÔtme kÀsuga:gpg --list-secret-keys --keyid-format short. Id on mÀrgitud kaldkriipsu taha, nÀiteks: rsa2048/9B695056 - Avaldame avaliku vÔtme serverisse kÀsklusega:
gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056 - Eksportime salajase vÔtme suvalisse kohta, see on meil hiljem vajalik:
gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg
Seame ĂŒles Github Actions
Liigume lÔpetava sammu juurde, seadistame ehituse ja automaatse avaldamise, kasutades Github Actions.
Github Actions on funktsionaalsus, mis vĂ”imaldab automatiseerida töövoogu, rakendades tĂ€islahendust CI/CD. Ehitamine, testimine ja juurutamine vĂ”ivad kĂ€ivituda erinevate sĂŒndmuste korral: koodi pushimine, vĂ€ljaande loomine vĂ”i probleemide esitamine. See funktsionaalsus on tĂ€iesti tasuta avalike hoidlate jaoks.
Selles osas nÀitan, kuidas seadistada koodi kogumist ja edastamist ning juurutamist Sonatype'i hoidlasse vÀljaande vabastamisel, samuti kuidas seadistada salaandmeid.
Seadistame saladused
Automaatseks kogumiseks ja juurutamiseks vajame mitmeid salajasi vÀÀrtusi, nagu vÔtme ID, parool, mille sisestasime vÔtme genereerimise ajal, PGP vÔtme enda ning Sonatype'i sisselogimise/parooli. Neid saab seadistada hoidlakontrollide seadete spetsiaalses vaates:

Seadistame jÀrgmised muutujad:
- SONATYPE_USERNAME/SONATYPE_PASSWORD â sisselogimine/parool, mida kasutasime Sonatype'i registreerimisel
- SIGNING_KEYID/SIGNING_PASSWORD â PGP vĂ”tme ID ja parool, mille seadsime ĂŒles genereerimise ajal.
Muutuja GPG_KEY_CONTENTS kohta tahan peatuda lÀhemalt. Asi on selles, et vÀljaandmiseks on meil vajalik privaatne PGP vÔti. Selle salajastesse asetamiseks kasutasin ja tegin tÀiendavalt hulga toiminguid.
- Ć ifreerime meie vĂ”ti kasutades gpg:
gpg --symmetric --cipher-algo AES256 9B695056.gpg, sisestades parooli. See tuleks asetada muutujasse: SECRET_PASSPHRASE - TÔlkime saadud ƥifreeritud vÔtme tekstivormingusse kasutades base64:
base64 9B695056.gpg.gpg > 9B695056.txt. Sisu asetame muutujasse: GPG_KEY_CONTENTS.
Koodi jÔudmisel ja PR-i loomisel seadistamine
Esmalt tuleb luua kaust oma projekti juures: .github/workflows.
Sinna tuleb paigutada fail, nÀiteks gradle-ci-build.yml jÀrgnevate sisu kujul:
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}}See töövoog kÀivitub, kui pusitakse harudesse master, dev ja testing, samuti pull requestide loomisel.
Jaotises jobs on mĂ€rgitud sammud, mis tuleb jooksutada vastavalt nimetatud sĂŒndmustele. Antud juhul ehitame me viimasel versioonil ubuntu, kasutame Java 8-ndat ning samuti kasutame Gradleâi pistikut eskatos/gradle-command-action@v1, mis kasutab viimasel versioonil kokkuvĂ”tjate kĂ€ivitamiseks antud kĂ€ske argumentide. Muutujad secrets.SONATYPE_USERNAME ja secrets.SONATYPE_PASSWORD need on varad, mille me eelnevalt mÀÀrasime.
Kogumise tulemused kajastuvad vahekaardil Actions:

Autodeploy uue vÀljaande vÀljalaskmisel
Autodeploy jaoks loome töövoo jaoks eraldi faili gradle-ci-publish.yml:
nimi: publish
sisse:
push:
sildid:
- 'v*'
tööd:
publish:
töötab: ubuntu-latest
sammud:
- kasutab: actions/checkout@v1
- nimi: Seadista JDK 8
kasutab: actions/setup-java@v1
with:
java-versioon: 8
- nimi: Valmistuge avaldamiseks
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}"
- nimi: Avaldage Gradlega
kasutab: eskatos/gradle-command-action@v1
with:
gradle-versioon: current
argumentide: test publish -Psigning.secretKeyRingFile=secret.gpg -Psigning.keyId=${{secrets.SIGNING_KEYID}} -Psigning.password=${{secrets.SIGNING_PASSWORD}} -PsonatypeUsername=${{secrets.SONATYPE_USERNAME}} -PsonatypePassword=${{secrets.SONATYPE_PASSWORD}}Fail on peaaegu identne eelmisega, vĂ€lja arvatud sĂŒndmus, millega see aktiveeritakse. Antud juhul on see sildiga loomise sĂŒndmus, mis algab tĂ€hekombinatsiooniga v.
Enne juurutamist peame tĂ”mbama PGP vĂ”tme saladustest ning asetama selle projekti juurkausta ja dekrĂŒpteerima selle. Edasi peame seadistama spetsiaalse keskkonnamuutuja RELEASE_VERSION millele viitame gradle.build failis. KĂ”ik see toimub osas Valmistuge avaldamiseks. Saame meie vĂ”ti muutuja GPG_KEY_CONTENTS, muundame selle gpg-failiks ja dekrĂŒpteerime selle, asetades faili secret.gpg.
JĂ€rgmisena tutvume erimuutuja GITHUB_REF, millest saame vĂ€lja vĂ”tta versiooni, mille mÀÀrasime sildi loomisel. Sel juhul on selle muutuja vÀÀrtus refs/tags/v0.0.2 , millest lĂ”ikame maha esimesed 11 sĂŒmbolit, et saada tĂ€pselt versioon. Edasi kasutame standardseid Gradle kĂ€ske avaldamiseks: test publish
Kinnitus tulemuste deploimisel Sonatypeâi registrisse
PÀrast versiooni loomist peab kÀivituma eelnevas jaotises kirjeldatud töövoog. Selleks loome vÀljalaske:

samal ajal peab sildi nimi algama v-tÀhega. Kui pÀrast Publish release'i nupule vajutamist töövoog edukalt töötab, saame minna et seda kinnitada:

Artefakt ilmub Staging registrisse. Alguses on see olekus Open, seejĂ€rel tuleb see kĂ€sitsi sulgeda, vajutades vastavat nuppu. PĂ€rast kĂ”igi nĂ”uete tĂ€itmise kontrollimist lĂ€heb artefakt olekusse Close ja ei ole enam muudetav. Sellisel kujul jĂ”uab see MavenCentralisse. Kui kĂ”ik on hĂ€sti, saab vajutada nuppu Release, sel juhul jĂ”uab artefakt Sonatypeâi registrisse.
Kuna artefakt jĂ”uda MavenCentral-i, tuleb seda taotleda ĂŒlesandes, mille me alguses lĂ”ime. Seda on vaja teha ainult ĂŒks kord, kuna me avaldame seda esmakordselt. Edaspidi ei ole seda enam vajalik, kĂ”ik sĂŒnkroniseeritakse automaatselt. SĂŒnkroniseerimise lubamine toimus kiiresti, kuid et artefakt oleks MavenCentralis kergesti kĂ€tte saadav, lĂ€ks umbes 5 pĂ€eva.
Sellega on kÔik, oleme avaldanud oma artefakti MavenCentralis.
Kasulikud lingid
- Sarnane , ainult avaldamine lÀbi maven
- Staging Sonatype
- Sonatype, kus tuleb luua ĂŒlesanne
- reposiit, kus see kÔik on seadistatud
Allikas: habr.com
