ProHoster > Pūnaewele > Nā Administration > Ke hoʻohana nei i nā hana Gradle a me Github e hoʻolaha i ka papahana Java i ka Sonatype Maven Central Repository
Ke hoʻohana nei i nā hana Gradle a me Github e hoʻolaha i ka papahana Java i ka Sonatype Maven Central Repository
Ma kēia ʻatikala, makemake wau e nānā pono i ke kaʻina hana o ka hoʻopuka ʻana i kahi artifact Java mai ka ʻohi ʻana ma o Github Actions i ka Sonatype Maven Central Repository me ka hoʻohana ʻana i ka mea hana Gradle.
Ua hoʻoholo wau e kākau i kēia ʻatikala ma muli o ka nele o kahi aʻo maʻamau ma kahi hoʻokahi. Pono e hōʻiliʻili ʻia nā ʻike a pau mai nā kumu like ʻole, ʻaʻole hou loa. ʻO wai ka manaʻo, hoʻokipa ma lalo o ka pōpoki.
Ke hana nei i kahi waihona ma Sonatype
ʻO ka hana mua e hana i kahi waihona ma Sonatype Maven Central. No keia hele makou maanei, hoʻopaʻa inoa a hana i kahi hana hou, e noi ana iā mākou e hana i kahi waihona. Hoʻokele mākou i kā mākou GroupId papahana, Papahana URL loulou papahana a SCM URL he loulou i ka ʻōnaehana mana mana kahi i loaʻa ai ka papahana. GroupId eia ke ʻano com.example, com.example.domain, com.example.testsupport, a hiki ke loaʻa ma ke ʻano o kahi loulou i kāu github: github.com/yourusername -> io.github.yourusername. I kēlā me kēia hihia, pono ʻoe e hōʻoia i ka mea nona kēia kahua a i ʻole ka moʻolelo. Inā ʻoe i kuhikuhi i kahi profile github, e noi ʻia ʻoe e hana i kahi waihona lehulehu me ka inoa i makemake ʻia.
I kekahi manawa ma hope o ka hōʻoia ʻana, e hana ʻia kāu GroupId a hiki iā mākou ke neʻe i ka pae aʻe, ka hoʻonohonoho Gradle.
Ke hoʻonohonoho nei iā Gradle
I ka wā kākau, ʻaʻole i loaʻa iaʻu nā plugins Gradle e hiki ke kōkua i ka hoʻopuka ʻana i ka artifact. keia ʻO ka plugin wale nō i loaʻa iaʻu, akā naʻe, hōʻole ka mea kākau e kākoʻo hou iā ia. No laila, ua hoʻoholo wau e hana i nā mea āpau iaʻu iho, no ka mea ʻaʻole paʻakikī ke hana i kēia.
ʻO ka mea mua e noʻonoʻo ai ʻo ia nā koi o Sonatype no ka paʻi ʻana. ʻO lākou kēia:
Loaʻa nā code kumu a me JavaDoc, ʻo ia hoʻi. pono e hele -sources.jar и-javadoc.jar waihona. E like me ka mea i ʻōlelo ʻia ma ka palapala, inā ʻaʻole hiki ke hāʻawi i nā code kumu a i ʻole palapala, hiki iā ʻoe ke hana i kahi dummy. -sources.jar ai ole ia, -javadoc.jar me kahi README maʻalahi i loko e hele i ka hōʻike.
Pono e pūlima ʻia nā faila a pau GPG/PGPa .asc pono e hoʻokomo ʻia ka faila me ka pūlima no kēlā me kēia faila.
loaʻa nui pom faila
Nā waiwai kūpono groupId, artifactId и version. Hiki ke hoʻololi i ka mana a ʻaʻole hiki ke hoʻopau ʻia -SNAPSHOT
Pono ke alo name, description и url
ʻO ka loaʻa ʻana o ka ʻike e pili ana i ka laikini, nā mea hoʻomohala a me ka ʻōnaehana mana mana
ʻO kēia nā lula kumu e pono e hahai i ka wā e paʻi ana. Loaʻa ka ʻike piha maanei.
Hoʻokō mākou i kēia mau koi ma build.gradle waihona. ʻO ka mea mua, e hoʻohui i nā ʻike pono āpau e pili ana i nā mea hoʻomohala, nā laikini, ka ʻōnaehana mana mana, a hoʻonohonoho pū i ka url, inoa a me ka wehewehe ʻana o ka papahana. E kākau mākou i kahi ala maʻalahi no kēia:
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]'
}
}
}
}
}
A laila, pono ʻoe e wehewehe i ka wā o ka hui i hana ʻia -sources.jar и-javadoc.jar waihona. No keia pauku java pono ʻoe e hoʻohui i kēia mau mea:
java {
withJavadocJar()
withSourcesJar()
}
E neʻe kāua i ke koi hope, e hoʻonohonoho i kahi pūlima GPG/PGP. No ka hana ʻana i kēia, hoʻohui i ka plugin signing:
plugins {
id 'signing'
}
A hoʻohui i kahi ʻāpana:
signing {
sign publishing.publications
}
ʻO ka hope, e hoʻohui kākou i ʻāpana 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
}
}
}
}
he mea sonatypeUsername и sonatypePassword nā mea hoʻololi i loaʻa ka inoa inoa a me ka ʻōlelo huna i hana ʻia i ka wā hoʻopaʻa inoa ma sonatype.org.
Pela ka hope build.gradle e like me kēia:
Code build.gradle piha
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]'
}
}
}
}
}
Makemake au e hoʻomaopopo e loaʻa iā mākou ka mana mai ka hoʻololi kaiapuni: System.getenv('RELEASE_VERSION'). E hōʻike mākou iā ia i ka wā o ka hui a lawe ʻia mai ka inoa inoa.
PGP hana kī
ʻO kekahi o nā koi a Sonatype e kau inoa ʻia nā faila āpau me kahi kī GPG/PGP. No keia hele makou maanei a hoʻoiho i ka pono GnuPG no kāu ʻōnaehana hana.
Hoʻokumu mākou i kahi hui kī: gpg --gen-key, hoʻokomo i kahi inoa inoa, leka uila, a hoʻonohonoho pū i kahi ʻōlelo huna.
ʻIke mākou id kā mākou kī me ke kauoha: gpg --list-secret-keys --keyid-format short. E kuhikuhi ʻia ka ID ma hope o ka slash, no ka laʻana: rsa2048/9B695056
Ke paʻi ʻana i ke kī lehulehu i ke kikowaena https://keys.openpgp.org kauoha: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
Hoʻokuʻu aku mākou i ke kī huna i kahi wahi ʻole, pono mākou i ka wā e hiki mai ana: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg
Hoʻonohonoho i nā hana Github
E neʻe kāua i ka pae hope, hoʻonohonoho i ke kūkulu ʻana a hoʻopuka ʻokoʻa me ka hoʻohana ʻana iā Github Actions.
ʻO Github Actions kahi hiʻohiʻona e hiki ai iā ʻoe ke hoʻokaʻawale i ke kahe hana ma o ka hoʻokō ʻana i kahi pōʻai CI / CD piha. Hiki ke hoʻoulu ʻia ke kūkulu ʻana, hoʻāʻo, a me ka hoʻolaha ʻana e nā hanana like ʻole: code push, hoʻokuʻu ʻana, a i ʻole nā pilikia. He manuahi kēia hana no nā waihona lehulehu.
Ma kēia ʻāpana, e hōʻike wau iā ʻoe pehea e hoʻonohonoho ai i ke kūkulu ʻana a me ke kaomi ʻana i ke code a kau i ka waihona Sonatype i ka hoʻokuʻu ʻana, a me ka hoʻonohonoho ʻana i nā mea huna.
Hoʻonoho mākou i nā mea huna
No ka hui ʻana a me ka hoʻolaha ʻana, pono mākou i nā helu huna, e like me ke kī id, ka ʻōlelo huna a mākou i hoʻokomo ai i ka wā e hana ai i ke kī, ke kī PGP ponoʻī, a me ka Sonatype login / password. Hiki iā ʻoe ke hoʻonohonoho iā lākou i kahi ʻāpana kūikawā i nā hoʻonohonoho waihona:
Hoʻonoho mākou i nā ʻano like ʻole:
SONATYPE_USERNAME / SONATYPE_PASSWORD - kāinoa / ʻōlelo huna a mākou i komo ai i ke kau inoa ʻana me Sonatype
SIGNING_KEYID/SIGNING_PASSWORD — PGP kī id a me ka ʻōlelo huna i hoʻonohonoho ʻia i ka wā hana.
Makemake au e no'ono'o i ka ho'ololi GPG_KEY_CONTENTS i nā kiko'ī hou aku. ʻO ka ʻoiaʻiʻo no ka hoʻolaha ʻana pono mākou i kahi kī PGP pilikino. I mea e kau ai i loko o nā mea huna, ua hoʻohana au kauoha a ua hana hou i kekahi mau hana.
E hoʻopili i kā mākou kī me gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgma ke komo ʻana i ka ʻōlelo huna. Pono e hoʻokomo i loko o kahi hoʻololi: SECRET_PASSPHRASE
E unuhi kāua i ke kī i hoʻopili ʻia i loko o kahi palapala me ka base64: base64 9B695056.gpg.gpg > 9B695056.txt. E hoʻokomo ʻia ka ʻike ma ka hoʻololi: GPG_KEY_CONTENTS.
E kūkulu i ka hoʻonohonoho i ka wā e hoʻokau ai i ke code a me ka hana ʻana i PR
Pono mua ʻoe e hana i kahi waihona ma ke kumu o kāu papahana: .github/workflows.
I loko o ia mea, e hōʻailona i ka faila, no ka laʻana, gradle-ci-build.yml me keia mau mea:
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}}
E hoʻokō ʻia kēia kaʻina hana i ka wā e pahu ai i nā lālā master, dev и testing, i ka wā e hana ana i nā noi huki.
Hōʻike ka ʻāpana hana i nā ʻanuʻu e hoʻokō ʻia ma nā hanana i kuhikuhi ʻia. I kēia hihia, e kūkulu mākou i ka mana hou o ubuntu, e hoʻohana iā Java 8, a e hoʻohana pū i ka plugin no Gradle. eskatos/gradle-command-action@v1ʻo ia, me ka hoʻohana ʻana i ka mana hou o ka mea kūkulu hale, e holo i nā kauoha i kuhikuhi ʻia ma arguments. Nā mea hoʻololi secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD ʻo ia nā mea huna a mākou i nīnau mua ai.
E hōʻike ʻia nā hopena kūkulu ma ka pā Hana:
Hoʻomoe ʻakomi ke hoʻokuʻu ʻia kahi hoʻokuʻu hou
E hana kākou i faila kaʻawale no ka 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}}
Aneane like ka waihona me ka mea ma mua, koe wale no ka hanana kahi e hoʻomaka ai. I kēia hihia, ʻo kēia ka hanana o ka hana ʻana i kahi hōʻailona me kahi inoa e hoʻomaka ana me v.
Ma mua o ka hoʻolaha ʻana, pono mākou e unuhi i ke kī PGP mai nā mea huna a waiho i ke kumu o ka papahana, a me ka decrypt. A laila, pono mākou e hoʻonohonoho i kahi ʻano hoʻololi kaiapuni kūikawā RELEASE_VERSION a makou e kuhikuhi nei gradle.build waihona. Hanaʻia kēia mau mea a pau ma ka māhele Prepare to publish. Loaʻa iā mākou kā mākou kī mai ka hoʻololi GPG_KEY_CONTENTS, unuhi iā ia i kahi faila gpg, a laila hoʻokaʻawale iā ia ma ka waiho ʻana i loko o ka faila. secret.gpg.
A laila, huli mākou i kahi loli kūikawā GITHUB_REF, kahi e hiki ai iā mākou ke kiʻi i ka mana a mākou i hoʻonohonoho ai i ka wā e hana ai i ka hōʻailona. Pili kēia ʻano hoʻololi i kēia hihia. refs/tags/v0.0.2 kahi a mākou i ʻoki ai i nā huaʻōlelo 11 mua e loaʻa i kahi mana kikoʻī. A laila, hoʻohana mākou i nā kauoha Gradle maʻamau no ka paʻi ʻana: test publish
Ke nānā nei i nā hopena hoʻolālā ma ka waihona Sonatype
Ma hope o ka hoʻokuʻu ʻia ʻana, pono e hoʻomaka ke kaʻina hana i wehewehe ʻia ma ka ʻāpana mua. No ka hana ʻana i kēia, hana i kahi hoʻokuʻu:
e hoʻomaka ka inoa inoa me ka v. Inā, ma hope o ke kaomi ʻana i ka hoʻopuka hoʻokuʻu, hoʻopau maikaʻi ke kaʻina hana, hiki iā mākou ke hele i Sonatype Nexus e hōʻoia:
Ua ʻike ʻia ka mea hana i loko o ka waihona Staging. Hōʻike koke ia ma ke kūlana Open, a laila pono e hoʻololi lima ʻia i ke kūlana Close ma ke kaomi ʻana i ke pihi kūpono. Ma hope o ka nānā ʻana ua hoʻokō ʻia nā koi āpau, hele ka artifact i ke kūlana Close a ʻaʻole i loaʻa hou no ka hoʻololi ʻana. Ma kēia ʻano, e pau ia ma MavenCentral. Inā maikaʻi nā mea a pau, hiki iā ʻoe ke kaomi i ke pihi Release, a e pau ka artifact i ka waihona Sonatype.
I mea e komo ai ka artifact i loko o MavenCentral, pono ʻoe e noi iā ia ma ka hana a mākou i hana ai i ka hoʻomaka. Pono ʻoe e hana i kēia, no laila, hoʻolaha mākou no ka manawa mua. I nā manawa aʻe, ʻaʻole koi ʻia kēia, e hoʻonohonoho ʻia nā mea āpau. Ua hoʻohuli koke lākou i ka synchronization noʻu, akā ua lawe ʻia ma kahi o 5 mau lā no ka loaʻa ʻana o ka artifact ma MavenCentral.
ʻO ia wale nō, ua paʻi mākou i kā mākou mea hana ma MavenCentral.