เปเบเบเบปเบเบเบงเบฒเบกเบเบตเป, เบเปเบญเบเบเปเบญเบเบเบฒเบเปเบเบดเปเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเปเบฝเบงเบเบฑเบเบเบฐเบเบงเบเบเบฒเบเปเบเบตเบเปเบเปเบชเบดเปเบเบเบฐเบเบดเบ Java เบเบฑเปเบเปเบเปเปเบฅเบตเปเบกเบเบปเปเบเปเบเบเบเปเบฒเบ Github Actions เปเบเบซเบฒ Sonatype Maven Central Repository เปเบเบเปเบเป Gradle builder.
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบฝเบเบเบปเบเบเบงเบฒเบกเบเบตเปเปเบเบทเปเบญเบเบเบฒเบเบเบฒเบเบเบฒเบเบเบฒเบเบชเบญเบเบเบปเบเบเบฐเบเบดเบขเบนเปเปเบเบชเบฐเบเบฒเบเบเบตเปเบซเบเบถเปเบ. เบเปเปเบกเบนเบเบเบฑเบเบซเบกเบปเบเบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบเปเบเบฑเบเบเปเบฒเปเบเบเบชเบดเปเบเบเบฒเบเปเบซเบผเปเบเบเปเบฒเบเป, เบเบญเบเบเบฒเบเบเบฑเปเบ, เบเปเปเปเบกเปเบเบเบฑเบเบซเบกเบปเบเบชเบปเบ. เปเบเบชเบปเบเปเบ, เบเบดเบเบเบตเบเปเบญเบเบฎเบฑเบเบเบฒเบเปเบเป cat.
เบเบฒเบเบชเปเบฒเบ repository เปเบ Sonatype
เบเบฑเปเบเบเบญเบเบเปเบฒเบญเบดเบเปเบกเปเบเบเบฒเบเบชเปเบฒเบ repository เปเบ Sonatype Maven Central. เบชเปเบฒเบฅเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบ
เบเบฒเบเบเบฑเปเบเบซเบผเบฑเบเบเบฒเบเบเบฒเบเบขเบทเบเบขเบฑเบ, GroupId เบเบญเบเปเบเบปเปเบฒเบเบฐเบเบทเบเบชเปเบฒเบเบเบทเปเบเปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเปเบฒเบงเปเบเบชเบนเปเบเบฑเปเบเบเบญเบเบเปเปเปเบ, เบเบฒเบเบเบฑเปเบเบเปเบฒ Gradle.
เบเบฒเบเบเบฑเปเบเบเปเบฒ Gradle
เปเบเปเบงเบฅเบฒเบเบฝเบ, เบเปเบญเบเบเปเปเบเบปเบ Gradle plugins เบเบตเปเบชเบฒเบกเบฒเบเบเปเบงเบเปเบเบเบฒเบเปเบเบตเบเปเบเปเบเบญเบก.
เบชเบดเปเบเบเปเบฒเบญเบดเบเบเบตเปเบเบฐเบเบดเบเบญเบญเบเปเบกเปเบเบเบงเบฒเบกเบเปเบญเบเบเบฒเบเบเบญเบ Sonatype เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบดเบกเปเบเบตเบเปเบเป. เบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบกเปเบเบเบฑเปเบเบเปเปเปเบเบเบตเป:
- เบเบงเบฒเบกเบเปเบญเบกเบเบญเบเบฅเบฐเบซเบฑเบเปเบซเบผเปเบเปเบฅเบฐ JavaDoc, ie. เบเปเบญเบเปเบเบปเปเบฒเบฎเปเบงเบก
-sources.jar
ะธ-javadoc.jar
เปเบเบฅเป. เบเบฑเปเบเบเบตเปเปเบเปเบเปเบฒเบงเปเบงเปเปเบเปเบญเบเบฐเบชเบฒเบ, เบเปเบฒเบกเบฑเบเบเปเปเบชเบฒเบกเบฒเบเบชเบฐเบซเบเบญเบเบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบซเบผเบทเปเบญเบเบฐเบชเบฒเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเปเบฒเบ dummy เปเบเป.-sources.jar
เบซเบผเบท-javadoc.jar
เบเปเบงเบ README เบเปเบฒเบเปเบเบฒเบเปเบเปเบเบทเปเบญเบเปเบฒเบเบเบฒเบเบเบปเบเบชเบญเบ. - เปเบเบฅเปเบเบฑเบเปเบปเบเบเปเบญเบเบเบทเบเปเบเบฑเบเบเปเบงเบ
GPG/PGP
เปเบฅเบฐ.asc
เปเบเบฅเปเบเบตเปเบกเบตเบฅเบฒเบเปเบเบฑเบเบเบฐเบเปเบญเบเบเบทเบเบฅเบงเบกเปเบเบปเปเบฒเบเบฑเบเปเบเปเบฅเบฐเปเบเบฅเป. - เบกเบต
pom
เปเบเบฅ - เบเปเบฒเบเบตเปเบเบทเบเบเปเบญเบ
groupId
,artifactId
ะธversion
. เบฎเบธเปเบเบชเบฒเบกเบฒเบเปเบเบฑเบเบชเบฒเบเบชเบฐเบเบฃเบดเบเบเบตเปเบกเบฑเบ เปเบฅเบฐเบเปเปเบชเบฒเบกเบฒเบเบชเบดเปเบเบชเบธเบเปเบเป-SNAPSHOT
- เบเปเบญเบเบกเบตเบเบฒเบเบกเบตเบขเบนเป
name
,description
ะธurl
- เบเบฒเบเบเบฐเบเบปเบเบเบปเบงเบเบญเบเบเปเปเบกเบนเบเบเปเบฝเบงเบเบฑเบเปเบเบญเบฐเบเบธเบเบฒเบ, เบเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบฅเบฐเบฅเบฐเบเบปเบเบเบฒเบเบเบงเบเบเบธเบกเบชเบฐเบเบฑเบ
เปเบซเบผเบปเปเบฒเบเบตเปเปเบกเปเบเบเบปเบเบฅเบฐเบเบฝเบเบเบทเปเบเบเบฒเบเบเบตเปเบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบกเปเบเปเบงเบฅเบฒเบเบตเปเปเบเบตเบเปเบเป. เบกเบตเบเปเปเบกเบนเบเปเบเบฑเบกเบเบตเป
เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบดเบเบฑเบเบเปเปเบเปเบฒเบเบปเบเปเบซเบผเบปเปเบฒเบเบตเปเบขเบนเปเปเบ build.gradle
เปเบเบฅเป. เบเปเบฒเบญเบดเบ, เปเบซเปเปเบเบตเปเบกเบเปเปเบกเบนเบเบเบตเปเบเปเบฒเปเบเบฑเบเบเบฑเบเบซเบกเบปเบเบเปเบฝเบงเบเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ, เปเบเบญเบฐเบเบธเบเบฒเบ, เบฅเบฐเบเบปเบเบเบฒเบเบเบงเบเบเบธเบกเบชเบฐเบเบฑเบ, เปเบฅเบฐเบเบฑเบเบเปเบฒเบเบปเบ url, เบเบทเปเปเบฅเบฐเบเปเบฒเบญเบฐเบเบดเบเบฒเบเบเบญเบเปเบเบเบเบฒเบ. เปเบซเปเบเบงเบเปเบฎเบปเบฒเบเบฝเบเบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป:
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]'
}
}
}
}
}
เบเปเปเปเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบฅเบฐเบเบธเบงเปเบฒเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบเบฐเบเบญเบเบชเปเบฒเบ -sources.jar
ะธ-javadoc.jar
เปเบเบฅเป. เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป java
เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบตเปเบกเบชเบดเปเบเบเปเปเปเบเบเบตเป:
java {
withJavadocJar()
withSourcesJar()
}
เปเบซเปเบเปเบฒเบงเปเบเบชเบนเปเบเบงเบฒเบกเบเปเบญเบเบเบฒเบเบชเบธเบเบเปเบฒเบ, เบเบฑเปเบเบเปเบฒเบฅเบฒเบเปเบเบฑเบ GPG/PGP. เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เปเบเบทเปเบญเบกเบเปเป plugin signing
:
plugins {
id 'signing'
}
เปเบฅเบฐเปเบเบตเปเบกเบเบฒเบเบชเปเบงเบ:
signing {
sign publishing.publications
}
เบชเบธเบเบเปเบฒเบ, เปเบซเปเบเบงเบเปเบฎเบปเบฒเปเบเบตเปเบกเบเบฒเบเบชเปเบงเบ 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
}
}
}
}
เบกเบฑเบเปเบเบฑเบ sonatype เบเบทเปเบเบนเปเปเบเป ะธ sonatypePassword เบเบปเบงเปเบเบเบตเปเบกเบตเบเบฒเบเปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบ เปเบฅเบฐเบฅเบฐเบซเบฑเบเบเปเบฒเบเบเบตเปเบชเปเบฒเบเบเบถเปเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบ
เบเบฑเปเบเบเบฑเปเบเบชเบธเบเบเปเบฒเบ build.gradle
เบเบฐโเปเบเบดเปเบโเบเบทโเบเบตเปโ:
เบฅเบฐเบซเบฑเบ 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]'
}
}
}
}
}
เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเบชเบฑเบเปเบเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเบชเบฐเบเบฑเบเบเบฒเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก: System.getenv('RELEASE_VERSION')
. เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบตเบเปเบเบตเบเบกเบฑเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบเบฐเบเบญเบเปเบฅเบฐเปเบญเบปเบฒเบกเบฑเบเบญเบญเบเบเบฒเบเบเบทเปเปเบเบฑเบ.
เบเบฒเบเบเบฐเบฅเบดเบเบเบฐเปเบ PGP
เบซเบเบถเปเบเปเบเบเปเปเบเปเบฒเบเบปเบเบเบญเบ Sonatype เปเบกเปเบเบงเปเบฒเปเบเบฅเปเบเบฑเบเบซเบกเบปเบเบเบฐเบเบทเบเปเบเบฑเบเบเปเบงเบเบฅเบฐเบซเบฑเบ GPG/PGP. เบชเปเบฒเบฅเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบ
- เบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเบเบนเปเบเบตเปเบชเปเบฒเบเบฑเบ:
gpg --gen-key
, เปเบชเปเบเบทเปเบเบนเปเปเบเป, e-mail, เปเบฅเบฐเบเบฑเบเบเบฑเปเบเบฅเบฐเบซเบฑเบเบเปเบฒเบ. - เบเบงเบเปเบฎเบปเบฒเบเบญเบเบซเบฒ
id
เบเบตเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเปเบฒเบชเบฑเปเบ:gpg --list-secret-keys --keyid-format short
. Id เบเบฐเบเบทเบเบฅเบฐเบเบธเบซเบผเบฑเบเบเบฒเบเปเบเบทเปเบญเบเปเบฒเบเบเบฑเบ, เบเบปเบงเบขเปเบฒเบ: rsa2048/9B695056 - เบเบฒเบเปเบเบตเบเปเบเปเบฅเบฐเบซเบฑเบเบชเบฒเบเบฒเบฅเบฐเบเบฐเบเบฑเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบ
https://keys.openpgp.org เปเบเบโเบเปเบฒโเบชเบฑเปเบโ:gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
- เบเบงเบเปเบฎเบปเบฒเบชเบปเปเบเบญเบญเบเบเบฐเปเบเบฅเบฑเบเปเบเบซเบฒเบชเบฐเบเบฒเบเบเบตเปเบเบตเปเบเบปเบเปเบญเบเบกเบฑเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบญเบเบเบฒเบเบกเบฑเบเปเบเบญเบฐเบเบฒเบเบปเบ:
gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg
เบเบฒเบเบเบฑเปเบเบเปเบฒ Github Actions
เปเบซเปเบเปเบฒเบงเปเบเบชเบนเปเบเบฑเปเบเบเบญเบเบชเบธเบเบเปเบฒเบ, เบเบฑเปเบเบเปเบฒเบเบฒเบเบเปเปเบชเปเบฒเบ เปเบฅเบฐเปเบเบตเบเปเบเปเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบเบเปเบเป Github Actions.
Github Actions เปเบกเปเบเบเบธเบเบชเบปเบกเบเบฑเบเบเบตเปเบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบฐเบเบงเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเปเบเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบฎเบญเบเบงเบฝเบ CI / CD เปเบเบฑเบก. เบเบฒเบเบเปเปเบชเปเบฒเบ, เบเบฒเบเบเบปเบเบชเบญเบ, เปเบฅเบฐเบเบฒเบเบเปเบฒเปเบเปเบชเบฒเบกเบฒเบเบเบทเบเบเบฐเบเบธเปเบเปเบเบเปเบซเบเบเบฒเบเบเปเบฒเบเป: เบเบฒเบเบเบธเบเบเบนเปเบฅเบฐเบซเบฑเบ, เบเบฒเบเบชเปเบฒเบเบเบฒเบเบเปเบญเบ, เบซเบผเบทเบเบฑเบเบซเบฒ. เบเบฑเบเบเบฑเบเบเบตเปเปเบกเปเบเบเปเปเปเบชเบเบเปเบฒเบขเปเบฒเบเปเบเปเบเบดเบเบชเปเบฒเบฅเบฑเบ repositories เบชเบฒเบเบฒเบฅเบฐเบเบฐ.
เปเบเบเบฒเบเบเบตเป, เบเปเบญเบเบเบฐเบชเบฐเปเบเบเบงเบดเบเบตเบเบฒเบเบเบฑเปเบเบเปเบฒเบชเปเบฒเบเปเบฅเบฐเบเบธเบเบเบนเปเบฅเบฐเบซเบฑเบเปเบฅเบฐเบเปเบฒเปเบเปเบเปเบเบฑเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ Sonatype เปเบเบเบฒเบเบเปเบญเบ, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบงเบฒเบกเบฅเบฑเบ.
เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบเบปเบเบเบงเบฒเบกเบฅเบฑเบ
เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบญเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบฅเบฐเบเบฒเบเบเปเบฒเปเบเป, เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเปเบฒเบเบงเบเบเบงเบฒเบกเบฅเบฑเบ, เปเบเบฑเปเบ: เบฅเบฐเบซเบฑเบเบฅเบฐเบซเบฑเบ, เบฅเบฐเบซเบฑเบเบเปเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบชเปเปเบเปเบงเบฅเบฒเบเบตเปเบชเปเบฒเบเบฅเบฐเบซเบฑเบ, เบฅเบฐเบซเบฑเบ PGP เบเบปเบงเบกเบฑเบเปเบญเบ, เปเบฅเบฐ Sonatype เปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบ / เบฅเบฐเบซเบฑเบเบเปเบฒเบ. เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเบเบปเบเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒเบขเบนเปเปเบเบเบฒเบเบเบดเปเบชเบเปเบเบเบฒเบเบเบฑเปเบเบเปเบฒ repository:
เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบเบปเบเบเบปเบงเปเบเบเบฑเปเบเบเปเปเปเบเบเบตเป:
- SONATYPE_USERNAME / SONATYPE_PASSWORD - เปเบเบปเปเบฒโเบชเบนเปโเบฅเบฐโเบเบปเบ / เบฅเบฐโเบซเบฑเบโเบเปเบฒเบโเบเบตเปโเบเบงเบโเปเบฎเบปเบฒโเปเบเปโเปเบชเปโเปเบโเปเบงโเบฅเบฒโเบเบตเปโเบฅเบปเบโเบเบฐโเบเบฝเบโเบเบฑเบ Sonatype
- SIGNING_KEYID/SIGNING_PASSWORD โ เบฅเบฐเบซเบฑเบเบฅเบฐเบซเบฑเบ PGP เปเบฅเบฐเบฅเบฐเบซเบฑเบเบเปเบฒเบเบเบทเบเบเบฑเปเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบเบฐเบฅเบดเบ.
เบเปเบญเบเบเปเบญเบเบเบฒเบเบขเบนเปเปเบเบเบปเบงเปเบ GPG_KEY_CONTENTS เปเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบก. เบเบงเบฒเบกเบเบดเบเปเบฅเปเบงเปเบกเปเบเบงเปเบฒเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบดเบกเปเบเบตเบเปเบเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบฅเบฐเบซเบฑเบ PGP เบชเปเบงเบเบเบปเบง. เปเบเบเปเบฒเบชเบฑเปเบเบเบตเปเบเบฐเบเบฐเบเบฒเบเบกเบฑเบเบขเบนเปเปเบเบเบงเบฒเบกเบฅเบฑเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเปเบฒเปเบเป
- เปเบซเปเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเบฅเบฐเบซเบฑเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเปเบงเบ gpg:
gpg --symmetric --cipher-algo AES256 9B695056.gpg
เปเบเบเบเบฒเบเปเบชเปเบฅเบฐเบซเบฑเบเบเปเบฒเบ. เบกเบฑเบเบเบงเบเบเบฐเบเบทเบเบงเบฒเบเปเบงเปเปเบเบเบปเบงเปเบ: SECRET_PASSHRASE - เปเบซเปเปเบเบฅเบฐเบซเบฑเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเบเบตเปเปเบเปเบฎเบฑเบเปเบเบปเปเบฒเปเบเปเบเปเบเบเบเบญเบกเบเปเปเบเบงเบฒเบกเปเบเบเปเบเป base64:
base64 9B695056.gpg.gpg > 9B695056.txt
. เปเบเบทเปเบญเบซเบฒเบเบฐเบเบทเบเบงเบฒเบเปเบงเปเปเบเบเบปเบงเปเบ: GPG_KEY_CONTENTS.
เบชเปเบฒเบเบเบฒเบเบเบดเบเบเบฑเปเบเปเบกเบทเปเบญเบเบปเบเบฅเบฐเบซเบฑเบเปเบฅเบฐเบชเปเบฒเบ PR
เบเปเบญเบเบญเบทเปเบ เปเบปเบ เบเปเบฒเบเบเปเบญเบเบชเปเบฒเบเปเบเบเปเบเบตเปเบเบฎเบฒเบเบเบญเบเปเบเบเบเบฒเบเบเบญเบเบเปเบฒเบ: .github/workflows
.
เปเบเบกเบฑเบ, เบซเบกเบฒเบเปเบเบดเบเปเบเบฅเป, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, gradle-ci-build.yml
เปเบเบโเบกเบตโเปเบเบทเปเบญโเปเบโเบเบฑเปเบโเบเปเปโเปเบโเบเบตเปโ:
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}}
เบเบฑเปเบเบเบญเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบตเปเบเบฐเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบเปเบงเบฅเบฒเบเบตเปเบเบนเปเปเบเบซเบฒเบชเบฒเบเบฒ master
, dev
ะธ testing
, เบเบฑเบเปเบเปเบงเบฅเบฒเบเบตเปเบชเปเบฒเบเบเบฒเบเบฎเปเบญเบเบเปเบเบถเบ.
เบเบฒเบเบชเปเบงเบเบงเบฝเบเบเปเบฒเบเบปเบเบเบฑเปเบเบเบญเบเบเบตเปเบเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฝเบงเบเบฑเบเปเบซเบเบเบฒเบเบเบตเปเบฅเบฐเบเบธเปเบงเป. เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเบฐเบชเปเบฒเบ ubuntu เบฎเบธเปเบเบซเบผเปเบฒเบชเบธเบ, เปเบเป Java 8, เปเบฅเบฐเบเบฑเบเปเบเป plugin เบชเปเบฒเบฅเบฑเบ Gradle. eskatos/gradle-command-action@v1
เปเบเบดเปเบ, เปเบเบเปเบเปเบเบปเบงเบชเปเบฒเบเบฎเบธเปเบเบซเบผเปเบฒเบชเบธเบ, เบเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฒเบชเบฑเปเบเบเบตเปเบฅเบฐเบเบธเปเบงเปเปเบ arguments
. เบเบปเบงเปเบ secrets.SONATYPE_USERNAME
ะธ secrets.SONATYPE_PASSWORD
เปเบซเบผเบปเปเบฒเบเบตเปเปเบกเปเบเบเบงเบฒเบกเบฅเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฒเบกเบเปเบญเบเบซเบเปเบฒเบเบตเป.
เบเบปเบเปเบเปเบฎเบฑเบเบเบฒเบเบเปเปเบชเปเบฒเบเบเบฐเบชเบฐเปเบเบเบขเบนเปเปเบเปเบเบเบเบฐเบเบดเบเบฑเบ:
เบเบณเปเบเปเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบกเบทเปเบญเบฅเบธเปเบเปเปเปเบเบทเบเบเปเบญเบเบญเบญเบเบกเบฒ
เบกเบฒเบชเปเบฒเบเปเบเบฅเป workflow เปเบเบเบเปเบฒเบเบซเบฒเบเบชเปเบฒเบฅเบฑเบ 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}}
เปเบเบฅเปเปเบกเปเบเปเบเบทเบญเบเบเบทเบเบฑเบเบเบฑเบเบญเบฑเบเบเปเบญเบเปเปเบฒ, เบเบปเบเปเบงเบฑเปเบเบเปเบฅเบฐเบเบตเบเบตเปเบกเบฑเบเบเบฐเบเบทเบเบเบฐเบเบธเปเบ. เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเบตเปเปเบกเปเบเปเบซเบเบเบฒเบเบเบญเบเบเบฒเบเบชเปเบฒเบเปเบเบฑเบเบเบตเปเบกเบตเบเบทเปเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบ v.
เบเปเบญเบเบเบตเปเบเบฐเบเปเบฒเปเบเป, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบชเบฐเบเบฑเบเบฅเบฐเบซเบฑเบ PGP เบญเบญเบเบเบฒเบเบเบงเบฒเบกเบฅเบฑเบเปเบฅเบฐเบงเบฒเบเปเบงเปเปเบเบฎเบฒเบเบเบญเบเปเบเบเบเบฒเบ, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเบฒเบเบเบญเบเบฅเบฐเบซเบฑเบเบกเบฑเบ. เบเปเปเปเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเปเบฒเบเบปเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเบเบดเปเบชเบ RELEASE_VERSION
เบเบตเปเบเบงเบเปเบฎเบปเบฒเบญเปเบฒเบเปเบเบดเบ gradle.build
เปเบเบฅเป. เบเบฑเบเบซเบกเบปเบเบเบตเปเปเบกเปเบเปเบฎเบฑเบเบขเบนเปเปเบเบเบฒเบ Prepare to publish
. เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเบเบฐเปเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบฒเบเบเบปเบงเปเบ GPG_KEY_CONTENTS, เปเบเปเบเบฑเบเปเบเบฅเป gpg, เบเบฒเบเบเบฑเปเบเบเบญเบเบฅเบฐเบซเบฑเบเปเบเบเบเบฒเบเปเบชเปเปเบเปเบเบฅเป. secret.gpg
.
เบเปเปเปเบ, เบเบงเบเปเบฎเบปเบฒเบซเบฑเบเปเบเบซเบฒเบเบปเบงเปเบเบเบดเปเบชเบ GITHUB_REF
, เบเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบเปเบฎเบฑเบเบชเบฐเบเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบเบปเบเปเบเปเบงเบฅเบฒเบเบตเปเบชเปเบฒเบเปเบเบฑเบ. เบเบปเบงเปเบเบเบตเปเบกเบตเบเบงเบฒเบกเบเปเบฝเบงเบเปเบญเบเปเบเบเปเบฅเบฐเบเบตเบเบตเป. refs/tags/v0.0.2
เบเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบญเบญเบ 11 เบเบปเบงเบญเบฑเบเบชเบญเบเบเปเบฒเบญเบดเบเปเบเบทเปเบญเปเบซเปเปเบเปเบฎเบฑเบเบชเบฐเบเบฑเบเบชเบฐเปเบเบฒเบฐ. เบเปเปเปเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบเปเบฒเบชเบฑเปเบ Gradle เบกเบฒเบเบเบฐเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบตเบเปเบเป: test publish
เบเบณเบฅเบฑเบเบเบงเบเบชเบญเบเบเบปเบเบเบฒเบเบเบณเปเบเปเปเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ Sonatype
เบซเบผเบฑเบเบเบฒเบเบเบฒเบเบเปเบญเบเบญเบญเบเบกเบฒ, เบเบฑเปเบเบเบญเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบตเปเบญเบฐเบเบดเบเบฒเบเปเบงเปเปเบเบเบฒเบเบเปเบญเบเบซเบเปเบฒเบเบงเบเบเบฐเปเบฅเบตเปเบกเบเบปเปเบ. เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เบชเปเบฒเบเบเบฒเบเบเปเบญเบ:
เบเบทเปเปเบเบฑเบเบเปเบญเบเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบ v. เบเปเบฒโเบซเบฒเบโเบงเปเบฒโ, เบซเบผเบฑเบโเบเบฒเบโเบเบฒเบโเบเบฅเบดเบโเปเบชเปโเบเบฒเบโเบเบดเบกโเปเบเบตเบโเปเบเปโ, เบเบฒเบโเปเบฎเบฑเบโเบงเบฝเบโเบชเปเบฒโเปเบฅเบฑเบโเบชเบปเบโเบเบปเบโเบชเปเบฒโเปเบฅเบฑเบโ, เบเบงเบโเปเบฎเบปเบฒโเบชเบฒโเบกเบฒเบโเปเบโเบเบตเปโ
เบงเบฑเบเบเบธเบเบนเบฎเบฒเบเบเบฒเบเบปเบเบขเบนเปเปเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ Staging. เบกเบฑเบเบเบฑเบเบเบตเบเบฒเบเบปเบเบขเบนเปเปเบเบชเบฐเบเบฒเบเบฐเปเบเบตเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบกเบฑเบเบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบเปเบญเบเบเปเบงเบเบเบปเบเปเบญเบเบเบฑเบเบชเบฐเบเบฒเบเบฐเบเบดเบเปเบเบเบเบฒเบเบเบปเบเบเบธเปเบกเบเบตเปเปเบซเบกเบฒเบฐเบชเบปเบก. เบซเบผเบฑเบโเบเบฒเบโเบเบฒเบโเบเบงเบโเบชเบญเบโเบงเปเบฒโเบเบงเบฒเบกโเบเปเบญเบโเบเบฒเบโเบเบฑเบโเบซเบกเบปเบโเปเบกเปเบโเบเบญเบโเบชเบฐโเบซเบเบญเบโ, เบเบญเบกโเปเบเบปเปเบฒโเปเบโเปเบโเบชเบฐโเบเบฒโเบเบฐโเบเบฒเบโเบเบดเบโเปเบฅเบฐโเบเปเปโเบกเบตโเบเปเปโเปเบโเบญเบตเบโเปเบฅเปเบงโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเบเบฑเบโเบเบธเบโ. เปเบเบฎเบนเบเปเบเบเบเบตเป, เบกเบฑเบเบเบฐเบชเบดเปเบเบชเบธเบเปเบ MavenCentral. เบเปเบฒเบเบฑเบเบซเบกเบปเบเปเบกเปเบเบเบต, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบปเบเบเบธเปเบก เบเบฒเบเบเปเบญเบ, เปเบฅเบฐเบเบญเบกเบเบฐเบชเบดเปเบเบชเบธเบเบขเบนเปเปเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ Sonatype.
เปเบเบทเปเบญเปเบซเปเบชเบดเปเบเบเบฐเบเบดเบเปเบเบปเปเบฒเปเบเปเบ MavenCentral, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเปเปเบซเปเบกเบฑเบเบขเบนเปเปเบเบงเบฝเบเบเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบ. เบเปเบฒเบเบเบฝเบเปเบเปเบเปเบญเบเบเบฒเบเปเบฎเบฑเบเบญเบฑเบเบเบตเปเบเบฑเปเบเบเบฝเบง, เบเบฑเปเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเปเบเบตเบเปเบเปเปเบเบฑเบเบเบฑเปเบเบเปเบฒเบญเบดเบ. เปเบเปเบงเบฅเบฒเบเปเปเบกเบฒ, เบเบตเปเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบ, เบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเบเบฐเบเบทเบ synchronized เบญเบฑเบเบเบฐเปเบเบกเบฑเบ. เบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเปเปเบเบตเบเบเบฒเบ synchronization เบชเปเบฒเบฅเบฑเบเบเปเบฒเบเบฐเปเบเบปเปเบฒเบขเปเบฒเบเปเบงเบงเบฒ, เปเบเปเบกเบฑเบเปเบเปเปเบงเบฅเบฒเบเบฐเบกเบฒเบ 5 เบกเบทเปเบชเปเบฒเบฅเบฑเบเบชเบดเปเบเบเบฐเบเบดเบเบเบตเปเบเบฐเบกเบตเบขเบนเปเปเบ MavenCentral.
เบเบฑเปเบเปเบกเปเบเบเบฑเบเบซเบกเบปเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบเบตเบเปเบเปเบชเบดเปเบเบเบฐเบเบดเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบ MavenCentral.
เบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบตเปเปเบเบฑเบเบเบฐเปเบซเบเบ
- เบเปเบฒเบเบเบทเบเบฑเบ
เบเบปเบเบเบงเบฒเบก , เบเบฝเบเปเบเปเปเบเบตเบเปเบเปเบเปเบฒเบ maven - Staging
เบเบฑเบเปเบเบฑเบเบกเปเบฝเบ Sonatype Jira Sonatype เปเบเบทเปเบญเบชเปเบฒเบเบงเบฝเบเบเบฒเบเบเบปเบงเบขเปเบฒเบ: repository เบเปเบญเบเบเบตเปเบกเบฑเบเบเบทเบเบเบฑเปเบเบเบฑเบเบซเบกเบปเบ
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com