рдпрд╕ рд▓реЗрдЦрдорд╛, рдо Gradle рдмрд┐рд▓реНрдбрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Sonatype Maven рдХреЗрдиреНрджреНрд░реАрдп рднрдгреНрдбрд╛рд░рдорд╛ Github рдХрд╛рд░реНрдпрд╣рд░реВ рдорд╛рд░реНрдлрдд рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рдЬрд╛рднрд╛ рдХрд▓рд╛рдХреГрддрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ рд╡рд┐рд╕реНрддреГрдд рд░реВрдкрдорд╛ рд╣реЗрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред
рдПрдХреИ рдард╛рдЙрдБрдорд╛ рд╕рд╛рдорд╛рдиреНрдп рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рдХреЛ рдХрдореАрдХреЛ рдХрд╛рд░рдг рдореИрд▓реЗ рдпреЛ рд▓реЗрдЦ рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред рд╕рдмреИ рдЬрд╛рдирдХрд╛рд░реАрд╣рд░реВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ рдЯреБрдХреНрд░рд╛ рдЯреБрдХреНрд░рд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреБрдкрд░реНрдереНрдпреЛ, рдпрд╕рдмрд╛рд╣реЗрдХ, рдкреВрд░реНрдг рд░реВрдкрдорд╛ рддрд╛рдЬрд╛ рдЫреИрдиред рдХрд╕рд▓рд╛рдИ рдЦреНрдпрд╛рд▓ рдЫ, рдмрд┐рд░рд╛рд▓реЛ рдЕрдиреНрддрд░реНрдЧрдд рд╕реНрд╡рд╛рдЧрдд рдЫред
Sonatype рдорд╛ рдПрдХ рднрдгреНрдбрд╛рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ
рдкрд╣рд┐рд▓реЛ рдЪрд░рдг рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдорд╛рднреЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рднрдгреНрдбрд╛рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБ рд╣реЛред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рдЬрд╛рдиреНрдЫреМрдВ
рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдкрдЫрд┐ рдХреЗрд╣рд┐ рд╕рдордп рдкрдЫрд┐, рддрдкрд╛рдЗрдБрдХреЛ GroupId рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреЗрдЫ рд░ рд╣рд╛рдореА рдЕрд░реНрдХреЛ рдЪрд░рдг, Gradle рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдЬрд╛рди рд╕рдХреНрдЫреМрдВред
Gradle рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрджреИ
рд▓реЗрдЦреНрдиреЗ рд╕рдордпрдорд╛, рдореИрд▓реЗ рдХрд▓рд╛рдХреГрддрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдиреЗ Gradle рдкреНрд▓рдЧрдЗрдирд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реЗрдиред
рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреЗ рдкрд╣рд┐рд▓реЛ рдХреБрд░рд╛ рднрдиреЗрдХреЛ рдкреНрд░рдХрд╛рд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рд╕реЛрдирд╛рдЯрд╛рдЗрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рд╣реЛред рддрд┐рдиреАрд╣рд░реВ рдирд┐рдореНрди рд╣реБрдиреН:
- рд╕реНрд░реЛрдд рдХреЛрдб рд░ 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 рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ рдЕрдиреНрддрд┐рдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдорд╛ рдЬрд╛рдФрдВред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдкреНрд▓рдЧрдЗрди рдЬрдбрд╛рди рдЧрд░реНрдиреБрд╣реЛрд╕реН 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
, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдЗ-рдореЗрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рдкрд╛рд╕рд╡рд░реНрдб рдкрдирд┐ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред - рд╣рд╛рдореА рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдБрдЫреМрдВ
id
рдЖрджреЗрд╢ рд╕рдВрдЧ рд╣рд╛рдореНрд░реЛ рдХреБрдЮреНрдЬреА:gpg --list-secret-keys --keyid-format short
ред рдЖрдИрдбреА рд╕реНрд▓реНрдпрд╛рд╢ рдкрдЫрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдиреЗрдЫ, рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА: 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 рдХрд╛рд░реНрдпрд╣рд░реВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реЛ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреВрд░реНрдг CI / CD рдЪрдХреНрд░ рд▓рд╛рдЧреВ рдЧрд░реЗрд░ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдирд┐рд░реНрдорд╛рдг, рдкрд░реАрдХреНрд╖рдг, рд░ рддреИрдирд╛рддреА рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдирд╛рд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ: рдХреЛрдб рдкреБрд╢, рд░рд┐рд▓реАрдЬ рд╕рд┐рд░реНрдЬрдирд╛, рд╡рд╛ рдореБрджреНрджрд╛рд╣рд░реВред рдпреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдгреНрдбрд╛рд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдирд┐рдГрд╢реБрд▓реНрдХ рдЫред
рдпрд╕ рдЦрдгреНрдбрдорд╛, рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХрд╕рд░реА рдмрд┐рд▓реНрдб рд░ рдкреБрд╢ рдХреЛрдб рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рд░ рд░рд┐рд▓реАрдЬрдорд╛ рд╕реЛрдирд╛рдЯрд╛рдЗрдк рднрдгреНрдбрд╛рд░рдорд╛ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреЗ, рд╕рд╛рдереИ рдЧреЛрдкреНрдпрд╣рд░реВ рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБред
рд╣рд╛рдореАрд▓реЗ рдЧреЛрдкреНрдп рд░рд╛рдЦреНрдпреМрдВ
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд╕реЗрдореНрдмреНрд▓реА рд░ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓рд╛рдИ рдзреЗрд░реИ рдЧреЛрдкреНрдп рдорд╛рдирд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫ, рдЬрд╕реНрддреИ рдХрд┐ рдХреБрдЮреНрдЬреА рдЖрдИрдбреА, рдХреБрдЮреНрдЬреА рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрд╛ рд╣рд╛рдореАрд▓реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реЗрдХреЛ рдкрд╛рд╕рд╡рд░реНрдб, PGP рдХреБрдЮреНрдЬреА рдЖрдлреИрдВ, рд░ Sonatype рд▓рдЧрдЗрди/рдкрд╛рд╕рд╡рд░реНрдбред рддрдкрд╛рдЗрдБ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рднрдгреНрдбрд╛рд░ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рд╡рд┐рд╢реЗрд╖ рдЦрдгреНрдбрдорд╛ рд╕реЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:
рд╣рд╛рдореАрд▓реЗ рдирд┐рдореНрди рдЪрд░рд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ:
- SONATYPE_USERNAME / SONATYPE_PASSWORD - рд▓рдЧрдЗрди / рдкрд╛рд╕рд╡рд░реНрдб рдЬреБрди рд╣рд╛рдореАрд▓реЗ Sonatype рдорд╛ рджрд░реНрддрд╛ рдЧрд░реНрджрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реЗрдХрд╛ рдерд┐рдпреМрдВ
- SIGNING_KEYID/SIGNING_PASSWORD тАФ PGP рдХреБрдЮреНрдЬреА рдЖрдИрдбреА рд░ рдкрд╛рд╕рд╡рд░реНрдб рдЬреЗрдиреЗрд░реЗрд╢рдирдХреЛ рд╕рдордпрдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдпреЛред
рдо рдердк рд╡рд┐рд╡рд░рдгрдорд╛ GPG_KEY_CONTENTS рдЪрд░рдорд╛ рдмрд╕реНрди рдЪрд╛рд╣рдиреНрдЫреБред рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ рдкреНрд░рдХрд╛рд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рдирд┐рдЬреА PGP рдХреБрдЮреНрдЬреА рдЪрд╛рд╣рд┐рдиреНрдЫред рдЧреЛрдкреНрдп рдорд╛ рдкреЛрд╕реНрдЯ рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА, рдореИрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдВ
- Gpg рдХреЛ рд╕рд╛рде рд╣рд╛рдореНрд░реЛ рдХреБрдЮреНрдЬреА рдЗрдиреНрдХреНрд░рд┐рдкреНрдЯ рдЧрд░реМрдВ:
gpg --symmetric --cipher-algo AES256 9B695056.gpg
рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реЗрд░ред рдпрд╕рд▓рд╛рдИ рдЪрд▓рдорд╛ рд░рд╛рдЦреНрдиреБрдкрд░реНрдЫ: SECRET_PASSPHRASE - рдкреНрд░рд╛рдкреНрдд рдЗрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдХреБрдЮреНрдЬреАрд▓рд╛рдИ рдЖрдзрд╛рд░ 64 рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкрд╛рда рдлрд╛рд░рдордорд╛ рдЕрдиреБрд╡рд╛рдж рдЧрд░реМрдВ:
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 рдХреЛ рд▓рд╛рдЧреА рдкреНрд▓рдЧрдЗрди рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред eskatos/gradle-command-action@v1
рдЬрд╕рд▓реЗ, рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрджреЗрд╢рд╣рд░реВ рдЪрд▓рд╛рдЙрдиреЗрдЫ arguments
ред рдЪрд░рд╣рд░реВ secrets.SONATYPE_USERNAME
╨╕ secrets.SONATYPE_PASSWORD
рдпреА рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рд╕реЛрдзреЗрдХрд╛ рд░рд╣рд╕реНрдпрд╣рд░реВ рд╣реБрдиреНред
рдирд┐рд░реНрдорд╛рдг рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рдХрд╛рд░реНрдп рдЯреНрдпрд╛рдмрдорд╛ рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рд╣реБрдиреЗрдЫрдиреН:
рдирдпрд╛рдБ рд░рд┐рд▓реАрдЬ рд░рд┐рд▓реАрдЬ рд╣реБрдБрджрд╛ рд╕реНрд╡рдд: рдбрд┐рдкреНрд▓реЛрдЗ
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 рдмрд╛рдЯ рд╕реБрд░реБ рд╣реБрдиреБрдкрд░реНрдЫред рдпрджрд┐, рдкреНрд░рдХрд╛рд╢рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреНрд▓рд┐рдХ рдЧрд░реЗрдкрдЫрд┐, рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рднрдпреЛ, рд╣рд╛рдореА рдЬрд╛рди рд╕рдХреНрдЫреМрдВ
рдХрд▓рд╛рдХреГрддрд┐ рд╕реНрдЯреЗрдЬрд┐рдЩ рднрдгреНрдбрд╛рд░рдорд╛ рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛред рдпреЛ рддреБрд░реБрдиреНрддреИ рдЦреБрд▓рд╛ рд╕реНрдерд┐рддрд┐рдорд╛ рджреЗрдЦрд╛ рдкрд░реНрджрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рд▓рд╛рдИ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдЙрдкрдпреБрдХреНрдд рдмрдЯрди рдерд┐рдЪреЗрд░ рдмрдиреНрдж рд╕реНрдерд┐рддрд┐рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрдкрд░реНрдЫред рд╕рдмреИ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдкреВрд░рд╛ рднрдПрдХреЛ рдЬрд╛рдБрдЪ рдЧрд░реЗрдкрдЫрд┐, рдХрд▓рд╛рдХреГрддрд┐ рдмрдиреНрдж рд╕реНрдерд┐рддрд┐рдорд╛ рдЬрд╛рдиреНрдЫ рд░ рдЕрдм рдкрд░рд┐рдорд╛рд░реНрдЬрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрд▓рдмреНрдз рдЫреИрдиред рдпрд╕ рдлрд╛рд░рдордорд╛, рдпреЛ MavenCentral рдорд╛ рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗрдЫред рдпрджрд┐ рд╕рдмреИ рдареАрдХ рдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдмрдЯрди рдерд┐рдЪреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬрд╛рд░реА, рд░ рдХрд▓рд╛рдХреГрддрд┐ рд╕реЛрдирд╛рдЯрд╛рдЗрдк рднрдгреНрдбрд╛рд░рдорд╛ рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗрдЫред
рдХрд▓рд╛рдХреГрддрд┐ MavenCentral рдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА, рддрдкрд╛рдИрд▓реЗ рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореАрд▓реЗ рд╕реБрд░реБрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдХреЛ рдХрд╛рд░реНрдпрдорд╛ рд╕реЛрдзреНрдиреБ рдкрд░реНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдПрдХ рдкрдЯрдХ рдорд╛рддреНрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдЫреМрдВред рдкрдЫрд┐рд▓реНрд▓реЛ рд╕рдордпрдорд╛, рдпреЛ рдЖрд╡рд╢реНрдпрдХ рдЫреИрди, рд╕рдмреИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬ рд╣реБрдиреЗрдЫред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рддреБрд░реБрдиреНрддреИ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рд╕рдХреНрд░рд┐рдп рдЧрд░реЗ, рддрд░ рдХрд▓рд╛рдХреГрддрд┐ MavenCentral рдорд╛ рдЙрдкрд▓рдмреНрдз рд╣реБрди рд▓рдЧрднрдЧ 5 рджрд┐рди рд▓рд╛рдЧреНрдпреЛред
рдпрддрд┐ рдорд╛рддреНрд░реИ рд╣реЛ, рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдХрд▓рд╛рдХреГрддрд┐ MavenCentral рдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реЗрдХрд╛ рдЫреМрдВред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдЩреНрдХрд╣рд░реВ
- рд╕рдорд╛рди
рд▓реЗрдЦ , maven рдорд╛рд░реНрдлрдд рдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд - рд╕реНрдерд┐рд░рддрд╛
рднрдгреНрдбрд╛рд░ рд╕реЛрдирд╛рдЯрд╛рдЗрдк Jira рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдЬрд╕рдорд╛ рдХрд╛рд░реНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдирдЙрджрд╛рд╣рд░рдг: рднрдгреНрдбрд╛рд░ рдЬрд╣рд╛рдБ рдпреЛ рд╕рдмреИ рд╕реЗрдЯ рдЕрдк рдЫ
рд╕реНрд░реЛрдд: www.habr.com