Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ ΠΎΡ Π½ΡΠ»Π°ΡΠ° Π½Π° Java Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΡΡΠ΅Π· Github Actions Π² Sonatype Maven Central Repository, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Gradle.
Π Π΅ΡΠΈΡ Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π»ΠΈΠΏΡΠ²Π°ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»Π΅Π½ ΡΡΡΠΎΡΠΈΠ°Π» Π½Π° Π΅Π΄Π½ΠΎ ΠΌΡΡΡΠΎ. Π¦ΡΠ»Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π±Π΅ΡΠ΅ ΡΡΠ±ΠΈΡΠ°Π½Π° Π½Π° ΡΠ°ΡΡΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ, ΠΊΠ°ΡΠΎ Π½Π΅ Π±ΡΡ Π° ΡΡΠ²ΡΠ΅ΠΌ Π°ΠΊΡΡΠ°Π»Π½ΠΈ. ΠΠ° ΠΊΠΎΠ³ΠΎΡΠΎ ΠΌΡ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, Π΄ΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»ΠΈ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² Sonatype
ΠΡΡΠ²Π°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π² Sonatype Maven Central. ΠΠ° ΡΠ΅Π»ΡΠ° ΠΎΡΠΈΠ²Π°ΠΌΠ΅ , ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ΅ ΠΈ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π½ΠΎΠ²Π° Π·Π°Π΄Π°ΡΠ° Ρ ΠΌΠΎΠ»Π±Π° Π΄Π° Π½ΠΈ ΡΡΠ·Π΄Π°Π΄Π°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. ΠΡΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π½Π°ΡΠΈΡ GroupId ΠΏΡΠΎΠ΅ΠΊΡ, URL Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π»ΠΈΠ½ΠΊ ΠΊΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ SCM url Π»ΠΈΠ½ΠΊ ΠΊΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΡΡ. GroupId ΡΡΠΊ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ ΠΎΡ Π²ΠΈΠ΄Π° com.example, com.example.domain, com.example.testsupport, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π»ΠΈΠ½ΠΊ ΠΊΡΠΌ Π²Π°ΡΠΈΡ GitHub: -> io.github.yourusername. ΠΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠ²ΡΡΠ΄ΠΈΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎΡΡΡΠ° Π½Π° Π΄ΠΎΠΌΠ΅ΠΉΠ½Π° ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠΈΠ»Π°. ΠΠΊΠΎ ΡΡΠ΅ ΠΏΠΎΡΠΎΡΠΈΠ»ΠΈ ΠΏΡΠΎΡΠΈΠ» Π² GitHub, ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ»ΡΡ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ Π½ΡΠΆΠ½ΠΎΡΠΎ ΠΈΠΌΠ΅.
Π‘Π»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ»Π΅Π΄ ΠΏΠΎΡΠ²ΡΡΠΆΠ΄Π°Π²Π°Π½Π΅ΡΠΎ, Π²Π°ΡΠΈΡΡ GroupId ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ°, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Gradle.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ Gradle
ΠΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° Π½Π΅ Π½Π°ΠΌΠ΅ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ Π·Π° Gradle, ΠΊΠΎΠΈΡΠΎ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ Ρ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡ. Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡΡ ΠΏΠ»ΡΠ³ΠΈΠ½, ΠΊΠΎΠΉΡΠΎ Π½Π°ΠΌΠ΅ΡΠΈΡ , ΠΎΠ±Π°ΡΠ΅ Π°Π²ΡΠΎΡΡΡ ΡΠ΅ ΠΎΡΠΊΠ°Π·Π° ΠΎΡ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°. ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ Π²ΡΠΈΡΠΊΠΎ ΡΠ°ΠΌ, Π±Π»Π°Π³ΠΎ Π½Π΅ Π΅ ΠΏΡΠ΅ΠΊΠ°Π»Π΅Π½ΠΎ ΡΡΡΠ΄Π½ΠΎ.
ΠΡΡΠ²ΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΡΠ½ΠΈΠΌ, Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π½Π° Sonatype Π·Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅. Π’Π΅ ΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅:
- ΠΠ°Π»ΠΈΡΠΈΠ΅ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ ΠΈ JavaDoc, Ρ.Π΅. ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΈΡΡΡΡΠ²Π°Ρ
-sources.jarΠΈ-javadoc.jarΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ°, Π°ΠΊΠΎ Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ ΠΈΠ»ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΡΡΡΠΎΡΠ»ΠΎΠ²ΠΈΠ΅-sources.jarΠΈΠ»ΠΈ-javadoc.jarc Ρ ΠΏΡΠΎΡΡ README Π²ΡΡΡΠ΅, Π·Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ°. - ΠΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π°
GPG/PGP, ΠΈ.ascΡΠ°ΠΉΠ», ΡΡΠ΄ΡΡΠΆΠ°Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ°ΠΉΠ». - ΠΠ°Π»ΠΈΡΠΈΠ΅ΡΠΎ
pomΡΠ°ΠΉΠ»Π° - ΠΠΎΡΠ΅ΠΊΡΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ
groupId,artifactIdΠΈversion. ΠΠ΅ΡΡΠΈΡΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π½ΠΈΠ· ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π²ΡΡΡΠ²Π°-SNAPSHOT - ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΅ ΠΏΡΠΈΡΡΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π°
ΠΈΠΌΠ΅,ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΈ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 'ΠΠ΅ΠΊΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ°'
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 'ΠΠΈΡΠ΅Π½Π· Π½Π° Apache, Π²Π΅ΡΡΠΈΡ 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@dev.ru'
}
}
}
}
}Π‘Π»Π΅Π΄Π²Π° Π΄Π° ΡΠΏΠΎΠΌΠ΅Π½Π΅ΠΌ, ΡΠ΅ ΠΏΡΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ -sources.jar ΠΈ-javadoc.jar ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ° ΡΠ΅Π»ΡΠ° Π² ΡΠ΅ΠΊΡΠΈΡΡΠ° java ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
java {
withJavadocJar()
withSourcesJar()
}ΠΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ ΠΊΡΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅, Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° GPG/PGP ΠΏΠΎΠ΄ΠΏΠΈΡΠ°. ΠΠ° ΡΠ΅Π»ΡΠ° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ»ΡΠ³ΠΈΠ½ 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 'Artifact 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'
}
}
}
}
}ΠΡΠΊΠ°ΠΌ Π΄Π° ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ°, ΡΠ΅ Π²Π΅ΡΡΠΈΡΡΠ° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΎΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°: System.getenv('RELEASE_VERSION'). Π©Π΅ Ρ Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΠΈ ΡΠ΅ Ρ Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΎΡ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ°Π³Π°.
ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° PGP ΠΊΠ»ΡΡ
ΠΠ΄Π½ΠΎ ΠΎΡ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π½Π° Sonatype Π΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° GPG/PGP ΠΊΠ»ΡΡ. ΠΠ° ΡΠ΅Π»ΡΠ° ΠΎΡΠΈΠ²Π°ΠΌΠ΅ ΠΈ ΡΠ²Π°Π»ΡΠΌΠ΅ ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° GnuPG Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°.
- ΠΠ΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ»ΡΡΠΎΠ²Π° Π΄Π²ΠΎΠΉΠΊΠ°:
gpg --gen-key, Π²ΡΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΈΠΌΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΠΈΠΌΠ΅ΠΉΠ», ΠΊΠ°ΠΊΡΠΎ ΠΈ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΠ°ΡΠΎΠ»Π°. - Π£ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅
ΠΈΠ΄Π½Π°ΡΠΈΡ ΠΊΠ»ΡΡ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:gpg --list-secret-keys --keyid-format short. Id-ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ ΡΠ»Π΅Π΄ Π½Π°ΠΊΠ»ΠΎΠ½Π΅Π½Π°ΡΠ° ΡΠ΅ΡΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: rsa2048/9B695056 - ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌΠ΅ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΈΡ ΠΊΠ»ΡΡ Π½Π° ΡΡΡΠ²ΡΡΠ° Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
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. Π‘Π±ΠΎΡΠΊΠ°ΡΠ°, ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π°Π½Π΅ΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΠ°Π½ΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ±ΠΈΡΠΈΡ: ΠΏΡΠΈΠΊΠ°ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄, ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π»ΠΈΠ· ΠΈΠ»ΠΈ issues. Π’Π°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½Π° Π·Π° ΠΏΡΠ±Π»ΠΈΡΠ½ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
Π ΡΠΎΠ·ΠΈ ΡΠ°Π·Π΄Π΅Π» ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΡΠ±ΠΎΡΠΊΠ°ΡΠ° ΠΈ ΡΠ°Π·ΠΏΡΠ°ΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π°Π½Π΅ΡΠΎ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π½Π° Sonatype ΠΏΡΠΈ ΠΈΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π»ΠΈΠ·, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° ΡΠ°ΠΉΠ½ΠΈ.
ΠΠ°Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ°ΠΉΠ½ΠΈ
ΠΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Π° ΡΠ±ΠΎΡΠΊΠ° ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΏΠΎΡΠ΅Π΄ΠΈΡΠ° ΠΎΡ ΡΠ°ΠΉΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΠΊΠ°ΡΠΎ id Π½Π° ΠΊΠ»ΡΡΠ°, ΠΏΠ°ΡΠΎΠ»Π°ΡΠ°, ΠΊΠΎΡΡΠΎ Π²ΡΠ²Π΅Π΄ΠΎΡ ΠΌΠ΅ ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»ΡΡΠ°, ΡΠ°ΠΌΠΈΡΡ PGP ΠΊΠ»ΡΡ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π»ΠΎΠ³ΠΈΠ½/ΠΏΠ°ΡΠΎΠ»Π° Π·Π° Sonatype. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ Π·Π°Π΄Π°Π΄Π΅ΠΌ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΡΠ°Π·Π΄Π΅Π» Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ:

ΠΠ°Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ:
- SONATYPE_USERNAME/SONATYPE_PASSWORD β Π»ΠΎΠ³ΠΈΠ½/ΠΏΠ°ΡΠΎΠ»Π°, ΠΊΠΎΠΈΡΠΎ Π²ΡΠ²Π΅Π΄ΠΎΡ ΠΌΠ΅ ΠΏΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡΡΠ° Π² Sonatype
- SIGNING_KEYID/SIGNING_PASSWORD β id Π½Π° PGP ΠΊΠ»ΡΡΠ° ΠΈ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ°, Π·Π°Π΄Π°Π΄Π΅Π½Π° ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ.
ΠΡΠΊΠ°ΠΌ Π΄Π° ΠΎΠ±ΡΡΠ½Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° GPG_KEY_CONTENTS. Π€Π°ΠΊΡ Π΅, ΡΠ΅ Π·Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ΡΠΎ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π·Π°ΡΠ²ΠΎΡΠ΅Π½ PGP ΠΊΠ»ΡΡ. ΠΠ° Π΄Π° Π³ΠΎ ΠΏΠΎΡΡΠ°Π²Ρ Π² ΡΠ°ΠΉΠ½ΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·Π²ΡΡΡΠΈΡ ΡΠ΅Π΄ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
- Π¨ΠΈΡΡΠΎΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΈΡ ΠΊΠ»ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° gpg:
gpg --symmetric --cipher-algo AES256 9B695056.gpg, Π²ΡΠ²Π΅ΠΆΠ΄Π°ΠΉΠΊΠΈ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ°. Π’Ρ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½Π° Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ°: SECRET_PASSPHRASE - ΠΡΠ΅Π²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠΎΠ²Π°Π½ ΠΊΠ»ΡΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠΎΡΠΌΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° 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 ΠΈ ΡΠ΅ΡΡ, ΡΡΡΠΎ ΠΈ ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° pull request.
Π ΡΠ΅ΠΊΡΠΈΡΡΠ° jobs ΡΠ° ΡΠΊΠ°Π·Π°Π½ΠΈ ΡΡΡΠΏΠΊΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΡ ΠΏΡΠΈ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΡΠ±ΠΈΡΠΈΡ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ ΡΠ±ΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ubuntu, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Java 8, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Gradle eskatos/gradle-command-action@v1, ΠΊΠΎΠΉΡΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ±ΠΎΡΡΠΈΠΊΠ°, ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅, ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ Π² arguments. ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ secrets.SONATYPE_USERNAME ΠΈ secrets.SONATYPE_PASSWORD ΡΠΎΠ²Π° ΡΠ° ΡΠ°ΠΉΠ½ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π·Π°Π΄Π°Π΄ΠΎΡ
ΠΌΠ΅ ΠΏΠΎ-ΡΠ°Π½ΠΎ.
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΎΡΡΠ°Π·ΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π° Actions:

ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΠΏΡΠΈ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ
ΠΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΡΠ°ΠΉΠ» Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ gradle-ci-publish.yml:
name: publish
on:
push:
tags:
- 'v*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° JDK 8
uses: actions/setup-java@v1
with:
java-version: 8
- name: ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π·Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅
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: ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ Ρ 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. ΠΠΊΠΎ ΡΠ»Π΅Π΄ Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ Π½Π° Publish release ΡΠ°Π±ΠΎΡΠ½ΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ ΡΡΠΏΠ΅Π΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²Π»Π΅Π·Π΅ΠΌ Π² Π·Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ Π² ΡΠΎΠ²Π°:

ΠΡΡΠ΅ΡΠ°ΠΊΡ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π² Staging ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ. ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠΎΠΉ Π΅ Π² ΡΡΠ°ΡΡΡ Open, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° ΡΡΡΠ½ΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»Π΅Π½ Π² ΡΡΠ°ΡΡΡ Close, ΠΊΠ°ΡΠΎ ΡΠ΅ Π½Π°ΡΠΈΡΠ½Π΅ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΡ Π±ΡΡΠΎΠ½. Π‘Π»Π΅Π΄ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡ, Π°ΡΡΠ΅ΡΠ°ΠΊΡΡΡ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° Π² ΡΡΠ°ΡΡΡ Close ΠΈ Π²Π΅ΡΠ΅ Π½Π΅ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π·Π° ΠΏΡΠΎΠΌΡΠ½Π°. Π ΡΠ°ΠΊΡΠ² Π²ΠΈΠ΄ ΡΠΎΠΉ ΡΠ΅ ΠΏΠΎΠΏΠ°Π΄Π½Π΅ Π² MavenCentral. ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄, ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ Π±ΡΡΠΎΠ½Π° Release, ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡΡ ΡΠ΅ Π²Π»Π΅Π·Π΅ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Sonatype.
ΠΠ° Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π½Π΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡΡ Π² MavenCentral, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΈΡΠΊΠ°ΠΌΠ΅ ΡΠΎΠ²Π° Π² Π·Π°Π΄Π°ΡΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ Π² ΡΠ°ΠΌΠΎΡΠΎ Π½Π°ΡΠ°Π»ΠΎ. Π’ΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌΠ΅ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ. ΠΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ. Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡΡΠ° Π±Π΅ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π° Π±ΡΡΠ·ΠΎ, Π½ΠΎ Π·Π° Π΄Π° ΡΡΠ°Π½Π΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² MavenCentral, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Ρ Π° ΠΎΠΊΠΎΠ»ΠΎ 5 Π΄Π½ΠΈ.
Π‘ ΡΠΎΠ²Π° ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°ΠΌΠ΅, ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ ΠΌΠ΅ Π½Π°ΡΠΈΡ Π°ΡΡΠ΅ΡΠ°ΠΊΡ Π² MavenCentral.
ΠΠΎΠ»Π΅Π·Π½ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Π΅
- ΠΠΎΠ΄ΠΎΠ±Π½Π° , ΡΠ°ΠΌΠΎ ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π΅ ΠΏΡΠ΅Π· maven
- Staging Sonatype
- Sonatype, Π² ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ Π·Π°Π΄Π°ΡΠ°
- ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΎ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
