Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Gradle ΠΈ Github Actions для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Java ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Sonatype Maven Central Repository

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ процСсс ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ с нуля Java Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· Github Actions Π² Sonatype Maven Central Repository ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ сборщик Gradle.

Π”Π°Π½Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ Ρ€Π΅ΡˆΠΈΠ» Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Π²ΠΈΠ΄Ρƒ отсутствия Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»Π° Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС. Π’ΡΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠΎ кускам ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… источников, ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Π½Π΅ совсСм свСТих. ΠšΠΎΠΌΡƒ интСрСсно, Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ рСпозитория Π² Sonatype

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ этапом Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π² Sonatype Maven Central. Для этого ΠΈΠ΄Π΅ΠΌ сюда, рСгистрируСмся ΠΈ создаСм Π½ΠΎΠ²ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, с ΠΏΡ€ΠΎΡΡŒΠ±ΠΎΠΉ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. Π’Π±ΠΈΠ²Π°Π΅ΠΌ свой GroupId ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Project URL ссылку Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ SCM url ссылку Π½Π° систСму контроля вСрсий, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π»Π΅ΠΆΠΈΡ‚. GroupId здСсь Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄Π° com.example, com.example.domain, com.example.testsupport, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ссылки Π½Π° ваш Π³ΠΈΡ‚Ρ…Π°Π±: github.com/yourusername -> io.github.yourusername. Π’ любом случаС, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌ Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΌ. Если Π²Ρ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ Π³ΠΈΡ‚Ρ…Π°Π±Π°, попросят ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ.

Π§Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя послС подтвСрТдСния ваш 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 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, содСрТащиС Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, созданныС ΠΏΡ€ΠΈ рСгистрации Π½Π° sonatype.org.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ 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 ΠΊΠ»ΡŽΡ‡Π°. Для этого ΠΈΠ΄Π΅ΠΌ сюда ΠΈ ΠΊΠ°Ρ‡Π°Π΅ΠΌ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ GnuPG ΠΏΠΎΠ΄ свою ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму.

  • Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ: 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. Π—Π°Π΄Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π² настройках рСпозитория:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Gradle ΠΈ Github Actions для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Java ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Sonatype Maven Central Repository

Π—Π°Π΄Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

  • 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 ΠΈ Github Actions для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Java ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Sonatype Maven Central Repository

АвтодСплой ΠΏΡ€ΠΈ выпускС Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅Π»ΠΈΠ·Π°

Для автодСплоя создадим ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ процСсса 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 Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

ПослС создания Ρ€Π΅Π»ΠΈΠ·Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ запустится Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс, описанный Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. Для этого создаСм Ρ€Π΅Π»ΠΈΠ·:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Gradle ΠΈ Github Actions для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Java ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Sonatype Maven Central Repository

ΠΏΡ€ΠΈ этом имя Ρ‚Π΅Π³Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с v. Если послС наТатия Publish release, Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΉΡ‚ΠΈ Π² Sonatype Nexus Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² этом ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Gradle ΠΈ Github Actions для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Java ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Sonatype Maven Central Repository

АртСфакт появился Π² Staging Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. Π‘Ρ€Π°Π·Ρƒ ΠΎΠ½ появляСтся Π² статусС Open, Π΄Π°Π»Π΅Π΅ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ пСрСвСсти Π² статус Close, Π½Π°ΠΆΠ°Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ. ПослС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ выполнСния всСх Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² статус Close ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ доступСн для измСнСния. Π’ Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΎΠ½ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π² MavenCentral. Если всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Release, ΠΏΡ€ΠΈ этом Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Sonatype.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΏΠΎΠΏΠ°Π» Π² MavenCentral, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΠ± этом Π² Π·Π°Π΄Π°Ρ‡Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ создали Π² самом Π½Π°Ρ‡Π°Π»Π΅. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Ρ‚Π°ΠΊ ΠΌΡ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·. Π’ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ‹ это Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ трСбуСтся, всС Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ автоматичСски. Π’ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ ΠΌΠ½Π΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ быстро, Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ стал доступСн Π² MavenCentral ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 5 Π΄Π½Π΅ΠΉ.

На этом всС, ΠΌΡ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ наш Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Π² MavenCentral.

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки

  • ΠŸΠΎΡ…ΠΎΠΆΠ°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ публикация Ρ‡Π΅Ρ€Π΅Π· maven
  • Staging Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Sonatype
  • Jira Sonatype, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ
  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€ рСпозитория, Π³Π΄Π΅ это всС настроСно

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com