рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдорд╛рд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЧреНрд░реЗрдбрд▓ рдЖрдгрд┐ рдЧрд┐рдердм рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд░рдгреЗ

рдпрд╛ рд▓реЗрдЦрд╛рдд, рдорд▓рд╛ Gradle рдмрд┐рд▓реНрдбрд░ рд╡рд╛рдкрд░реВрди Sonatype Maven рд╕реЗрдВрдЯреНрд░рд▓ рд░рд┐рдкреЙрдЭрд┐рдЯрд░реАрдордзреНрдпреЗ Github Actions рджреНрд╡рд╛рд░реЗ рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди Java рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╡рд░ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдирдЬрд░ рдЯрд╛рдХрд╛рдпрдЪреА рдЖрд╣реЗ.

рдПрдХрд╛ рдард┐рдХрд╛рдгреА рд╕рд╛рдорд╛рдиреНрдп рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ рдореА рд╣рд╛ рд▓реЗрдЦ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. рд╕рд░реНрд╡ рдорд╛рд╣рд┐рддреА рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рдВрдХрдбреВрди рддреБрдХрдбреНрдпрд╛рдиреЗ рдЧреЛрд│рд╛ рдХрд░рд╛рд╡реА рд▓рд╛рдЧрд▓реА, рд╢рд┐рд╡рд╛рдп, рдкреВрд░реНрдгрдкрдгреЗ рддрд╛рдЬреА рдирд╛рд╣реА. рдХреЛрдг рдХрд╛рд│рдЬреА рдШреЗрддреЗ, рдорд╛рдВрдЬрд░реАрдЪреНрдпрд╛ рдЦрд╛рд▓реА рдЖрдкрд▓реЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ.

рд╕реЛрдирд╛рдЯрд╛рдЗрдкрдордзреНрдпреЗ рднрд╛рдВрдбрд╛рд░ рддрдпрд╛рд░ рдХрд░рдгреЗ

рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдорд╛рд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓рдордзреНрдпреЗ рднрд╛рдВрдбрд╛рд░ рддрдпрд╛рд░ рдХрд░рдгреЗ рд╣реА рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА рдЖрд╣реЗ. рдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдЬрд╛рддреЛ рдпреЗрдереЗ, рдиреЛрдВрджрдгреА рдХрд░рд╛ рдЖрдгрд┐ рдирд╡реАрди рдХрд╛рд░реНрдп рддрдпрд╛рд░ рдХрд░рд╛, рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрд╛. рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдордзреНрдпреЗ рдбреНрд░рд╛рдЗрд╡реНрд╣ рдЧреНрд░реБрдкрдЖрдпрдбреА рдкреНрд░рдХрд▓реНрдк, рдкреНрд░рдХрд▓реНрдк URL рдкреНрд░рдХрд▓реНрдк рджреБрд╡рд╛ рдЖрдгрд┐ SCM url рдЖрд╡реГрддреНрддреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реАрдЪрд╛ рджреБрд╡рд╛ рдЬреНрдпрд╛рдордзреНрдпреЗ рдкреНрд░рдХрд▓реНрдк рд╕реНрдерд┐рдд рдЖрд╣реЗ. рдЧреНрд░реБрдкрдЖрдпрдбреА рдпреЗрдереЗ com.example, com.example.domain, com.example.testsupport рдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдЪреЗ рдЕрд╕рд╛рд╡реЗ рдЖрдгрд┐ рддреЗ рддреБрдордЪреНрдпрд╛ рдЧреАрдердмрдЪреНрдпрд╛ рджреБрд╡реНрдпрд╛рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рджреЗрдЦреАрд▓ рдЕрд╕реВ рд╢рдХрддреЗ: github.com/yourusername -> io.github.yourusername. рдХреЛрдгрддреНрдпрд╛рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдд, рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдбреЛрдореЗрди рдХрд┐рдВрд╡рд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓рдЪреА рдорд╛рд▓рдХреА рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреБрдореНрд╣реА рдЧрд┐рдердм рдкреНрд░реЛрдлрд╛рдЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╡рд╛рд╕рд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрд╛рдВрдбрд╛рд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рдИрд▓.

рдкреБрд╖реНрдЯреАрдХрд░рдгрд╛рдирдВрддрд░ рдХрд╛рд╣реА рд╡реЗрд│рд╛рдиреЗ, рддреБрдордЪрд╛ 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 рдкрд╛рд╕рд╡рд░реНрдб рд╡рд░ рдиреЛрдВрджрдгреА рджрд░рдореНрдпрд╛рди рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдЕрд╕рд▓реЗрд▓реЗ рдЪрд▓ sonatype.org.

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЕрдВрддрд┐рдо 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 рдХреА рд╕рд╣ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХрд░рд╛рд╡реА. рдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдЬрд╛рддреЛ рдпреЗрдереЗ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдорд╕рд╛рдареА GnuPG рдпреБрдЯрд┐рд▓рд┐рдЯреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛.

  • рдЖрдореНрд╣реА рдПрдХ рдХреА рдЬреЛрдбреА рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рддреЛ: 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