рдпрд╛ рд▓реЗрдЦрд╛рдд, рдорд▓рд╛ Gradle рдмрд┐рд▓реНрдбрд░ рд╡рд╛рдкрд░реВрди Sonatype Maven рд╕реЗрдВрдЯреНрд░рд▓ рд░рд┐рдкреЙрдЭрд┐рдЯрд░реАрдордзреНрдпреЗ Github Actions рджреНрд╡рд╛рд░реЗ рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди Java рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╡рд░ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдирдЬрд░ рдЯрд╛рдХрд╛рдпрдЪреА рдЖрд╣реЗ.
рдПрдХрд╛ рдард┐рдХрд╛рдгреА рд╕рд╛рдорд╛рдиреНрдп рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ рдореА рд╣рд╛ рд▓реЗрдЦ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. рд╕рд░реНрд╡ рдорд╛рд╣рд┐рддреА рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рдВрдХрдбреВрди рддреБрдХрдбреНрдпрд╛рдиреЗ рдЧреЛрд│рд╛ рдХрд░рд╛рд╡реА рд▓рд╛рдЧрд▓реА, рд╢рд┐рд╡рд╛рдп, рдкреВрд░реНрдгрдкрдгреЗ рддрд╛рдЬреА рдирд╛рд╣реА. рдХреЛрдг рдХрд╛рд│рдЬреА рдШреЗрддреЗ, рдорд╛рдВрдЬрд░реАрдЪреНрдпрд╛ рдЦрд╛рд▓реА рдЖрдкрд▓реЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ.
рд╕реЛрдирд╛рдЯрд╛рдЗрдкрдордзреНрдпреЗ рднрд╛рдВрдбрд╛рд░ рддрдпрд╛рд░ рдХрд░рдгреЗ
рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдорд╛рд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓рдордзреНрдпреЗ рднрд╛рдВрдбрд╛рд░ рддрдпрд╛рд░ рдХрд░рдгреЗ рд╣реА рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА рдЖрд╣реЗ. рдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдЬрд╛рддреЛ
рдкреБрд╖реНрдЯреАрдХрд░рдгрд╛рдирдВрддрд░ рдХрд╛рд╣реА рд╡реЗрд│рд╛рдиреЗ, рддреБрдордЪрд╛ GroupId рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдЖрдореНрд╣реА рдкреБрдвреАрд▓ рдЪрд░рдг, 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 рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ ╨╕ sonatype рдкрд╛рд╕рд╡рд░реНрдб рд╡рд░ рдиреЛрдВрджрдгреА рджрд░рдореНрдпрд╛рди рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдЕрд╕рд▓реЗрд▓реЗ рдЪрд▓
рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЕрдВрддрд┐рдо 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 рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд░реВрди рд╕реНрд╡рдпрдВ-рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВ.
рдЧрд┐рдердм рдЕреЕрдХреНрд╢рдиреНрд╕ рд╣реЗ рдПрдХ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреВрд░реНрдг CI/CD рд╕рд╛рдпрдХрд▓ рд▓рд╛рдЧреВ рдХрд░реВрди рд╡рд░реНрдХрдлреНрд▓реЛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдмрд┐рд▓реНрдб, рдЯреЗрд╕реНрдЯ рдЖрдгрд┐ рдбрд┐рдкреНрд▓реЙрдп рд╡рд┐рд╡рд┐рдз рдЗрд╡реНрд╣реЗрдВрдЯреНрд╕рджреНрд╡рд╛рд░реЗ рдЯреНрд░рд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ: рдХреЛрдб рдкреБрд╢, рд░рд┐рд▓реАрдЬ рддрдпрд╛рд░ рдХрд░рдгреЗ рдХрд┐рдВрд╡рд╛ рд╕рдорд╕реНрдпрд╛. рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрд╛рдВрдбрд╛рд░рд╛рдВрд╕рд╛рдареА рдкреВрд░реНрдгрдкрдгреЗ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЖрд╣реЗ.
рдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рдд, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдмрд┐рд▓реНрдб рдЖрдгрд┐ рдкреБрд╢ рдХреЛрдб рдХрд╕рд╛ рд╕реЗрдЯ рдХрд░рд╛рдпрдЪрд╛ рдЖрдгрд┐ рд╕реЛрдирд╛рдЯрд╛рдЗрдк рд░рд┐рдкреЙрдЭрд┐рдЯрд░реАрдордзреНрдпреЗ рд░рд┐рд▓реАрдЭ рдХрд░рддрд╛рдирд╛ рдХрд╕реЗ рддреИрдирд╛рдд рдХрд░рд╛рдпрдЪреЗ рддреЗ рддрд╕реЗрдЪ рдЧреБрдкрд┐рддреЗ рдХрд╕реЗ рд╕реЗрдЯ рдХрд░рд╛рдпрдЪреЗ рддреЗ рджрд╛рдЦрд╡реЗрди.
рдЖрдореНрд╣реА рд░рд╣рд╕реНрдпреЗ рд╕реЗрдЯ рдХрд░рддреЛ
рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯрд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрдиреЗрдХ рдЧреБрдкреНрдд рдореВрд▓реНрдпрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ, рдЬрд╕реЗ рдХреА рдХреА рдЖрдпрдбреА, рдХреА рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рдЖрдореНрд╣реА рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓рд╛ рдкрд╛рд╕рд╡рд░реНрдб, рд╕реНрд╡рддрдГ PGP рдХреА рдЖрдгрд┐ рд╕реЛрдирд╛рдЯрд╛рдЗрдк рд▓реЙрдЧрд┐рди/рдкрд╛рд╕рд╡рд░реНрдб. рдЖрдкрдг рддреНрдпрд╛рдВрдирд╛ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдордзреАрд▓ рдПрдХрд╛ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рднрд╛рдЧрд╛рдд рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛:
рдЖрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рддреЛ:
- SONATYPE_USERNAME / SONATYPE_PASSWORD - рд▓реЙрдЧрд┐рди / рдкрд╛рд╕рд╡рд░реНрдб рдЬреЛ рдЖрдореНрд╣реА Sonatype рд╕рд╣ рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ
- SIGNING_KEYID/SIGNING_PASSWORD тАФ рдкреАрдЬреАрдкреА рдХреА рдЖрдпрдбреА рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдЬрдирд░реЗрд╢рди рджрд░рдореНрдпрд╛рди рд╕реЗрдЯ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.
рдорд▓рд╛ 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
, рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рджреЗрдЦреАрд▓.
рдЬреЙрдм рд╡рд┐рднрд╛рдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рдВрд╡рд░ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдпрд▒реНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЛ. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЖрдореНрд╣реА рдЙрдмрдВрдЯреВрдЪреНрдпрд╛ рдирд╡реАрдирддрдо рдЖрд╡реГрддреНрддреАрд╡рд░ рддрдпрд╛рд░ рдХрд░реВ, Java 8 рд╡рд╛рдкрд░реВ рдЖрдгрд┐ Gradle рд╕рд╛рдареА рдкреНрд▓рдЧрдЗрди рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ. eskatos/gradle-command-action@v1
рдЬреЗ, рдмрд┐рд▓реНрдбрд░рдЪреНрдпрд╛ рдирд╡реАрдирддрдо рдЖрд╡реГрддреНрддреАрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди, рдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХрдорд╛рдВрдб рдЪрд╛рд▓рд╡реЗрд▓ arguments
. рдЪрд▓ secrets.SONATYPE_USERNAME
╨╕ secrets.SONATYPE_PASSWORD
рдЖрдореНрд╣реА рдЖрдзреА рд╡рд┐рдЪрд╛рд░рд▓реЗрд▓реА рд╣реА рд░рд╣рд╕реНрдпреЗ рдЖрд╣реЗрдд.
рдмрд┐рд▓реНрдб рдкрд░рд┐рдгрд╛рдо рдХреНрд░рд┐рдпрд╛ рдЯреЕрдмрдордзреНрдпреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╣реЛрддреАрд▓:
рдирд╡реАрди рд░рд┐рд▓реАрдЭ рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдСрдЯреЛ-рдбрд┐рдкреНрд▓реЙрдп рдХрд░рд╛
рдСрдЯреЛрдбрд┐рдкреНрд▓реЙрдпрд╕рд╛рдареА рдПрдХ рд╡реЗрдЧрд│реА рд╡рд░реНрдХрдлреНрд▓реЛ рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░реВ 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 рд╡рд░реНрдг рдХрд╛рдкрд▓реЗ. рдкреБрдвреЗ, рдЖрдореНрд╣реА рдкреНрд░рдХрд╛рд╢рдирд╛рд╕рд╛рдареА рдорд╛рдирдХ рдЧреНрд░реЗрдбрд▓ рдХрдорд╛рдВрдб рд╡рд╛рдкрд░рддреЛ: test publish
рд╕реЛрдирд╛рдЯрд╛рдЗрдк рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рддреИрдирд╛рддреА рдкрд░рд┐рдгрд╛рдо рддрдкрд╛рд╕рдд рдЖрд╣реЗ
рд░рд┐рд▓реАрдЭ рддрдпрд╛рд░ рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░, рдорд╛рдЧреАрд▓ рд╡рд┐рднрд╛рдЧрд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓рд╛ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рд╕реБрд░реВ рдЭрд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдПрдХ рдкреНрд░рдХрд╛рд╢рди рддрдпрд╛рд░ рдХрд░рд╛:
рдЯреЕрдЧрдЪреЗ рдирд╛рд╡ v рдиреЗ рд╕реБрд░реВ рд╣реЛрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдкреНрд░рдХрд╛рд╢рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рд╛ рдХреНрд▓рд┐рдХ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдпреЗрдереЗ рдЬрд╛рдК рд╢рдХрддреЛ
рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдХрд▓рд╛рдХреГрддреА рджрд┐рд╕рд▓реА. рддреЗ рддрд╛рдмрдбрддреЛрдм рдУрдкрди рд╕реНрдЯреЗрдЯрд╕рдордзреНрдпреЗ рджрд┐рд╕рддреЗ, рдирдВрддрд░ рдпреЛрдЧреНрдп рдмрдЯрдг рджрд╛рдмреВрди рддреЗ рдореЕрдиреНрдпреБрдЕрд▓реА рдХреНрд▓реЛрдЬ рд╕реНрдЯреЗрдЯрд╕рдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕рд░реНрд╡ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рдЪреА рддрдкрд╛рд╕рдгреА рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдХрд▓рд╛рдХреГрддреА рдмрдВрдж рд╕реНрдерд┐рддреАрдд рдЬрд╛рддреЗ рдЖрдгрд┐ рдпрд╛рдкреБрдвреЗ рдмрджрд▓рд╛рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдирд╛рд╣реА. рдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд, рддреЗ MavenCentral рдордзреНрдпреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдИрд▓. рд╕рд░реНрд╡ рдХрд╛рд╣реА рдареАрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдкрдг рдмрдЯрдг рджрд╛рдмреВ рд╢рдХрддрд╛ рдкреНрд░рдХрд╛рд╢рди, рдЖрдгрд┐ рдХрд▓рд╛рдХреГрддреА рд╕реЛрдирд╛рдЯрд╛рдЗрдк рднрд╛рдВрдбрд╛рд░рд╛рдд рд╕рдорд╛рдкреНрдд рд╣реЛрдИрд▓.
рдХрд▓рд╛рдХреГрддреА MavenCentral рдордзреНрдпреЗ рдпреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЕрдЧрджреА рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдордзреНрдпреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рд╡рд┐рдЪрд╛рд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдлрдХреНрдд рдПрдХрджрд╛рдЪ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдкреНрд░рдердордЪ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЛ. рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдХрд╛рд│рд╛рдд, рд╣реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА, рд╕рд░реНрд╡рдХрд╛рд╣реА рдЖрдкреЛрдЖрдк рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓. рддреНрдпрд╛рдВрдиреА рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рдкрдЯрдХрди рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭреЗрд╢рди рдЪрд╛рд▓реВ рдХреЗрд▓реЗ, рдкрд░рдВрддреБ рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯ MavenCentral рдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА рд╕реБрдорд╛рд░реЗ 5 рджрд┐рд╡рд╕ рд▓рд╛рдЧрд▓реЗ.
рдПрд╡рдвреЗрдЪ, рдЖрдореНрд╣реА рдЖрдордЪреА рдХрд▓рд╛рдХреГрддреА MavenCentral рдордзреНрдпреЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓реА рдЖрд╣реЗ.
рдЙрдкрдпреБрдХреНрдд рджреБрд╡реЗ
- рддрддреНрд╕рдо
рд▓реЗрдЦ , рдлрдХреНрдд maven рджреНрд╡рд╛рд░реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд - рд╕реНрдЯреЗрдЬрд┐рдВрдЧ
рднрд╛рдВрдбрд╛рд░ рд╕реЛрдирд╛рдЯрд╛рдИрдк Jira рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдЬреНрдпрд╛рдордзреНрдпреЗ рдЯрд╛рд╕реНрдХ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рдЖрд╣реЗрдЙрджрд╛рд╣рд░рдг: рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдЬреЗрдереЗ рд╣реЗ рд╕рд░реНрд╡ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ
рд╕реНрддреНрд░реЛрдд: www.habr.com