ProHoster > blog > Amministrazzjoni > L-użu ta 'Azzjonijiet ta' Gradle u Github biex Tippubblika Proġett Java għar-Repożitorju Ċentrali ta 'Sonatype Maven
L-użu ta 'Azzjonijiet ta' Gradle u Github biex Tippubblika Proġett Java għar-Repożitorju Ċentrali ta 'Sonatype Maven
F'dan l-artikolu, nixtieq nagħti ħarsa dettaljata lejn il-proċess ta 'pubblikazzjoni ta' artifatt Java mill-bidu permezz ta 'Azzjonijiet Github għar-Repożitorju Ċentrali Sonatype Maven billi tuża l-bennej Gradle.
Iddeċidejt li nikteb dan l-artikolu minħabba n-nuqqas ta 'tutorja normali f'post wieħed. L-informazzjoni kollha kellha tinġabar biċċa biċċa minn diversi sorsi, barra minn hekk, mhux friska għal kollox. Min jimpurtah, merħba taħt qattus.
Ħolqien ta' repożitorju f'Sonatype
L-ewwel pass huwa li toħloq repożitorju f'Sonatype Maven Central. Għal dan immorru hawn, irreġistra u toħloq kompitu ġdid, u titlobna noħolqu repożitorju. Aħna nsuqu fil tagħna GroupId proġett, URL tal-Proġett rabta tal-proġett u SCM url link għas-sistema ta' kontroll tal-verżjoni li fiha jinsab il-proġett. GroupId hawnhekk għandu jkun tal-forma com.example, com.example.domain, com.example.testsupport, u jista 'jkun ukoll fil-forma ta' link għall-github tiegħek: github.com/yourusername -> io.github.yourusername. Fi kwalunkwe każ, ser ikollok bżonn tivverifika s-sjieda ta' dan id-dominju jew profil. Jekk speċifikajt profil github, inti tintalab toħloq repożitorju pubbliku bl-isem mixtieq.
Xi żmien wara l-konferma, se jinħoloq l-Id tal-Grupp tiegħek u nistgħu ngħaddu għall-pass li jmiss, il-konfigurazzjoni ta’ Gradle.
Konfigurazzjoni ta' Gradle
Fil-ħin tal-kitba, ma sibtx plugins Gradle li jistgħu jgħinu fil-pubblikazzjoni tal-artifatt. Hija l-uniku plugin li sibt, madankollu, l-awtur irrifjuta li jkompli jappoġġjah. Għalhekk, iddeċidejt li nagħmel kollox jien, peress li mhux wisq diffiċli li tagħmel dan.
L-ewwel ħaġa li għandek insemmu huma r-rekwiżiti ta 'Sonatype għall-pubblikazzjoni. Dawn huma dawn li ġejjin:
Disponibbiltà ta' kodiċijiet tas-sors u JavaDoc, jiġifieri. iridu jattendu -sources.jar и-javadoc.jar fajls. Kif iddikjarat fid-dokumentazzjoni, jekk ma jkunx possibbli li tipprovdi kodiċi tas-sors jew dokumentazzjoni, tista 'tagħmel manikin -sources.jar jew -javadoc.jar b'README sempliċi ġewwa biex tgħaddi mit-test.
Il-fajls kollha għandhom ikunu ffirmati bihom GPG/PGPU .asc il-fajl li jkun fih il-firma għandu jkun inkluż għal kull fajl.
disponibbiltà pom fajl
Valuri korretti groupId, artifactId и version. Il-verżjoni tista 'tkun string arbitrarja u ma tistax tispiċċa bi -SNAPSHOT
Preżenza meħtieġa name, description и url
Il-preżenza ta 'informazzjoni dwar il-liċenzja, l-iżviluppaturi u s-sistema ta' kontroll tal-verżjoni
Dawn huma r-regoli bażiċi li jridu jiġu segwiti meta tiġi ppubblikata. Informazzjoni sħiħa disponibbli hawn.
Aħna nimplimentaw dawn ir-rekwiżiti fi build.gradle fajl. L-ewwel, ejja nżidu l-informazzjoni kollha meħtieġa dwar l-iżviluppaturi, liċenzji, sistema ta 'kontroll tal-verżjoni, u wkoll issettja l-url, l-isem u d-deskrizzjoni tal-proġett. Ejja nikteb metodu sempliċi għal dan:
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]'
}
}
}
}
}
Sussegwentement, għandek bżonn tispeċifika li matul l-assemblaġġ iġġenerat -sources.jar и-javadoc.jar fajls. Għal din it-taqsima java trid iżżid dan li ġej:
java {
withJavadocJar()
withSourcesJar()
}
Ejja ngħaddu għall-aħħar rekwiżit, it-twaqqif ta 'firma GPG/PGP. Biex tagħmel dan, qabbad il-plugin signing:
plugins {
id 'signing'
}
U żid taqsima:
signing {
sign publishing.publications
}
Fl-aħħarnett, ejja żid taqsima 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
}
}
}
}
Hawnhekk sonatypeUsername и sonatypePassword varjabbli li fihom il-login u l-password maħluqa waqt ir-reġistrazzjoni fuq sonatype.org.
Għalhekk il-finali build.gradle se tidher bħal din:
Kodiċi build.gradle sħiħ
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]'
}
}
}
}
}
Irrid ninnota li nġibu l-verżjoni mill-varjabbli ambjentali: System.getenv('RELEASE_VERSION'). Aħna se jesponuha waqt l-assemblaġġ u nieħduha mill-isem tat-tikketta.
Ġenerazzjoni taċ-ċavetta PGP
Wieħed mir-rekwiżiti ta' Sonatype huwa li l-fajls kollha jridu jiġu ffirmati b'ċavetta GPG/PGP. Għal dan immorru hawn u niżżel l-utilità GnuPG għas-sistema operattiva tiegħek.
Aħna niġġeneraw par ewlieni: gpg --gen-key, daħħal username, e-mail, u wkoll issettja password.
Nafu id iċ-ċavetta tagħna bil-kmand: gpg --list-secret-keys --keyid-format short. L-id se tkun speċifikata wara l-linja mmejla, pereżempju: rsa2048/9B695056
Ejja ngħaddu għall-istadju finali, waqqaf il-bini u l-pubblikazzjoni awtomatika billi tuża Github Actions.
Github Actions hija karatteristika li tippermettilek awtomat il-fluss tax-xogħol billi timplimenta ċiklu CI / CD sħiħ. Il-bini, it-test u l-iskjerament jistgħu jiġu attivati minn diversi avvenimenti: kodiċi push, ħolqien ta 'rilaxx, jew kwistjonijiet. Din il-funzjonalità hija assolutament b'xejn għar-repożitorji pubbliċi.
F'din it-taqsima, ser nuruk kif twaqqaf build u push code u tiskjera fir-repożitorju Sonatype mar-rilaxx, kif ukoll twaqqaf sigrieti.
Aħna nistabbilixxu sigrieti
Għall-assemblaġġ u l-iskjerament awtomatiku, neħtieġu numru ta 'valuri sigrieti, bħall-id taċ-ċavetta, il-password li dħalna meta ġġeneraw iċ-ċavetta, iċ-ċavetta PGP nnifisha, u l-login/password Sonatype. Tista' tissettjahom f'sezzjoni speċjali fis-settings tar-repożitorju:
Aħna stabbilixxew il-varjabbli li ġejjin:
SONATYPE_USERNAME / SONATYPE_PASSWORD - login / password li dħalna meta rreġistrajna ma' Sonatype
SIGNING_KEYID/SIGNING_PASSWORD — ID taċ-ċavetta PGP u password stabbiliti waqt il-ġenerazzjoni.
Irrid nitkellem fuq il-varjabbli GPG_KEY_CONTENTS f'aktar dettall. Il-fatt hu li għall-pubblikazzjoni neħtieġu ċavetta PGP privata. Sabiex tpoġġiha fis-sigrieti, użajt istruzzjoni u barra minn hekk għamel numru ta’ azzjonijiet.
Ejja nittraduċu ċ-ċavetta kriptata riċevuta f'forma ta 'test billi tuża base64: base64 9B695056.gpg.gpg > 9B695056.txt. Il-kontenut se jitqiegħed fil-varjabbli: GPG_KEY_CONTENTS.
Ibni setup meta timbotta l-kodiċi u toħloq PR
L-ewwel trid toħloq folder fl-għerq tal-proġett tiegħek: .github/workflows.
Fiha, immarka l-fajl, pereżempju, gradle-ci-build.yml bil-kontenut li ġej:
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}}
Dan il-fluss tax-xogħol se jiġi eżegwit meta timbotta għall-fergħat master, dev и testing, ukoll meta toħloq talbiet għall-ġibda.
It-taqsima tal-impjiegi tispeċifika l-passi li għandhom jitwettqu fuq l-avvenimenti speċifikati. F'dan il-każ, aħna se nibnu fuq l-aħħar verżjoni ta 'ubuntu, nużaw Java 8, u nużaw ukoll il-plugin għal Gradle eskatos/gradle-command-action@v1li, bl-użu tal-aħħar verżjoni tal-bennej, se jmexxi l-kmandi speċifikati fi arguments. Varjabbli secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD dawn huma s-sigrieti li tlabna qabel.
Ir-riżultati tal-bini se jkunu riflessi fit-tab Azzjonijiet:
Skjerament awtomatiku meta toħroġ rilaxx ġdid
Ejja noħolqu fajl tal-fluss tax-xogħol separat għall-awtodeploy 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}}
Il-fajl huwa kważi identiku għal dak preċedenti, ħlief għall-avveniment li fih se jiġi attivat. F'dan il-każ, dan huwa l-avveniment li tinħoloq tikketta b'isem li jibda bil-v.
Qabel l-iskjerament, għandna bżonn niġbdu ċ-ċavetta PGP mis-sigrieti u npoġġuha fl-għerq tal-proġett, kif ukoll tiddekriptaha. Sussegwentement, għandna bżonn nissettjaw varjabbli ambjentali speċjali RELEASE_VERSION li nirreferu għalih gradle.build fajl. Dan kollu jsir fit-taqsima Prepare to publish. Aħna nġibu ċ-ċavetta tagħna mill-varjabbli GPG_KEY_CONTENTS, tittraduċiha f'fajl gpg, imbagħad tiddekriptha billi npoġġuha fil-fajl secret.gpg.
Sussegwentement, aħna nduru għal varjabbli speċjali GITHUB_REF, li minnha nistgħu niksbu l-verżjoni li nissettjaw meta noħolqu t-tikketta. Din il-varjabbli hija rilevanti f'dan il-każ. refs/tags/v0.0.2 li minnha naqtgħu l-ewwel 11-il karattru biex niksbu verżjoni speċifika. Sussegwentement, nużaw il-kmandi Gradle standard għall-pubblikazzjoni: test publish
Wara li tinħoloq ir-rilaxx, il-fluss tax-xogħol deskritt fit-taqsima preċedenti għandu jibda. Biex tagħmel dan, oħloq rilaxx:
l-isem tat-tikketta għandu jibda bil-v. Jekk, wara li tikklikkja Ippubblika rilaxx, il-fluss tax-xogħol jitlesta b'suċċess, nistgħu mmorru Sonatype Nexus biex tiżgura:
L-artifact deher fir-repożitorju Staging. Jidher immedjatament fl-istatus Miftuħ, allura għandu jiġi trasferit manwalment għall-istatus Agħlaq billi tagħfas il-buttuna xierqa. Wara li tiċċekkja li r-rekwiżiti kollha huma sodisfatti, l-artifatt jidħol fl-istatus Agħlaq u m'għadux disponibbli għall-modifika. F'din il-forma, se jispiċċa f'MavenCentral. Jekk kollox huwa tajjeb, tista 'tagħfas il-buttuna Rilaxx, u l-artifact se jispiċċa fir-repożitorju Sonatype.
Sabiex l-artifact jidħol f'MavenCentral, trid titlobha fil-kompitu li ħloqna fil-bidu nett. Għandek bżonn tagħmel dan darba biss, għalhekk aħna nippubblikaw għall-ewwel darba. Fi żminijiet sussegwenti, dan mhux meħtieġ, kollox se jkun sinkronizzat awtomatikament. Huma daru s-sinkronizzazzjoni għalija malajr, iżda ħadet madwar 5 ijiem biex l-artifatt isir disponibbli f'MavenCentral.
Dak kollu, ippubblikajna l-artifatt tagħna f'MavenCentral.
Links utli
Simili artikolu, tippubblika biss permezz ta' maven