Selles artiklis tahan ma ĂŒksikasjalikult sĂ”nastada Java artefakti nullist avaldamise protsessi GitHub Actions kaudu Sonatype Maven Central Repository's, kasutades Gradle'i kogujat.
Selle artikli kirjutamine oli vajalik, kuna puudusid korralikud Ă”petused ĂŒhes kohas. KĂ”ik teave pidi olema kogutud erinevatest allikatest, mis ei olnud ka kuigi vĂ€rsked. Kui see teema sind huvitab, oled teretulnud lugema edasi.
Sonatype'i repositooriumi loomine
Esimese sammuna peame looma repositooriumi Sonatype Maven Centralis. Selleks suundume , registreerime end ja loome uue ĂŒlesande, paludes luua meile repositoorium. Sisestame oma GroupId for the project, Projekti URL projekti lingi ja SCM url versioonihaldussĂŒsteemi lingi, kus projekt asub. GroupId see peaks olema kujul com.example, com.example.domain, com.example.testsupport, kuid vĂ”ib olla ka lingina sinu GitHubi kontole: -> io.github.yourusername. Igal juhul pead sa kinnitama selle domeeni vĂ”i profiili omamist. Kui sa mĂ€rkisid GitHubi profiili, palutakse sul luua avalik repositoorium soovitud nimega.
MÔne aja pÀrast, kui kinnitamine on tehtud, luuakse sinu GroupId ja saame liikuda jÀrgmise sammu juurde, Gradle'i konfigureerimise juurde.
Konfigureerime Gradle'i
Artikli kirjutamise hetkel ei leidnud ma Gradle'i pluginaid, mis vĂ”iksid aita artefakti avaldamisel. ainult ĂŒhe plugina, mille leidsin, kuid autor loobus selle edasise toe andmisest. SeetĂ”ttu otsustasin teha kĂ”ik ise, Ă”nneks pole see liiga keeruline.
Esimene asi, mis tuleb vÀlja selgitada, on Sonatype'i nÔuded avaldamiseks. Need on jÀrgmised:
- Allika- ja JavaDoc-failide olemasolu, st need peavad olema olemas
-sources.jarja-javadoc.jarfailid. Nagu dokumentatsioonis öeldakse, kui allikaid vĂ”i dokumentatsiooni pole vĂ”imalik esitada, vĂ”ib teha tĂŒhja failiga, milles on lihtne README, et lĂ€bida kontroll.-sources.jarvĂ”i-javadoc.jarKĂ”ik failid peavad olema allkirjastatud kasutades - GPG/PGP
.asc, jafail, mis sisaldab allkirja, peab olema kaasatud iga faili jaoks.pom - Standardsete moodulite komplekti olemasolu
Korrektsed vÀÀrtusedfailist - groupId
artifactId,. Versioon vĂ”ib olla suvaline string ja ei tohi lĂ”ppedajaversion-SNAPSHOTPeab olema olemas - Teave litsentsi, arendajate ja versioonihaldussĂŒsteemi kohta
nimi,kirjeldusjaurl - Need on peamised reeglid, mida tuleb jÀrgida avaldamisel. TÀielik teave on saadaval
Rakendame need nÔuded .
jĂ€rgmiseks build.gradle failis. Esiteks lisame kogu vajaliku teabe arendajate, litsentsi, versioonihalduse 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 kirjeldused artefaktist'
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 '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 'ArendajaNimi'
email 'email@dev.ru'
}
}
}
}
}SeejÀrel tuleb mÀÀrata, et ehitamisel genereeritaks -sources.jar ja-javadoc.jar failid. Selleks sektsiooni java tuleb lisada jÀrgmine:
java {
withJavadocJar()
withSourcesJar()
}Liigume viimase nĂ”ude juurde, GPG/PGP allkirja seadistamine. Selleks ĂŒhendame plugina signing:
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
}
}
}
}Siin sonatypeUsername ja sonatypePassword muutujad, mis sisaldavad sisselogimis- ja parooliteavet, loodud registreerumisel .
Seega, lÔplik build.gradle nÀeb vÀlja jÀrgmiselt:
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 '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@dev.ru'
}
}
}
}
}Tahan mÀrkida, et versiooni saame keskkonna muutujast: System.getenv('RELEASE_VERSION'). Seadistame selle koostamise ajal ja vÔtame sildist.
PGP vÔtme genereerimine
Ăks Sonatype'i nĂ”udeid on, et kĂ”ik failid tuleb allkirjastada GPG/PGP vĂ”tmega. Selleks lĂ€heme ja laadime alla GnuPG utiliidi oma operatsioonisĂŒsteemi jaoks.
- Genereerime vÔtmepaari:
gpg --gen-key, sisestame kasutajanime, e-posti aadressi ning mÀÀrame parooli. - Selgitame vÀlja
idoma vÔtme, kasutades kÀsku:gpg --list-secret-keys --keyid-format short. Id on mÀrgitud pÀrast kaldkriipsu, nÀiteks: rsa2048/9B695056 - Avaldame avaliku vÔti serverisse with the command:
gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056 - Eksportime salajase vÔtme suvalisse kohta, seda vajame hiljem:
gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg
Seadistame Github Actions
Liigume lÔpetamise etappi, seadistame koostamise ja automaatse avaldamise, kasutades Github Actions.
Github Actions â funktsioon, mis vĂ”imaldab automatiseerida töövoogu, realiseerides tĂ€ieliku CI/CD tsĂŒkli. Kogumine, testimine ja deploy vĂ”ivad olla kĂ€ivitatud erinevate sĂŒndmuste tĂ”ttu: koodi pushimine, vĂ€ljalaske loomine vĂ”i issues. See funktsioon on tĂ€iesti tasuta avalike repo jaoks.
Selles osas nÀitan, kuidas seadistada koodi kogumist ja pushimist ning deploy-d Sonatype repo-s, kui vÀljastatakse uus versioon, samuti salasÔnade seadistamist.
Seadistame saladused
Automaatseks kogumiseks ja deploy-ks vajame rida salajasi vÀÀrtusi, nagu vÔtme ID, parool, mille me sisestasime vÔtme genereerimisel, ise PGP vÔti, samuti kasutajanimi/parool Sonatype jaoks. Need saab seadistada repo seadete eraldi osas:

Seadistame jÀrgmised muutujad:
- SONATYPE_USERNAME/SONATYPE_PASSWORD â kasutajanimi/parool, mille sisestasime Sonatype registreerimisel
- SIGNING_KEYID/SIGNING_PASSWORD â PGP vĂ”tme ID ja parool, mis mÀÀrati genereerimise ajal.
Muudatavale muutujale GPG_KEY_CONTENTS soovin rohkem tÀhelepanu pöörata. Fakt on see, et avaldamiseks on meil vaja privaatset PGP vÔtit. Selle lisamiseks saladustesse kasutasin ja tegin lisaks rida toiminguid.
- KrĂŒpteerime meie vĂ”tme gpg abil:
gpg --symmetric --cipher-algo AES256 9B695056.gpg, sisestades parooli. Selle tuleks paigutada muutuja sisse: SECRET_PASSPHRASE - TĂ”lgime saadud krĂŒpteeritud vĂ”tme tekstivormingusse base64 abil:
base64 9B695056.gpg.gpg > 9B695056.txt. Sisus paigutame muutuja sisse: GPG_KEY_CONTENTS.
Kogumise seadistamine koodi pushimise ja PR loomise ajal
Esmalt tuleb luua kaust teie projekti juures: .github/workflows.
Sinna paigutage fail, nÀiteks gradle-ci-build.yml jÀrjgnevate sisuga:
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ööprotsess kÀivitub, kui pushitakse harudesse master, dev ja testimine, samuti PR loomise ajal.
Jobs sektsioonis on vĂ€lja toodud sammud, mis peavad toimuma nimetatud sĂŒndmuste kohaselt. Antud juhul kogume viimasel ubuntu versioonil, kasutame Java 8 ja samuti pluginat Gradle jaoks eskatos/gradle-command-action@v1, mis kasutades viimast versiooni kogujast kĂ€ivitab kĂ€sud, mis on mÀÀratud â valikulised argumendid. Allpool vaatame lĂ€hemalt.. Muutujad secrets.SONATYPE_USERNAME ja secrets.SONATYPE_PASSWORD need on salajane, mille me varem mÀÀrasime.
Kogumise tulemused kajastuvad vahekaardil Actions:

Autodeploy uue vÀljaande avaldamisel
Autodeploy jaoks loome eraldi töövoo faili 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}}Fail on praktiliselt identne eelneva failiga, vĂ€lja arvatud sĂŒndmus, mil see aktiveerub. Antud juhul on see sĂŒndmus sildi loomine nimega, mis algab tĂ€hega v.
Enne deployimist peame PGP vĂ”tme saladustest vĂ€lja tĂ”mbama ja paigutama selle projekti juurka, samuti dekrĂŒpteerima selle. Edasi peame seadma spetsiaalse keskkonnamuutuja RELEASE_VERSION , millele viitame gradle.build failis. KĂ”ik see on tehtud osas Prepare to publish. Saame meie vĂ”tme muutuja GPG_KEY_CONTENTS kaudu, konverteerime selle gpg failiks, seejĂ€rel dekrĂŒpteerime, paigutades faili secret.gpg.
SeejÀrel viitame spetsiaalsele muutujale GITHUB_REF, millest saame vÀlja vÔtta versiooni, mille oleme mÀÀranud sildi loomisel. Antud muutuja vÀÀrtus on refs/tags/v0.0.2 , millest kÀrpime esimesed 11 tÀhte, et saada just versioon. Edasi kasutame standardseid Gradle kÀske avaldamiseks: test publish
Kontrollige avaldamise tulemusi Sonatype'i hoidlas
PÀrast vÀljaande loomist peaks algama töövoog, mis on kirjeldatud eelnevas osas. Selleks loome vÀljaande:

, kusjuures sildi nimi peab algama tÀhega v. Kui pÀrast Publish release'i klikkimist töövoog töötab, saame minna , et veenduda selles:

Artefakt ilmus Staging hoidlas. Alguses on see olekus Open, mille jÀrel tuleb see kÀsitsi sulgeda, vajutades vastavale nupule. PÀrast kÔigi nÔuete tÀitmise kontrollimist liigub artefakt olekusse Close ja ei ole enam muudetav. Sellisel kujul jÔuab see MavenCentralisse. Kui kÔik on korras, saab vajutada nuppu Release, sellega satub artefakt Sonatype hoidlasse.
Kuna artefakt jĂ”uaks MavenCentralisse, tuleb seda paluda ĂŒlesandes, mille me alguses lĂ”ime. Seda tuleb teha ainult ĂŒks kord, kuna avaldame esmakordselt. Edaspidi ei ole seda vajalik, kĂ”ik sĂŒnkroniseeritakse automaatselt. Minu sĂŒnkroniseerimine lĂŒlitati kiiresti sisse, kuid et artefakt muutuks saadavaks MavenCentralis, kulus umbes 5 pĂ€eva.
Sellega ongi kÔik, oleme avaldanud oma artefakti MavenCentralis.
Kasulikud lingid
- Sarnane , ainult avaldamine lÀbi maven
- Staging Sonatype
- Sonatype, kus tuleb ĂŒlesanne luua
- hoidlas, kus see kÔik on seadistatud
Allikas: habr.com
