ИзползвамС Gradle ΠΈ Github Actions Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° Java ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Sonatype Maven Central Repository

Π’ Ρ‚Π°Π·ΠΈ статия искам ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌ процСса Π½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π° Π½Π° Java Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Ρ‡Ρ€Π΅Π· Github Actions Π² Sonatype Maven Central Repository, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Gradle.

Π Π΅ΡˆΠΈΡ… Π΄Π° напиша Ρ‚Π°Π·ΠΈ статия, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ липсвашС Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π» Π½Π° Π΅Π΄Π½ΠΎ място. Цялата информация бСшС ΡΡŠΠ±ΠΈΡ€Π°Π½Π° Π½Π° части ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ, ΠΊΠ°Ρ‚ΠΎ Π½Π΅ бяха съвсСм Π°ΠΊΡ‚ΡƒΠ°Π»Π½ΠΈ. На ΠΊΠΎΠ³ΠΎΡ‚ΠΎ ΠΌΡƒ Π΅ интСрСсно, Π΄ΠΎΠ±Ρ€Π΅ дошли ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

БъздаванС Π½Π° рСпозитория Π² Sonatype

ΠŸΡŠΡ€Π²Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Π΅ Π΄Π° създадСм Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π² Sonatype Maven Central. Π—Π° Ρ†Π΅Π»Ρ‚Π° ΠΎΡ‚ΠΈΠ²Π°ΠΌΠ΅ Ρ‚ΡƒΠΊ, рСгистрирамС сС ΠΈ създавамС Π½ΠΎΠ²Π° Π·Π°Π΄Π°Ρ‡Π° с ΠΌΠΎΠ»Π±Π° Π΄Π° Π½ΠΈ ΡΡŠΠ·Π΄Π°Π΄Π°Ρ‚ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. Π’ΡŠΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ нашия 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, ΠΊΠΎΠΈΡ‚ΠΎ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ с ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚. Π’ΠΎΠ²Π° СдинствСният плъгин, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ…, ΠΎΠ±Π°Ρ‡Π΅ Π°Π²Ρ‚ΠΎΡ€ΡŠΡ‚ сС ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°. Π—Π°Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠΈΡ… Π΄Π° направя всичко сам, Π±Π»Π°Π³ΠΎ Π½Π΅ Π΅ ΠΏΡ€Π΅ΠΊΠ°Π»Π΅Π½ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ.

ΠŸΡŠΡ€Π²ΠΎΡ‚ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° изясним, Π΅ изискванията Π½Π° Sonatype Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅. Π’Π΅ са слСднитС:

  • НаличиС Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ ΠΈ JavaDoc, Ρ‚.Π΅. трябва Π΄Π° ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²Π°Ρ‚ -sources.jar ΠΈ-javadoc.jar Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. ΠšΠ°ΠΊΡ‚ΠΎ Π΅ посочСно Π² докумСнтацията, Π°ΠΊΠΎ Π½Π΅ Π΅ възмоТно Π΄Π° сС прСдоставят ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ ΠΈΠ»ΠΈ докумСнтация, ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ пустословиС -sources.jar ΠΈΠ»ΠΈ -javadoc.jar c с прост README Π²ΡŠΡ‚Ρ€Π΅, Π·Π° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π°.
  • Всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ подписани с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° GPG/PGP, ΠΈ .asc Ρ„Π°ΠΉΠ», ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ подписа, трябва Π΄Π° бъдС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π·Π° всСки Ρ„Π°ΠΉΠ».
  • НаличиСто pom Ρ„Π°ΠΉΠ»Π°
  • ΠšΠΎΡ€Π΅ΠΊΡ‚Π½ΠΈ стойности groupId, artifactId ΠΈ version. ВСрсията ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π½ΠΈΠ· ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠ²Π° -SNAPSHOT
  • НСобходимо Π΅ ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΈΠΌΠ΅, описаниС ΠΈ 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 'НСкоС описаниС Π½Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π°'
            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 'Π›ΠΈΡ†Π΅Π½Π· Π½Π° Apache, вСрсия 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@dev.ru'
                }
            }
        }
    }
}

Π‘Π»Π΅Π΄Π²Π° Π΄Π° ΡƒΠΏΠΎΠΌΠ΅Π½Π΅ΠΌ, Ρ‡Π΅ ΠΏΡ€ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ трябва Π΄Π° сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚ -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 'Artifact 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@dev.ru'
                }
            }
        }
    }
}

Искам Π΄Π° ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠ°, Ρ‡Π΅ вСрсията ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π½Π° срСдата: System.getenv('RELEASE_VERSION'). Π©Π΅ я Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΡ€ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ ΠΈ Ρ‰Π΅ я Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΎΡ‚ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π³Π°.

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° PGP ΠΊΠ»ΡŽΡ‡

Π•Π΄Π½ΠΎ ΠΎΡ‚ изискванията Π½Π° Sonatype Π΅ подписванСто Π½Π° всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° GPG/PGP ΠΊΠ»ΡŽΡ‡. Π—Π° Ρ†Π΅Π»Ρ‚Π° ΠΎΡ‚ΠΈΠ²Π°ΠΌΠ΅ Ρ‚ΡƒΠΊ ΠΈ свалямС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Ρ‚Π° GnuPG Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° си систСма.

  • Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π° Π΄Π²ΠΎΠΉΠΊΠ°: gpg --gen-key, въвСТдамС ΠΈΠΌΠ΅ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», ΠΈΠΌΠ΅ΠΉΠ», ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π°.
  • УстановявамС ΠΈΠ΄ нашия ΠΊΠ»ΡŽΡ‡ с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°: 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 ΠΈ тСст, ΡΡŠΡ‰ΠΎ ΠΈ ΠΏΡ€ΠΈ създаванС Π½Π° pull request.

Π’ сСкцията 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: Настройка Π½Π° JDK 8
        uses: actions/setup-java@v1
        with:
          java-version: 8

      - name: ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅
        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: ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ с 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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster