á€áá±á¬ááºážáá«ážááœááºá áá»áœááºá¯ááºááẠGradle builder ááá¯á¡áá¯á¶ážááŒá¯á Github áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŸáááá·áº Java artifact ááᯠá¡á ááŸá¡áá¯á¶áž ááœáŸáá·áºáááºááá·áºáá¯ááºáááºážá ááºá¡á¬áž Gradle builder ááᯠá¡áá¯á¶ážááŒá¯á Sonatype Maven Central Repository ááá¯á· á¡áá®ážáááºáá±á·áá¬ááŒáá·áºááá¯áá«áááºá
áá áºáá±áá¬áááºážááŸá¬ áá¯á¶ááŸááºáá»á°ááá¯áá®áááºáááŸááá¬ááŒá±á¬áá·áº áá®áá±á¬ááºážáá«ážááá¯áá±ážááá¯á· áá¯á¶ážááŒááºáá²á·áá«áááºá ááááºážá¡áá»ááºá¡áááºá¡á¬ážáá¯á¶ážááᯠáááºážááŒá áºá¡áá»áá¯ážáá»áá¯ážá០á¡ááá¯ááºážá¡á áá áºáá¯áá»ááºážá á® á á¯áá±á¬ááºážááááºááŒá áºááŒá®ážá ááá¯á·á¡ááŒáẠáá¯á¶ážáá¡áá áºá¡áááºážááá¯ááºáá±á áááºáá° ááá¯á áá¯ááºáá² ááŒá±á¬ááºá¡á±á¬ááºááŸá¬ ááŒáá¯ááá¯áá«áááºá
Sonatype ááœáẠááá¯ááŸá±á¬ááºááŸá¯áá áºáᯠáááºáá®ážááŒááºážá
áááá¡ááá·áºááŸá¬ Sonatype Maven Central ááŸá ááá¯ááŸá±á¬ááºáá¯á¶áá
áºáᯠáááºáá®ážáááºááŒá
áºáááºá áá®á¡ááœáẠáá«ááá¯á·ááœá¬ážáááºá
á¡áááºááŒá¯ááŒá®ážáá±á¬áẠá¡áá»áááºá¡áááºááŒá¬áá±á¬á¡áá«ááœááºá áááºá GroupId ááᯠáááºáá®ážáááºááŒá áºááŒá®ážá Gradle configuration ááᯠáá±á¬ááºáá áºááá·áºááá¯á· áááºááœá¬ážááá¯ááºáá«áááºá
Gradle ááᯠááŒááºáááºááŒááºáž
á
á¬áá±ážáá±á
ááºááœááºá ááá¹áá¯ááᯠáá¯ááºáá±áá¬ááœáẠá¡áá±á¬ááºá¡áá°ááŒá
áºá
á±ááá·áº Gradle plugins áá»á¬ážááᯠáá»áœááºá¯ááºáááœá±á·áá²á·áá«á
ááááŠážáá¯á¶áž ááœááºáá»ááºáááá·áºá¡áá»ááºááŸá¬ áá¯ááºáá±ááŸá¯á¡ááœáẠSonatype á ááá¯á¡ááºáá»ááºáá»á¬ážááŒá áºáááºá áááºážááá¯á·ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááº-
- á¡áááºážá¡ááŒá
áºáá¯ááºáá»á¬ážááŸáá·áº JavaDoc ááááŸáááá¯ááºááŸá¯á ááá¯ááá¯áááºááŸá¬á áááºáá±á¬ááºááá«áááºá
-sources.jar
О-javadoc.jar
ááá¯ááºáá»á¬ážá á á¬ááœááºá á¬áááºážááœááºáá±á¬áºááŒáá¬ážááá·áºá¡ááá¯ááºážá á¡áááºážá¡ááŒá áºáá¯ááºáá»á¬áž ááá¯á·ááá¯áẠá á¬ááœááºá á¬áááºážáá»á¬ážááᯠáá±ážáá±á¬ááºááẠáááŒá áºááá¯ááºáá«áá áááºááẠá¡áá¯ááŒá¯áá¯ááºááá¯ááºáááºá-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
}
}
}
}
áá«áá¬ááŒá
áºáá«ááẠsonatypeUsername О 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
á¡áá¯á¶ážááŒá¯áá°á¡áááºá á¡á®ážáá±ážááºááᯠááá¯ááºááá·áºááŒá®áž á áá¬ážááŸááºááá¯áááºáž áááºááŸááºáá«á - áá«ááá¯á·ááœááºááŸá¬áááºá
id
command ááŒáá·áº áá»áœááºá¯ááºááá¯á·ááá±á¬á·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 áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá áá áºááá·áºááœááºážááŒááºážá
Github áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áááºáá±á¬ááºááŒá®áž á¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±ááŒááºážááᯠáá±á¬ááºáá¯á¶ážá¡ááá·áºááá¯á· áááºááœá¬ážááŒáá«á
áá¯á·á
Github Actions ááẠCI/CD á
ááºáááºáž á¡ááŒáá·áºá¡á
á¯á¶ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážááŒáá·áº á¡áá¯ááºá¡ááœá¬ážá¡áá¬ááᯠá¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááá¯ááºá
á±ááá·áº á¡ááºá¹áá«áááºáá
áºáá¯ááŒá
áºáááºá áááºáá±á¬ááºááŒááºážá á
ááºážáááºááŒááºážááŸáá·áº á¡áá¯á¶ážáá»ááŒááºážááá¯á·ááᯠá¡áá»áá¯ážáá»áá¯ážáá±á¬ááŒá
áºáááºáá»á¬ážá០á¡á
áá»áá¯ážááá¯ááºáááº- áá¯ááºááœááºážááŒááºážá áá¯ááºááœáŸááºááŒááºáž ááá¯á·ááá¯áẠááŒá¿áá¬áá»á¬ážá á€áá¯ááºáá±á¬ááºáá»ááºááẠá¡áá»á¬ážáá°ááŸá¬ ááá¯ááŸá±á¬ááºáá°áá»á¬ážá¡ááœáẠáá¯á¶ážáá¡ááá²á·ááŒá
áºáááºá
á€ááá¹áááœááºá áááºáá±á¬ááºáá¯á¶ááŸáá·áº ááœááºážááá¯á·ááá·áºáá¯ááºááᯠáááºááŸááºáááºááŸáá·áº áá¯ááºáá±ááŸá¯ááœáẠSonatype repository ááœáẠá¡áá¯á¶ážáá»áááºážá¡ááŒáẠáá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážááᯠá áá áºááá·áºááœááºážááẠááá·áºá¡á¬áž áá«ááŒááá«áááºá
áá»áŸáá¯á·ááŸááºáá»ááºááœá± áá¬ážáá²á·ááŒáááºá
á¡ááá¯á¡áá»á±á¬ááºá á¯áá±ážááŒááºážááŸáá·áº á¡áá¯á¶ážáá»ááŒááºážá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬á·á¡áá¯ááºáá®á áá±á¬á·ááá¯áááºáá®ážáá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááá·áºááœááºážáá²á·ááá·áº á áá¬ážááŸááºá PGP áá±á¬á·ááá¯ááºááá¯ááºááŸáá·áº Sonatype á¡áá±á¬áá·áºáááº/á áá¬ážááŸááºáá²á·ááá¯á·áá±á¬ áá»áŸáá¯á·ááŸááºáááºááá¯ážáá»á¬ážá áœá¬ ááá¯á¡ááºáá«áááºá ááá¯ááŸá±á¬ááºááŸá¯áááºáááºáá»á¬ážááœáẠáááºážááá¯á·ááᯠá¡áá°ážááá¹ááá áºáá¯ááœáẠáááºáááºááŸááºááá¯ááºáááº-
áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá«ááááºážááŸááºáá»á¬ážááᯠáááºááŸááºáááº-
- SONATYPE_USERNAME / SONATYPE_PASSWORD - Sonatype ááŒáá·áº ááŸááºáá¯á¶áááºááá·áºá¡áá« áá»áœááºá¯ááºááá¯á·ááá·áºááœááºážáá¬ážáá±á¬ á¡áá±á¬áá·áºáááº/á áá¬ážááŸááº
- SIGNING_KEYID/SIGNING_PASSWORD â PGP áá±á¬á·á¡áá¯ááºáá®ááŸáá·áº á áá¬ážááŸááºááᯠáá»áá¯ážáááºá¡ááœááºáž áááºááŸááºáá¬ážáááºá
áá»áœááºá¯ááºááẠGPG_KEY_CONTENTS ááááºážááŸááºá¡á¬áž á¡áá±ážá
áááºáá±á¬áºááŒááá¯áá«áááºá á¡ááŸááºááŸá¬ áá¯ááºáá±áááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá®ážááá·áº PGP áá±á¬á·áá
áºáᯠááá¯á¡ááºáá«áááºá á¡á²áá«ááᯠáá»áŸáá¯á·ááŸááºáá»ááºááŸá¬ áááºááá¯á·á¡ááœáẠáá»áœááºáá±á¬áºáá¯á¶ážáááºá
- áá»áœááºá¯ááºááá¯á·ááá±á¬á·ááᯠgpg ááŒáá·áº á
á¬ááŸááºááá¯ááºááŒáá«á
áá¯á·á
gpg --symmetric --cipher-algo AES256 9B695056.gpg
á áá¬ážááŸááºáá áºáá¯ááá·áºááŒááºážááŒáá·áºá áááºážááᯠvariable ááœáẠáá¬ážááá·áºáááº- 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 ááá¯á¡áá¯á¶ážááŒá¯áᬠGradle á¡ááœáẠplugin ááá¯áááºážá¡áá¯á¶ážááŒá¯áááºááŒá
áºáááºá eskatos/gradle-command-action@v1
builder ááá±á¬ááºáá¯á¶ážááœááºáá¬ážááŸááºážááá¯á¡áá¯á¶ážááŒá¯á áááºážáááºáááºááŸááºáá¬ážáá±á¬ command áá»á¬ážááᯠrun áááá·áºáááºá arguments
. ááááºážááŸááºáá»á¬áž secrets.SONATYPE_USERNAME
О secrets.SONATYPE_PASSWORD
áá«ááœá±á áá»áœááºáá±á¬áºááá¯á· á
á±á¬á
á±á¬á áá±ážáá²á·áá²á· áá»áŸáá¯á·ááŸááºáá»ááºááœá±áá«á
áááºáá±á¬ááºááŸá¯ááááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá»ááºáááºááœáẠáááºáááºá á±áááá·áºáááº-
á¡áá áºááœááºááŸááá±á¬á¡áá«ááœáẠá¡ááá¯á¡áá»á±á¬áẠááŒáá·áºáá»ááºáá«á
autodeploy á¡ááœáẠáá®ážááŒá¬áž workflow ááá¯ááºááᯠáááºáá®ážááŒáá«á
áá¯á· 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 variable ááŸáááŸáááŒá®ážá áááºážááᯠgpg ááá¯ááºá¡ááŒá
Ạáá¬áá¬ááŒááºááŒá®ážáá±á¬áẠáááºážááᯠááá¯ááºááœááºááá·áºááŒááºážááŒáá·áº áááºážááᯠá
á¬ááŸááºáá« secret.gpg
.
ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá°ážááááºážááŸááºáá
áºáá¯ááá¯á· ááŒá±á¬ááºážáááºá GITHUB_REF
áááºáááºáá®ážáá±á¬á¡áá«ááœáẠáá»áœááºá¯ááºááá¯á·áááºááŸááºáá¬ážááá·áº áá¬ážááŸááºážááᯠáááŸáááá¯ááºáááºá á€ááááºážááŸááºááẠá€ááá
á¹á
ááœááºáááºááá¯ááºáá«áááºá refs/tags/v0.0.2
áááá»áá²á·áá¬ážááŸááºážáá
áºáá¯áááá¯á· ááááá¯á¶áž á
á¬áá¯á¶áž áá áá¯á¶ážááᯠááŒááºáá±á¬ááºááá¯ááºáá«áááºá ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá±áááºá¡ááœáẠá
ᶠGradle ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááº- test publish
Sonatype repository ááœáẠááŒáá·áºáá»ááºááŸá¯ááááºáá»á¬ážááᯠá á áºáá±ážááŒááºážá
áá¯ááºáá±ááŸá¯ááᯠáááºáá®ážááŒá®ážáááºááŸáá·áºá ááááºááá¹áááœáẠáá±á¬áºááŒáá¬ážáá±á¬ á¡áá¯ááºá¡ááœá¬ážá¡áᬠá áááºááá·áºáááºá áá«ááá¯áá¯ááºááá¯á·á áá¯ááºáá±ááŸá¯ááᯠáááºáá®ážáá«-
tag á¡áááºááẠv ááŒáá·áº á
áááºááá«áááºá áá¯ááºáá±ááŒáá·áºáá»áááŸá¯ááᯠááŸáááºááŒá®ážáá±á¬ááºá á¡áá¯ááºá¡ááœá¬ážá¡áᬠá¡á±á¬ááºááŒááºá
áœá¬ááŒá®ážáá¯á¶ážáá«áá áá»áœááºá¯ááºááá¯á·áá¶ááá¯á· ááœá¬ážááá¯ááºáá«áááºá
áá á¹á ááºážááẠStaging repository ááœáẠáá±á«áºáá¬áááºá áááºážááẠOpen status ááœáẠáá»ááºááŒááºážáá±á«áºáá¬ááŒá®áž ááá·áºáá»á±á¬áºáá±á¬ááá¯ááºááá¯ááŸáááºááŒááºážááŒáá·áº áááºážá¡á¬áž Close status ááá¯á· ááá¯ááºááá¯ááºááœáŸá²ááŒá±á¬ááºážááááºááŒá áºáááºá ááá¯á¡ááºáá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŒáá·áºáá®ááŒá±á¬ááºáž á á áºáá±ážááŒá®ážáá±á¬ááºá ááŸá±ážáá±á¬ááºážáá á¹á ááºážááẠááááºááá·áºá¡ááŒá±á¡áá±ááá¯á· áá±á¬ááºááœá¬ážáᬠááŒá¯ááŒááºááœááºážáá¶ááẠáááŸááá±á¬á·áá«á á€áá¯á¶á á¶ááœááºá áááºážááẠMavenCentral ááœááºá¡áá¯á¶ážáááºáááºááŒá áºáááºá á¡á¬ážáá¯á¶ážá¡áááºááŒá±ááẠááá¯ááºááá¯ááŸáááºááá¯ááºáá«áááºá ááœáŸááºáá±ážá ááŸáá·áº ááŸá±ážáá±á¬ááºážáá á¹á ááºážááẠSonatype ááá¯ááŸá±á¬ááºááŸá¯ááœáẠá¡áá¯á¶ážáááºáááºááŒá áºáááºá
áá á¹á ááºážááᯠMavenCentral ááá¯á·áááºáá±á¬ááºááá¯ááºáááºá á¡á ááá¯ááºážááœáẠáá»áœááºá¯ááºááá¯á·áááºáá®ážáá²á·ááá·áº á¡áá¯ááºááœáẠáááºážááᯠáááºáá±á¬ááºážááá¯áááºááá¯á¡ááºáá«áááºá á€á¡áá¬ááᯠáááºáá áºááŒáááºáᬠááŒá¯áá¯ááºááẠááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠááááá¯á¶ážá¡ááŒááẠáá¯ááºáá±áá«áááºá áá±á¬ááºááá¯ááºážá¡áá»áááºáá»á¬ážááœááºá áááºážááá¯áááá¯á¡ááºáá«á á¡áá¬á¡á¬ážáá¯á¶ážá¡ááá¯á¡áá»á±á¬ááºáááºáá°ááŒá¯áááá·áºáááºá áááºážááá¯á·ááẠáá»áœááºá¯ááºá¡ááœáẠáá»ááºááŒááºá áœá¬ áááºáá°ááŒá¯ááŒááºážá¡á¬áž ááœáá·áºáá¬ážáá±á¬áºáááºáž MavenCentral ááœáẠáá á¹á ááºážáááŸáááá¯ááºááẠá áááºááá·áº á¡áá»áááºáá°áá²á·ááááºá
áá«áá«áá²á áá»áœááºáá±á¬áºááá¯á·áᬠMavenCentral ááŸá¬ áá»áœááºá¯ááºááá¯á·áá²á· ááŸá±ážáá±á¬ááºážáá á¹á ááºážááᯠáá¯ááºáá±áá²á·áá«áááºá
á¡áá¯á¶ážáááºáá±á¬ááá·áºáá»á¬áž
- áá¯á¶á
á¶áá°
áá±á¬ááºážáá«áž maven ááŸáááá·áºáá¬áá¯ááºáá±áááºá - á
ááº
ááá¯ááŸá±á¬ááºááŸá¯ Sonatype Jira á¡áá¯ááºáá áºáá¯ááá¯áááºáá®ážááẠSonatypeááá°áᬠááá¯ááŸá±á¬ááºáá¬áá±áá¬á¡á¬ážáá¯á¶ážááœáẠááá·áºááœááºážáá¬ážáááºá
source: www.habr.com