เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Gradle เปเบฅเบฐ Github เป€เบžเบทเปˆเบญเป€เบœเบตเบเปเบœเปˆเป‚เบ„เบ‡เบเบฒเบ™ Java เบเบฑเบš Sonatype Maven Central Repository

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบœเบตเบเปเบœเปˆเบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ” Java เบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ”เบเบœเปˆเบฒเบ™ Github Actions เป„เบ›เบซเบฒ Sonatype Maven Central Repository เป‚เบ”เบเปƒเบŠเป‰ Gradle builder.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบ‚เบฒเบ”เบเบฒเบ™เบชเบญเบ™เบ›เบปเบเบเบฐเบ•เบดเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบซเบ™เบถเปˆเบ‡. เบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบเปเบฒเป‚เบ”เบเบชเบดเป‰เบ™เบˆเบฒเบเปเบซเบผเปˆเบ‡เบ•เปˆเบฒเบ‡เป†, เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบšเปเปˆเปเบกเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบปเบ”. เปƒเบœเบชเบปเบ™เปƒเบˆ, เบเบดเบ™เบ”เบตเบ•เป‰เบญเบ™เบฎเบฑเบšเบžเบฒเบเปƒเบ•เป‰ cat.

เบเบฒเบ™เบชเป‰เบฒเบ‡ repository เปƒเบ™ Sonatype

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ repository เปƒเบ™ Sonatype Maven Central. เบชเปเบฒเบฅเบฑเบšเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป„เบ› เบ—เบตเปˆเบ™เบตเป‰, เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปเบฅเบฐเบชเป‰เบฒเบ‡เบซเบ™เป‰เบฒเบงเบฝเบเปƒเบซเบกเปˆ, เบ‚เปเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ repository. เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฑเบšเบฅเบปเบ”เบขเบนเปˆเปƒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ GroupId เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹, URL เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เปเบฅเบฐโ€‹ SCM url เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบฅเบฐเบšเบปเบšเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเป€เบงเบตเบŠเบฑเบ™เบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบขเบนเปˆ. GroupId เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™เบฎเบนเบšเปเบšเบš com.example, com.example.domain, com.example.testsupport, เปเบฅเบฐเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบขเบนเปˆเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš github เบ‚เบญเบ‡เบ—เปˆเบฒเบ™: github.com/yourusername -> io.github.yourusername. เปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบขเบฑเป‰เบ‡เบขเบทเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เป‚เบ”เป€เบกเบ™ เบซเบผเบทเป‚เบ›เบฃเป„เบŸเบฅเปŒเบ™เบตเป‰. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบฅเบฐเบšเบธเป‚เบ›เบฃเป„เบŸเบฅเปŒ github, เบ—เปˆเบฒเบ™เบˆเบฐเบ–เบทเบเบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบชเป‰เบฒเบ‡เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™.

เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™, GroupId เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Gradle.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Gradle

เปƒเบ™เป€เบงเบฅเบฒเบ‚เบฝเบ™, เบ‚เป‰เบญเบเบšเปเปˆเบžเบปเบš Gradle plugins เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบŠเปˆเบงเบเปƒเบ™เบเบฒเบ™เป€เบœเบตเบเปเบœเปˆเบ›เบญเบก. เบ™เบตเป‰ plugin เบ”เบฝเบงเบ—เบตเปˆเบ‚เป‰เบญเบเบžเบปเบš, เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบœเบนเป‰เบ‚เบฝเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบ—เบตเปˆเบˆเบฐเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบกเบฑเบ™เบ•เบทเปˆเบกเบญเบตเบ. เป€เบžเบฒเบฐเบชเบฐเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบฎเบฑเบ”เบ—เบธเบเบขเปˆเบฒเบ‡เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบเบฒเบเป€เบเบตเบ™เป„เบ›เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰.

เบชเบดเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบˆเบฐเบ„เบดเบ”เบญเบญเบเปเบกเปˆเบ™เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡ Sonatype เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบดเบกเป€เบœเบตเบเปเบœเปˆ. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบ„เบงเบฒเบกเบžเป‰เบญเบกเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เปเบฅเบฐ JavaDoc, ie. เบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก -sources.jar ะธ-javadoc.jar เป„เบŸเบฅเปŒ. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเป„เบงเป‰เปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™, เบ–เป‰เบฒเบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเบฐเบซเบ™เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบซเบผเบทเป€เบญเบเบฐเบชเบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡ dummy เป„เบ”เป‰. -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. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ plugin 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 เบ•เบปเบงเปเบ›เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ 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 เป€เบ•เบฑเบก. เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเบฐเบ•เบธเป‰เบ™เป‚เบ”เบเป€เบซเบ”เบเบฒเบ™เบ•เปˆเบฒเบ‡เป†: เบเบฒเบ™เบŠเบธเบเบเบนเป‰เบฅเบฐเบซเบฑเบ”, เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฒเบ™เบ›เปˆเบญเบ, เบซเบผเบทเบšเบฑเบ™เบซเบฒ. เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเป€เบชเบเบ„เปˆเบฒเบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เบชเปเบฒเบฅเบฑเบš repositories เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ.

เปƒเบ™เบžเบฒเบเบ™เบตเป‰, เบ‚เป‰เบญเบเบˆเบฐเบชเบฐเปเบ”เบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเป‰เบฒเบ‡เปเบฅเบฐเบŠเบธเบเบเบนเป‰เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เบเบฑเบšเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ Sonatype เปƒเบ™เบเบฒเบ™เบ›เปˆเบญเบ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ„เบงเบฒเบกเบฅเบฑเบš.

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบฅเบฑเบš

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบเบญเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบ„เบงเบฒเบกเบฅเบฑเบš, เป€เบŠเบฑเปˆเบ™: เบฅเบฐเบซเบฑเบ”เบฅเบฐเบซเบฑเบ”, เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปƒเบชเปˆเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”, เบฅเบฐเบซเบฑเบ” PGP เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เปเบฅเบฐ Sonatype เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš / เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบขเบนเปˆเปƒเบ™เบžเบฒเบเบžเบดเป€เบชเบ”เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ repository:

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Gradle เปเบฅเบฐ Github เป€เบžเบทเปˆเบญเป€เบœเบตเบเปเบœเปˆเป‚เบ„เบ‡เบเบฒเบ™ Java เบเบฑเบš Sonatype Maven Central Repository

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ›เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - เป€เบ‚เบปเป‰เบฒโ€‹เบชเบนเปˆโ€‹เบฅเบฐโ€‹เบšเบปเบš / เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เบœเปˆเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เปƒเบชเปˆโ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบฅเบปเบ‡โ€‹เบ—เบฐโ€‹เบšเบฝเบ™โ€‹เบเบฑเบš Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD โ€” เบฅเบฐเบซเบฑเบ”เบฅเบฐเบซเบฑเบ” PGP เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ–เบทเบเบ•เบฑเป‰เบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบœเบฐเบฅเบดเบ”.

เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เบขเบนเปˆเปƒเบ™เบ•เบปเบงเปเบ› GPG_KEY_CONTENTS เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบฅเป‰เบงเปเบกเปˆเบ™เบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบดเบกเป€เบœเบตเบเปเบœเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบฅเบฐเบซเบฑเบ” PGP เบชเปˆเบงเบ™เบ•เบปเบง. เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบ›เบฐเบเบฒเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ„เบงเบฒเบกเบฅเบฑเบš, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰ เบ„เบณ เปเบ™เบฐ เบ™เบณ เปเบฅเบฐโ€‹เบ™เบญเบโ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เป„เบ”เป‰โ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบเบฐโ€‹เบ—เปเบฒโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹.

  • เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ”เป‰เบงเบ gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgเป‚เบ”เบเบเบฒเบ™เปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™. เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบงเบฒเบ‡เป„เบงเป‰เปƒเบ™เบ•เบปเบงเปเบ›: SECRET_PASSHRASE
  • เปƒเบซเป‰เปเบ›เบฅเบฐเบซเบฑเบ”เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เปเบšเบšเบŸเบญเบกเบ‚เปเป‰เบ„เบงเบฒเบกเป‚เบ”เบเปƒเบŠเป‰ 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, เบเบฑเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡.

เบžเบฒเบเบชเปˆเบงเบ™เบงเบฝเบเบเปเบฒเบ™เบปเบ”เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡ ubuntu เบฎเบธเปˆเบ™เบซเบผเป‰เบฒเบชเบธเบ”, เปƒเบŠเป‰ Java 8, เปเบฅเบฐเบเบฑเบ‡เปƒเบŠเป‰ plugin เบชเปเบฒเบฅเบฑเบš Gradle. eskatos/gradle-command-action@v1เป€เบŠเบดเปˆเบ‡, เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบชเป‰เบฒเบ‡เบฎเบธเปˆเบ™เบซเบผเป‰เบฒเบชเบธเบ”, เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™ arguments. เบ•เบปเบงเปเบ› secrets.SONATYPE_USERNAME ะธ secrets.SONATYPE_PASSWORD เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบฅเบฑเบšเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ–เบฒเบกเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰.

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบˆเบฐเบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เปเบ–เบšเบ›เบฐเบ•เบดเบšเบฑเบ”:

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Gradle เปเบฅเบฐ Github เป€เบžเบทเปˆเบญเป€เบœเบตเบเปเบœเปˆเป‚เบ„เบ‡เบเบฒเบ™ Java เบเบฑเบš Sonatype Maven Central Repository

เบ™เบณเปƒเบŠเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป€เบกเบทเปˆเบญเบฅเบธเป‰เบ™เปƒเปเปˆเบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒ

เบกเบฒเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ workflow เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบš 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

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เปˆเบญเบเบญเบญเบเบกเบฒ, เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เบžเบฒเบเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ„เบงเบ™เบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบชเป‰เบฒเบ‡เบเบฒเบ™เบ›เปˆเบญเบ:

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Gradle เปเบฅเบฐ Github เป€เบžเบทเปˆเบญเป€เบœเบตเบเปเบœเปˆเป‚เบ„เบ‡เบเบฒเบ™ Java เบเบฑเบš Sonatype Maven Central Repository

เบŠเบทเปˆเปเบ—เบฑเบเบ•เป‰เบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ v. เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ„เบฅเบดเบโ€‹เปƒเบชเปˆโ€‹เบเบฒเบ™โ€‹เบžเบดเบกโ€‹เป€เบœเบตเบโ€‹เปเบœเปˆโ€‹, เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เบชเบปเบšโ€‹เบœเบปเบ™โ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹, เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ›โ€‹เบ—เบตเปˆโ€‹ Sonatype Nexus เป€เบžเบทเปˆเบญโ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เปเบ™เปˆโ€‹เปƒเบˆเบงเปˆโ€‹เบฒ:

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Gradle เปเบฅเบฐ Github เป€เบžเบทเปˆเบญเป€เบœเบตเบเปเบœเปˆเป‚เบ„เบ‡เบเบฒเบ™ Java เบเบฑเบš Sonatype Maven Central Repository

เบงเบฑเบ”เบ–เบธเบšเบนเบฎเบฒเบ™เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ Staging. เบกเบฑเบ™เบ—เบฑเบ™เบ—เบตเบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเป€เบ›เบตเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป‚เบญเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบ›เบดเบ”เป‚เบ”เบเบเบฒเบ™เบเบปเบ”เบ›เบธเปˆเบกเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก. เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบงเปˆเบฒโ€‹เบ„เบงเบฒเบกโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เปเบกเปˆเบ™โ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡โ€‹, เบ›เบญเบกโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เบชเบฐโ€‹เบ–เบฒโ€‹เบ™เบฐโ€‹เบžเบฒเบšโ€‹เบ›เบดเบ”โ€‹เปเบฅเบฐโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบญเบตเบโ€‹เปเบฅเป‰เบงโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹. เปƒเบ™เบฎเบนเบšเปเบšเบšเบ™เบตเป‰, เบกเบฑเบ™เบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เปƒเบ™ MavenCentral. เบ–เป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ”เบต, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบปเบ”เบ›เบธเปˆเบก เบเบฒเบ™เบ›เปˆเบญเบ, เปเบฅเบฐเบ›เบญเบกเบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ Sonatype.

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ MavenCentral, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ‚เปเปƒเบซเป‰เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบญเบฑเบ™เบ™เบตเป‰เบ„เบฑเป‰เบ‡เบ”เบฝเบง, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป€เบœเบตเบเปเบœเปˆเป€เบ›เบฑเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”. เปƒเบ™เป€เบงเบฅเบฒเบ•เปเปˆเบกเบฒ, เบ™เบตเป‰เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบˆเบฐเบ–เบทเบ synchronized เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบ›เบตเบ”เบเบฒเบ™ synchronization เบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเปˆเบฒเบ‡เป„เบงเบงเบฒ, เปเบ•เปˆเบกเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเบ›เบฐเบกเบฒเบ™ 5 เบกเบทเป‰เบชเปเบฒเบฅเบฑเบšเบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”เบ—เบตเปˆเบˆเบฐเบกเบตเบขเบนเปˆเปƒเบ™ MavenCentral.

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบœเบตเบเปเบœเปˆเบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™ MavenCentral.

เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com