Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ Ρ ΠΎΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Ρ Π½ΡΠ»Ρ Java Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ° ΡΠ΅ΡΠ΅Π· Github Actions Π² Sonatype Maven Central Repository ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ±ΠΎΡΡΠΈΠΊ Gradle.
ΠΠ°Π½Π½ΡΡ ΡΡΠ°ΡΡΡ ΡΠ΅ΡΠΈΠ» Π½Π°ΠΏΠΈΡΠ°ΡΡ Π²Π²ΠΈΠ΄Ρ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΡΠΎΡΠΈΠ°Π»Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅. ΠΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΠΏΠΎ ΠΊΡΡΠΊΠ°ΠΌ ΠΈΠ· ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ², ΠΏΡΠΈ ΡΠΎΠΌ, Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ²Π΅ΠΆΠΈΡ . ΠΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, Π΄ΠΎΠ±ΡΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² Sonatype
ΠΠ΅ΡΠ²ΡΠΌ ΡΡΠ°ΠΏΠΎΠΌ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π² Sonatype Maven Central. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΠ΄Π΅ΠΌ
Π§Π΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π²Π°Ρ GroupId Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΠ°Π³Ρ, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Gradle.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΠΌ Gradle
ΠΠ° ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°ΡΡΠΈ Ρ Π½Π΅ Π½Π°ΡΠ΅Π» ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π΄Π»Ρ Gradle, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΠΎΠΌΠΎΡΡ Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ°.
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΠΈΡΡ, ΡΡΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ Sonatype Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ. ΠΠ½ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅:
- ΠΠ°Π»ΠΈΡΠΈΠ΅ ΠΈΡΡ
ΠΎΠ΄Π½ΡΡ
ΠΊΠΎΠ΄ΠΎΠ² ΠΈ JavaDoc, Ρ.Π΅. Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ
-sources.jar
ΠΈ-javadoc.jar
ΡΠ°ΠΉΠ»Ρ. ΠΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π΅ΡΠ»ΠΈ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΊΠΎΠ΄Ρ ΠΈΠ»ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΡΡΡΡΠΊΡ-sources.jar
ΠΈΠ»ΠΈ-javadoc.jar
c ΠΏΡΠΎΡΡΡΠΌ 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 ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌ ΠΏΠ»Π°Π³ΠΈΠ½ 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
, Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, 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. Π‘Π±ΠΎΡΠΊΠ°, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ: ΠΏΡΡΠΈΠ½Π³ ΠΊΠΎΠ΄Π°, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈΠ·Π° ΠΈΠ»ΠΈ 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
ΠΈ testing
, ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠ»Π» ΡΠ΅ΠΊΠ²Π΅ΡΡΠΎΠ².
Π ΡΠ΅ΠΊΡΠΈΠΈ 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: 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. ΠΡΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ Π½Π°ΠΆΠ°ΡΠΈΡ Publish release, ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΉΡΠΈ Π²
ΠΡΡΠ΅ΡΠ°ΠΊΡ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π² Staging ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ. Π‘ΡΠ°Π·Ρ ΠΎΠ½ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΡΠ°ΡΡΡΠ΅ Open, Π΄Π°Π»Π΅Π΅ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ Π² ΡΡΠ°ΡΡΡ Close, Π½Π°ΠΆΠ°Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ. ΠΠΎΡΠ»Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ Π² ΡΡΠ°ΡΡΡ Close ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. Π ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΎΠ½ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ Π² MavenCentral. ΠΡΠ»ΠΈ Π²ΡΠ΅ Ρ ΠΎΡΠΎΡΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΆΠ°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ Release, ΠΏΡΠΈ ΡΡΠΎΠΌ Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Sonatype.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΠΏΠΎΠΏΠ°Π» Π² MavenCentral, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ ΠΎΠ± ΡΡΠΎΠΌ Π² Π·Π°Π΄Π°ΡΠ΅, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅. Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΡΠ°ΠΊ ΠΌΡ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·. Π ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π·Ρ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, Π²ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. ΠΠΊΠ»ΡΡΠΈΠ»ΠΈ ΠΌΠ½Π΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π±ΡΡΡΡΠΎ, Π½ΠΎ ΡΡΠΎΠ±Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΡΡΠ°Π» Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² MavenCentral ΠΏΡΠΎΡΠ»ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 5 Π΄Π½Π΅ΠΉ.
ΠΠ° ΡΡΠΎΠΌ Π²ΡΠ΅, ΠΌΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ Π½Π°Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡ Π² MavenCentral.
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ
- ΠΠΎΡ
ΠΎΠΆΠ°Ρ
ΡΡΠ°ΡΡΡ , ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· maven - Staging
ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Sonatype Jira Sonatype, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π·Π°Π΄Π°ΡΡΠΡΠΈΠΌΠ΅Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π³Π΄Π΅ ΡΡΠΎ Π²ΡΠ΅ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΎ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com