เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซเชฐเซ‡เชกเชฒ เช…เชจเซ‡ เช—เซ€เชฅเชฌ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เช† เชฒเซ‡เช–เชฎเชพเช‚, เชนเซเช‚ เช—เซเชฐเซ‡เชกเชฒ เชฌเชฟเชฒเซเชกเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฎเซ‡เชตเซ‡เชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เช—เซ€เชฅเชฌ เชเช•เซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชถเชฐเซ‚เช†เชคเชฅเซ€ เชœเชพเชตเชพ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชจเชœเซ€เช•เชฅเซ€ เชœเซ‹เชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚.

เชเช• เชœเช—เซเชฏเชพเช เชธเชพเชฎเชพเชจเซเชฏ เชŸเซเชฏเซเชŸเซ‹เชฐเซ€เชฏเชฒ เชจ เชนเซ‹เชตเชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชฎเซ‡เช‚ เช† เชฒเซ‡เช– เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เชคเชฎเชพเชฎ เชฎเชพเชนเชฟเชคเซ€ เชตเชฟเชตเชฟเชง เชธเซเชคเซเชฐเซ‹เชคเซ‹เชฎเชพเช‚เชฅเซ€ เชŸเซเช•เชกเซ‡-เชŸเซเช•เชกเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชนเชคเซ€, เชตเชงเซเชฎเชพเช‚, เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชคเชพเชœเซ€ เชจเชฅเซ€. เช•เซ‹เชฃ เช•เชพเชณเชœเซ€ เชฒเซ‡ เช›เซ‡, เชฌเชฟเชฒเชพเชกเซ€ เชนเซ‡เช เชณ เชธเซเชตเชพเช—เชค เช›เซ‡.

Sonatype เชฎเชพเช‚ เชญเช‚เชกเชพเชฐ เชฌเชจเชพเชตเชตเซเช‚

เชชเซเชฐเชฅเชฎ เชชเช—เชฒเซเช‚ เช เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฎเซ‡เชตเซ‡เชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒเชฎเชพเช‚ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เช›เซ‡. เช† เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชœเชˆเช เช›เซ€เช เช…เชนเซ€เช‚, เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹ เช…เชจเซ‡ เชจเชตเซเช‚ เช•เชพเชฐเซเชฏ เชฌเชจเชพเชตเซ‹, เช…เชฎเชจเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เช›เซ‹. เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชฎเชพเช‚ เชตเชพเชนเชจ เช—เซเชฐเซเชช เช†เชˆเชกเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ, เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ URL เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฒเชฟเช‚เช• เช…เชจเซ‡ SCM url เชตเชฐเซเชเชจ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชธเชฟเชธเซเชŸเชฎเชจเซ€ เชฒเชฟเช‚เช• เชœเซ‡เชฎเชพเช‚ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซเชฅเชฟเชค เช›เซ‡. เช—เซเชฐเซเชช เช†เชˆเชกเซ€ เช…เชนเซ€เช‚ เชซเซ‹เชฐเซเชฎเชจเซเช‚ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช com.example, com.example.domain, com.example.testsupport, เช…เชจเซ‡ เชคเซ‡ เชคเชฎเชพเชฐเชพ เช—เซ€เชฅเชฌเชจเซ€ เชฒเชฟเช‚เช•เชจเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชชเชฃ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡: github.com/yourusername -> io.github.yourusername. เช•เซ‹เชˆเชชเชฃ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชคเชฎเชพเชฐเซ‡ เช† เชกเซ‹เชฎเซ‡เชจ เช…เชฅเชตเชพ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชจเซ€ เชฎเชพเชฒเชฟเช•เซ€ เชšเช•เชพเชธเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชœเซ‹ เชคเชฎเซ‡ เช—เซ€เชฅเชฌ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เช›เซ‡, เชคเซ‹ เชคเชฎเชจเซ‡ เช‡เชšเซเช›เชฟเชค เชจเชพเชฎ เชธเชพเชฅเซ‡ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เช•เชจเซเชซเชฐเซเชฎเซ‡เชถเชจ เชชเช›เซ€ เช…เชฎเซเช• เชธเชฎเชฏ เชชเช›เซ€, เชคเชฎเชพเชฐเซ€ เช—เซเชฐเซเชชเช†เชˆเชกเซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เช†เช—เชณเชจเชพ เชชเช—เชฒเชพ, เช—เซเชฐเซ‡เชกเชฒ เช•เชจเซเชซเชฟเช—เชฐเซ‡เชถเชจ เชชเชฐ เช†เช—เชณ เชตเชงเซ€ เชถเช•เซ€เช เช›เซ€เช.

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'). เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช‰เชœเชพเช—เชฐ เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชŸเซ‡เช— เชจเชพเชฎเชฎเชพเช‚เชฅเซ€ เชฒเชˆเชถเซเช‚.

เชชเซ€เชœเซ€เชชเซ€ เช•เซ€ เชœเชจเชฐเซ‡เชถเชจ

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 เช•เซเชฐเชฟเชฏเชพเช“ เชธเซเชฏเซ‹เชœเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชšเชพเชฒเซ‹ เช…เช‚เชคเชฟเชฎ เชคเชฌเช•เซเช•เชพเชฎเชพเช‚ เช†เช—เชณ เชตเชงเซ€เช, เชฌเชฟเชฒเซเชก เชธเซ‡เชŸ เช•เชฐเซ‹ เช…เชจเซ‡ เช—เซ€เชฅเชฌ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซเชตเชคเชƒ-เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เช.
เช—เซ€เชฅเชฌ เชเช•เซเชถเชจเซเชธ เช เชเช• เชตเชฟเชถเซ‡เชทเชคเชพ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ CI/CD เชšเช•เซเชฐ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€เชจเซ‡ เชตเชฐเซเช•เชซเซเชฒเซ‹เชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชฌเชฟเชฒเซเชก, เชŸเซ‡เชธเซเชŸ เช…เชจเซ‡ เชกเชฟเชชเซเชฒเซ‹เชฏ เชตเชฟเชตเชฟเชง เช‡เชตเซ‡เชจเซเชŸเซเชธ เชฆเซเชตเชพเชฐเชพ เชŸเซเชฐเชฟเช—เชฐ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡: เช•เซ‹เชก เชชเซเชถ, เชฐเชฟเชฒเซ€เช เชฌเชจเชพเชตเชŸ เช…เชฅเชตเชพ เชธเชฎเชธเซเชฏเชพเช“. เช† เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชœเชพเชนเซ‡เชฐ เชญเช‚เชกเชพเชฐเซ‹ เชฎเชพเชŸเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชฎเชซเชค เช›เซ‡.

เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚, เชนเซเช‚ เชคเชฎเชจเซ‡ เชฌเชคเชพเชตเซ€เชถ เช•เซ‡ เชฌเชฟเชฒเซเชก เช…เชจเซ‡ เชชเซเชถ เช•เซ‹เชก เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเซ‹ เช…เชจเซ‡ เชฐเชฟเชฒเซ€เช เชชเชฐ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเชฎเชพเชตเชตเซเช‚, เชคเซ‡เชฎเชœ เชฐเชนเชธเซเชฏเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเซ€.

เช…เชฎเซ‡ เชฐเชนเชธเซเชฏเซ‹ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช

เชธเซเชตเชฏเช‚เชธเช‚เชšเชพเชฒเชฟเชค เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เช…เชจเซ‡ เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡, เช…เชฎเชจเซ‡ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เช—เซเชชเซเชค เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช•เซ€ id, เช•เซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช…เชฎเซ‡ เชฆเชพเช–เชฒ เช•เชฐเซ‡เชฒ เชชเชพเชธเชตเชฐเซเชก, PGP เช•เซ€ เชชเซ‹เชคเซ‡ เช…เชจเซ‡ Sonatype เชฒเซ‹เช—เชฟเชจ/เชชเชพเชธเชตเชฐเซเชก. เชคเชฎเซ‡ เชคเซ‡เชฎเชจเซ‡ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชฎเชพเช‚ เชตเชฟเชถเชฟเชทเซเชŸ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซเชฐเซ‡เชกเชฒ เช…เชจเซ‡ เช—เซ€เชฅเชฌ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เช…เชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชšเชฒเซ‹ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - เชฒเซ‹เช—เชฟเชจ / เชชเชพเชธเชตเชฐเซเชก เชœเซ‡ เช…เชฎเซ‡ Sonatype เชธเชพเชฅเซ‡ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชฆเชพเช–เชฒ เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹
  • SIGNING_KEYID/SIGNING_PASSWORD โ€” เชœเชจเชฐเซ‡เชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ PGP เช•เซ€ เช†เชˆเชกเซ€ เช…เชจเซ‡ เชชเชพเชธเชตเชฐเซเชก เชธเซ‡เชŸ.

เชนเซเช‚ เชตเชงเซ เชตเชฟเช—เชคเชฎเชพเช‚ GPG_KEY_CONTENTS เชšเชฒ เชชเชฐ เชฐเชนเซ‡เชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚. เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ เชชเซเชฐเช•เชพเชถเชจ เชฎเชพเชŸเซ‡ เช…เชฎเชจเซ‡ เช–เชพเชจเช—เซ€ PGP เช•เซ€เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชคเซ‡เชจเซ‡ เชฐเชนเชธเซเชฏเซ‹เชฎเชพเช‚ เชชเซ‹เชธเซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เชธเซ‚เชšเชจเชพ เช…เชจเซ‡ เชตเชงเซเชฎเชพเช‚ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เช•เซเชฐเชฟเชฏเชพเช“ เช•เชฐเซ€.

  • เชšเชพเชฒเซ‹ เช†เชชเชฃเซ€ เช•เซ€เชจเซ‡ gpg เชตเชกเซ‡ เชเชจเซเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเซ€เช: gpg --symmetric --cipher-algo AES256 9B695056.gpgเชชเชพเชธเชตเชฐเซเชก เชฆเชพเช–เชฒ เช•เชฐเซ€เชจเซ‡. เชคเซ‡ เชšเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเซเช‚ เชœเซ‹เชˆเช: SECRET_PASSPHRASE
  • เชšเชพเชฒเซ‹ เชฌเซ‡เช 64 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซ‡เชฒ เชเชจเซเช•เซเชฐเชฟเชชเซเชŸเซ‡เชก เช•เซ€เชจเซ‡ เชŸเซ‡เช•เซเชธเซเชŸ เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆเชฟเชค เช•เชฐเซ€เช: base64 9B695056.gpg.gpg > 9B695056.txt. เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‡ เชšเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡: GPG_KEY_CONTENTS.

เช•เซ‹เชกเชจเซ‡ เชฆเชฌเชพเชฃ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช…เชจเซ‡ PR เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชธเซ‡เชŸเช…เชช เชฌเชจเชพเชตเซ‹

เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ‡ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชฐเซ‚เชŸเชฎเชพเช‚ เชเช• เชซเซ‹เชฒเซเชกเชฐ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡: .github/workflows.

เชคเซ‡เชฎเชพเช‚, เชซเชพเช‡เชฒเชจเซ‡ เชฎเชพเชฐเซเช• เช…เชช เช•เชฐเซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, gradle-ci-build.yml เชจเซ€เชšเซ‡เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชธเชพเชฅเซ‡:

name: build

on:
  push:
    branches:
      - master
      - dev
      - testing
  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Set up JDK 8
        uses: actions/setup-java@v1
        with:
          java-version: 8

      - name: Build with Gradle
        uses: eskatos/gradle-command-action@v1
        with:
          gradle-version: current
          arguments: build -PsonatypeUsername=${{secrets.SONATYPE_USERNAME}} -PsonatypePassword=${{secrets.SONATYPE_PASSWORD}}

เชถเชพเช–เชพเช“ เชชเชฐ เชฆเชฌเชพเชฃ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช† เชตเชฐเซเช•เชซเซเชฒเซ‹ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ master, dev ะธ testingเชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชชเชฃ.

เชœเซ‹เชฌเซเชธ เชตเชฟเชญเชพเช— เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช‡เชตเซ‡เชจเซเชŸเซเชธ เชชเชฐ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเชพ เชชเช—เชฒเชพเช‚เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช…เชฎเซ‡ เช‰เชฌเซเชจเซเชŸเซเชจเชพ เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เชชเชฐ เชจเชฟเชฐเซเชฎเชพเชฃ เช•เชฐเซ€เชถเซเช‚, เชœเชพเชตเชพ 8 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เช—เซเชฐเซ‡เชกเชฒ เชฎเชพเชŸเซ‡ เชชเซเชฒเช—เช‡เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚. eskatos/gradle-command-action@v1เชœเซ‡, เชฌเชฟเชฒเซเชกเชฐเชจเชพ เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเซ‡เชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช†เชฆเซ‡เชถเซ‹ เชšเชฒเชพเชตเชถเซ‡ arguments. เชšเชฒเซ‹ secrets.SONATYPE_USERNAME ะธ secrets.SONATYPE_PASSWORD เช† เชคเซ‡ เชฐเชนเชธเซเชฏเซ‹ เช›เซ‡ เชœเซ‡ เช…เชฎเซ‡ เช…เช—เชพเช‰ เชชเซ‚เช›เซเชฏเชพ เชนเชคเชพ.

เชฌเชฟเชฒเซเชก เชชเชฐเชฟเชฃเชพเชฎเซ‹ เช•เซเชฐเชฟเชฏเชพเช“ เชŸเซ‡เชฌเชฎเชพเช‚ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌเชฟเชค เชฅเชถเซ‡:

เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซเชฐเซ‡เชกเชฒ เช…เชจเซ‡ เช—เซ€เชฅเชฌ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เชœเซเชฏเชพเชฐเซ‡ เชจเชตเซ€ เชฐเซ€เชฒเซ€เช เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชธเซเชตเชคเชƒ เชœเชฎเชพเชตเชŸ เช•เชฐเซ‹

เชšเชพเชฒเซ‹ autodeploy เชฎเชพเชŸเซ‡ เชเช• เช…เชฒเช— เชตเชฐเซเช•เชซเซเชฒเซ‹ เชซเชพเชˆเชฒ เชฌเชจเชพเชตเซ€เช gradle-ci-publish.yml:

name: publish

on:
  push:
    tags:
      - 'v*'

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Set up JDK 8
        uses: actions/setup-java@v1
        with:
          java-version: 8

      - name: Prepare to publish
        run: |
          echo '${{secrets.GPG_KEY_CONTENTS}}' | base64 -d > publish_key.gpg
          gpg --quiet --batch --yes --decrypt --passphrase="${{secrets.SECRET_PASSPHRASE}}" 
          --output secret.gpg publish_key.gpg
          echo "::set-env name=RELEASE_VERSION::${GITHUB_REF:11}"

      - name: Publish with Gradle
        uses: eskatos/gradle-command-action@v1
        with:
          gradle-version: current
          arguments: test publish -Psigning.secretKeyRingFile=secret.gpg -Psigning.keyId=${{secrets.SIGNING_KEYID}} -Psigning.password=${{secrets.SIGNING_PASSWORD}} -PsonatypeUsername=${{secrets.SONATYPE_USERNAME}} -PsonatypePassword=${{secrets.SONATYPE_PASSWORD}}

เชซเชพเช‡เชฒ เชฒเช—เชญเช— เชชเชพเช›เชฒเซ€ เชซเชพเช‡เชฒ เชœเซ‡เชตเซ€ เชœ เช›เซ‡, เชธเชฟเชตเชพเชฏ เช•เซ‡ เชคเซ‡ เช‡เชตเซ‡เชจเซเชŸ เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เชคเซ‡ เชŸเซเชฐเชฟเช—เชฐ เชฅเชถเซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, v เชฅเซ€ เชถเชฐเซ‚ เชฅเชคเชพ เชจเชพเชฎ เชธเชพเชฅเซ‡ เชŸเซ‡เช— เชฌเชจเชพเชตเชตเชพเชจเซ€ เช† เช˜เชŸเชจเชพ เช›เซ‡.

เชœเชฎเชพเชตเชŸ เชชเชนเซ‡เชฒเชพเช‚, เช…เชฎเชพเชฐเซ‡ เชฐเชนเชธเซเชฏเซ‹เชฎเชพเช‚เชฅเซ€ PGP เช•เซ€ เช•เชพเชขเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชฐเซ‚เชŸเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซ€ เชธเชพเชฅเซ‡ เชธเชพเชฅเซ‡ เชคเซ‡เชจเซ‡ เชกเชฟเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช†เช—เชณ, เช†เชชเชฃเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ RELEASE_VERSION เชœเซ‡เชจเซ‹ เช†เชชเชฃเซ‡ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เช เช›เซ€เช gradle.build เชซเชพเช‡เชฒ เช† เชฌเชงเซเช‚ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ Prepare to publish. เช…เชฎเซ‡ GPG_KEY_CONTENTS เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚เชฅเซ€ เช…เชฎเชพเชฐเซ€ เช•เซ€ เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช, เชคเซ‡เชจเซ‡ gpg เชซเชพเช‡เชฒเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆเชฟเชค เช•เชฐเซ€เช เช›เซ€เช, เชชเช›เซ€ เชคเซ‡เชจเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€เชจเซ‡ เชคเซ‡เชจเซ‡ เชกเชฟเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเซ€เช เช›เซ€เช. secret.gpg.

เช†เช—เชณ, เช†เชชเชฃเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ เชšเชฒ เชคเชฐเชซ เชตเชณเซ€เช เช›เซ€เช GITHUB_REF, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เช†เชชเชฃเซ‡ เชŸเซ‡เช— เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒ เชตเชฐเซเชเชจ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ€เช เช›เซ€เช. เช† เชšเชฒ เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชธเช‚เชฌเช‚เชงเชฟเชค เช›เซ‡. refs/tags/v0.0.2 เชœเซ‡เชฎเชพเช‚เชฅเซ€ เช…เชฎเซ‡ เชšเซ‹เช•เซเช•เชธ เชธเช‚เชธเซเช•เชฐเชฃ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชฅเชฎ 11 เช…เช•เซเชทเชฐเซ‹เชจเซ‡ เช•เชพเชชเซ€ เชจเชพเช–เซเชฏเชพ. เช†เช—เชณ, เช…เชฎเซ‡ เชชเซเชฐเช•เชพเชถเชจ เชฎเชพเชŸเซ‡ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค Gradle เช†เชฆเซ‡เชถเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช: test publish

เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชœเชฎเชพเชตเชŸเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชเช•เชตเชพเชฐ เชฐเชฟเชฒเซ€เช เชฅเชˆ เชœเชพเชฏ, เชชเช›เซ€ เช…เช—เชพเช‰เชจเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชตเชฐเซเช•เชซเซเชฒเซ‹ เชถเชฐเซ‚ เชฅเชตเซ‹ เชœเซ‹เชˆเช. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชเช• เชชเซเชฐเช•เชพเชถเชจ เชฌเชจเชพเชตเซ‹:

เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซเชฐเซ‡เชกเชฒ เช…เชจเซ‡ เช—เซ€เชฅเชฌ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เชŸเซ‡เช— เชจเชพเชฎ v เชฅเซ€ เชถเชฐเซ‚ เชฅเชตเซเช‚ เชœเซ‹เชˆเช. เชœเซ‹, เชชเซเชฐเช•เชพเชถเชจ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‹ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชตเชฐเซเช•เชซเซเชฒเซ‹ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ เช›เซ‡, เชคเซ‹ เช…เชฎเซ‡ เชœเชˆ เชถเช•เซ€เช เช›เซ€เช เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชจเซ‡เช•เซเชธเชธ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡:

เชœเชพเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฎเซ‡เชตเชจ เชธเซ‡เชจเซเชŸเซเชฐเชฒ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซเชฐเซ‡เชกเชฒ เช…เชจเซ‡ เช—เซ€เชฅเชฌ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เช† เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชธเซเชŸเซ‡เชœเชฟเช‚เช— เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡. เชคเซ‡ เชคเชฐเชค เชœ เช“เชชเชจ เชธเซเชŸเซ‡เชŸเชธเชฎเชพเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡, เชชเช›เซ€ เชคเซ‡เชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฌเชŸเชจ เชฆเชฌเชพเชตเซ€เชจเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เช•เซเชฒเซ‹เช เชธเซเชŸเซ‡เชŸเชธเชฎเชพเช‚ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡. เชฌเชงเซ€ เช†เชตเชถเซเชฏเช•เชคเชพเช“ เชชเซ‚เชฐเซ€ เชฅเชˆ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเซเชฏเชพ เชชเช›เซ€, เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชฌเช‚เชง เชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚ เชœเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชนเชตเซ‡ เชซเซ‡เชฐเชซเชพเชฐ เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง เชจเชฅเซ€. เช† เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚, เชคเซ‡ MavenCentral เชฎเชพเช‚ เชธเชฎเชพเชชเซเชค เชฅเชถเซ‡. เชœเซ‹ เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เช›เซ‡, เชคเซ‹ เชคเชฎเซ‡ เชฌเชŸเชจ เชฆเชฌเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชชเซเชฐเช•เชพเชถเชจ, เช…เชจเซ‡ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเชฎเชพเชชเซเชค เชฅเชถเซ‡.

เชฎเซ‡เชตเชจเชธเซ‡เชจเซเชŸเซเชฐเชฒเชฎเชพเช‚ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชคเซ‡ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชชเซ‚เช›เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡ เช…เชฎเซ‡ เช–เซ‚เชฌ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชฌเชจเชพเชตเซ‡เชฒ เช›เซ‡. เชคเชฎเชพเชฐเซ‡ เช† เชฎเชพเชคเซเชฐ เชเช• เชœ เชตเชพเชฐ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชชเซเชฐเชฅเชฎ เชตเช–เชค เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เช เช›เซ€เช. เชชเช›เซ€เชจเชพ เชธเชฎเชฏเชฎเชพเช‚, เช† เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€, เชฌเชงเซเช‚ เช†เชชเชฎเซ‡เชณเซ‡ เชธเชฟเช‚เช•เซเชฐเชจเชพเช‡เช เชฅเชถเซ‡. เชคเซ‡เช“เช เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชเชกเชชเชฅเซ€ เชธเชฟเช‚เช•เซเชฐเชจเชพเช‡เชเซ‡เชถเชจ เชšเชพเชฒเซ เช•เชฐเซเชฏเซเช‚, เชชเชฐเช‚เชคเซ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸเชจเซ‡ MavenCentral เชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เชฅเชตเชพเชฎเชพเช‚ เชฒเช—เชญเช— 5 เชฆเชฟเชตเชธ เชฒเชพเช—เซเชฏเชพ.

เช†เชŸเชฒเซเช‚ เชœ, เช…เชฎเซ‡ เชฎเซ‡เชตเชจเชธเซ‡เชจเซเชŸเซเชฐเชฒเชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€ เช›เซ‡.

เช‰เชชเชฏเซ‹เช—เซ€ เชฒเชฟเช‚เช•เซเชธ

  • เชธเชฎเชพเชจ เชฒเซ‡เช–, เชฎเชพเชคเซเชฐ maven เชฎเชพเชฐเชซเชคเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค
  • เชธเซเชŸเซ‡เชœเซ€เช‚เช— เชญเช‚เชกเชพเชฐ เชธเซ‹เชจเชพเชŸเชพเช‡เชช
  • Jira เชธเซ‹เชจเชพเชŸเชพเช‡เชช เชœเซ‡เชฎเชพเช‚ เชŸเชพเชธเซเช• เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เช›เซ‡
  • เช‰เชฆเชพเชนเชฐเชฃ: เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชœเซเชฏเชพเช‚ เชคเซ‡ เชฌเชงเซเช‚ เชธเซเชฏเซ‹เชœเชฟเชค เช›เซ‡

เชธเซ‹เชฐเซเชธ: www.habr.com