የጃቫ ፕሮጀክትን ወደ Sonatype Maven Central Repository ለማተም Gradle እና Github Actions በመጠቀም

በዚህ ጽሁፍ የጃቫን ቅርስ ከባዶ በ Github Actions ወደ Sonatype Maven Central Repository የግራድል ግንበኛን በመጠቀም የማተም ሂደትን በጥልቀት ማየት እፈልጋለሁ።

ይህንን ጽሑፍ ለመጻፍ የወሰንኩት በአንድ ቦታ ላይ መደበኛ ትምህርት ባለመኖሩ ነው። ሁሉም መረጃዎች ከተለያዩ ምንጮች በቁራጭ መሰብሰብ ነበረባቸው፣ በተጨማሪም፣ ሙሉ በሙሉ ትኩስ ሳይሆን። ማን ያስባል ፣ በድመት ስር እንኳን ደህና መጡ።

በ Sonatype ውስጥ ማከማቻ መፍጠር

የመጀመሪያው እርምጃ በ Sonatype Maven Central ውስጥ ማከማቻ መፍጠር ነው። ለዚህ እንሄዳለን እዚህ, መመዝገብ እና አዲስ ተግባር ፍጠር, ማከማቻ እንድንፈጥር በመጠየቅ. በእኛ ውስጥ እንነዳለን የቡድንአይድ ፕሮጀክት፣ የፕሮጀክት ዩ.አር.ኤል. የፕሮጀክት አገናኝ እና SCM ዩአርኤል ፕሮጀክቱ የሚገኝበት የስሪት ቁጥጥር ስርዓት አገናኝ. የቡድንአይድ እዚህ ቅጽ com.example፣ com.example.domain፣ com.example.testsupport መሆን አለበት፣ እና እንዲሁም ወደ githubዎ አገናኝ መልክ ሊሆን ይችላል። github.com/yourusername -> io.github.የእርስዎ የተጠቃሚ ስም። በማንኛውም አጋጣሚ የዚህን ጎራ ወይም መገለጫ ባለቤትነት ማረጋገጥ ያስፈልግዎታል። የgithub ፕሮፋይል ከገለጹ የተፈለገውን ስም የያዘ ይፋዊ ማከማቻ እንዲፈጥሩ ይጠየቃሉ።

ከተረጋገጠ ከተወሰነ ጊዜ በኋላ የእርስዎ ቡድንአይድ ይፈጠራል እና ወደ ቀጣዩ ደረጃ የግራድል ውቅረት መሄድ እንችላለን።

Gradleን በማዋቀር ላይ

ይህ ጽሑፍ እስከተጠናቀረበት ድረስ፣ ቅርሱን ለማተም የሚረዱ የግራድል ተሰኪዎችን አላገኘሁም። ይህ ያገኘሁት ብቸኛው ፕለጊን ግን ደራሲው የበለጠ ለመደገፍ ፈቃደኛ አልሆነም። ስለዚህ ይህንን ለማድረግ በጣም ከባድ ስላልሆነ ሁሉንም ነገር እራሴ ለማድረግ ወሰንኩ ።

ለማወቅ የመጀመሪያው ነገር Sonatype ለማተም መስፈርቶች ነው. እነሱም የሚከተሉት ናቸው።

  • የምንጭ ኮዶች እና JavaDoc መገኘት, ማለትም. መገኘት አለበት -sources.jar и-javadoc.jar ፋይሎች. በሰነዱ ላይ እንደተገለጸው፣ የምንጭ ኮዶችን ወይም ሰነዶችን ማቅረብ የማይቻል ከሆነ ዱሚ ማድረግ ይችላሉ። -sources.jar ወይም -javadoc.jar ፈተናውን ለማለፍ ከውስጥ ቀላል README ጋር።
  • ሁሉም ፋይሎች መፈረም አለባቸው GPG/PGP.asc ፊርማውን የያዘው ፋይል ለእያንዳንዱ ፋይል መካተት አለበት።
  • ለማገኘት አለማስቸገር pom ፋይል
  • ትክክለኛ እሴቶች groupId, artifactId и version. ስሪቱ የዘፈቀደ ሕብረቁምፊ ሊሆን ይችላል እና በዚህ ማለቅ አይችልም። -SNAPSHOT
  • መገኘት ያስፈልጋል name, description и url
  • ስለ ፈቃዱ, ገንቢዎች እና የስሪት ቁጥጥር ስርዓት መረጃ መኖር

እነዚህ በሚታተሙበት ጊዜ መከተል ያለባቸው መሰረታዊ ህጎች ናቸው. ሙሉ መረጃ ይገኛል። እዚህ.

እነዚህን መስፈርቶች በ ውስጥ እንተገብራለን build.gradle ፋይል. በመጀመሪያ ስለ ገንቢዎች ፣ ፈቃዶች ፣ የስሪት ቁጥጥር ስርዓት ሁሉንም አስፈላጊ መረጃዎች እንጨምር እና እንዲሁም የፕሮጀክቱን ዩአርኤል ፣ ስም እና መግለጫ እናስቀምጣለን። ለዚህ አንድ ቀላል ዘዴ እንፃፍ-

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()
}

የጂፒጂ/ፒጂፒ ፊርማ በማዘጋጀት ወደ መጨረሻው መስፈርት እንሂድ። ይህንን ለማድረግ, ተሰኪውን ያገናኙ 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 ይህን ይመስላል፡-

ሙሉ 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 ቁልፍ ማመንጨት

ከሶናታይፕ መስፈርቶች አንዱ ሁሉም ፋይሎች በጂፒጂ/ፒጂፒ ቁልፍ መፈረም ነው። ለዚህ እንሄዳለን እዚህ እና GnuPG መገልገያውን ለስርዓተ ክወናዎ ያውርዱ።

  • አንድ ቁልፍ ጥንድ እንፈጥራለን- gpg --gen-key፣ የተጠቃሚ ስም ፣ ኢሜል ያስገቡ እና የይለፍ ቃል ያዘጋጁ።
  • የሚለውን ለማወቅ ችለናል። id የኛ ቁልፍ ከትእዛዙ ጋር፡- gpg --list-secret-keys --keyid-format short. መታወቂያው ከተሰነጠቀ በኋላ ይገለጻል፡ ለምሳሌ፡ rsa2048/9B695056
  • የህዝብ ቁልፉን ወደ አገልጋዩ በማተም ላይ https://keys.openpgp.org ትዕዛዝ፡- gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • የሚስጥር ቁልፉን ወደ የዘፈቀደ ቦታ እንልካለን፣ወደፊትም እንፈልጋለን፡- gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Github ድርጊቶችን በማዘጋጀት ላይ

ወደ መጨረሻው ደረጃ እንሸጋገር፣ግንባቱን እናዘጋጃለን እና Github Actionsን በመጠቀም በራስ-አትም።
Github Actions ሙሉ የሲአይ/ሲዲ ዑደትን በመተግበር የስራ ሂደቱን በራስ ሰር እንዲያደርጉ የሚያስችልዎ ባህሪ ነው። መገንባት፣ መፈተሽ እና ማሰማራት በተለያዩ ክስተቶች ሊቀሰቀስ ይችላል፡ ኮድ መግፋት፣ መልቀቅ መፍጠር ወይም ችግሮች። ይህ ተግባር ለሕዝብ ማከማቻዎች ፍጹም ነፃ ነው።

በዚህ ክፍል ውስጥ እንዴት የግንባታ እና የግፊት ኮድ ማቀናበር እና በሚለቀቅበት ጊዜ ወደ Sonatype ማከማቻ ማሰማራት እንዲሁም ሚስጥሮችን ማቀናበር እንደሚችሉ አሳያችኋለሁ።

ሚስጥሮችን አዘጋጅተናል

ለአውቶማቲክ ማሰባሰብ እና ማሰማራት፣ እንደ ቁልፍ መታወቂያ፣ ቁልፉን ስንፈጥር ያስገቡት የይለፍ ቃል፣ የፒጂፒ ቁልፍ ራሱ እና የሶናታይፕ መግቢያ/ፓስዎርድ ያሉ በርካታ ሚስጥራዊ እሴቶች ያስፈልጉናል። በማጠራቀሚያ ቅንጅቶች ውስጥ በልዩ ክፍል ውስጥ እነሱን ማዋቀር ይችላሉ-

የጃቫ ፕሮጀክትን ወደ Sonatype Maven Central Repository ለማተም Gradle እና Github Actions በመጠቀም

የሚከተሉትን ተለዋዋጮች አዘጋጅተናል።

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - በSonatype ስንመዘገብ ያስገቡት መግቢያ/ይለፍ ቃል
  • SIGNING_KEYID/SIGNING_PASSWORD — የፒጂፒ ቁልፍ መታወቂያ እና የይለፍ ቃል በሚፈጠርበት ጊዜ ተቀናብሯል።

በጂፒጂ_KEY_CONTENTS ተለዋዋጭ ላይ በበለጠ ዝርዝር መቆየት እፈልጋለሁ። እውነታው ግን ለህትመት የግል PGP ቁልፍ ያስፈልገናል. በምስጢር ውስጥ ለመለጠፍ, ተጠቀምኩ መመሪያ እና በተጨማሪ በርካታ ድርጊቶችን አድርጓል።

  • ቁልፋችንን በጂፒጂ እናመስጥር፡- 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፣ እንዲሁም የመሳብ ጥያቄዎችን ሲፈጥሩ።

የሥራው ክፍል በተገለጹት ክስተቶች ላይ የሚከናወኑትን እርምጃዎች ይገልጻል. በዚህ አጋጣሚ፣ በአዲሱ የ ubuntu ስሪት ላይ እንገነባለን፣ Java 8 ን እንጠቀማለን እና እንዲሁም ተሰኪውን ለግራድል እንጠቀማለን። eskatos/gradle-command-action@v1የገንቢውን የቅርብ ጊዜውን ስሪት በመጠቀም የተገለጹትን ትዕዛዞችን ያስኬዳል arguments. ተለዋዋጮች secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD ቀደም ብለን የጠየቅናቸው ምስጢሮች ናቸው።

የግንባታ ውጤቶቹ በድርጊት ትር ውስጥ ይንጸባረቃሉ፡-

የጃቫ ፕሮጀክትን ወደ Sonatype Maven Central Repository ለማተም Gradle እና Github Actions በመጠቀም

አዲስ ልቀት ሲለቀቅ በራስ-አሰማር

ለራስ-ሰር ማሰማራት የተለየ የስራ ፍሰት ፋይል እንፍጠር 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}}

ፋይሉ ከሚቀሰቀስበት ክስተት በስተቀር ከቀዳሚው ጋር ተመሳሳይ ነው ማለት ይቻላል። በዚህ አጋጣሚ ይህ ከቁ የሚጀምር ስም ያለው መለያ የመፍጠር ክስተት ነው።

ከመሰማራታችን በፊት የፒጂፒ ቁልፍን ከምስጢሮች አውጥተን በፕሮጀክቱ ስር ውስጥ ማስቀመጥ እንዲሁም ዲክሪፕት ማድረግ አለብን። በመቀጠል, ልዩ የአካባቢ ተለዋዋጭ ማዘጋጀት አለብን RELEASE_VERSION የምንጠቅሰው gradle.build ፋይል. ይህ ሁሉ የሚከናወነው በክፍል ውስጥ ነው Prepare to publish. ቁልፋችንን ከጂፒጂ_KEY_CONTENTS ተለዋዋጭ አግኝተናል፣ ወደ ጂፒጂ ፋይል እንተረጉማለን፣ ከዚያም ፋይሉን ውስጥ በማስገባት ዲክሪፕት እናደርጋለን secret.gpg.

በመቀጠል ወደ ልዩ ተለዋዋጭ እንሸጋገራለን GITHUB_REFመለያውን በሚፈጥሩበት ጊዜ ያዘጋጀነውን ስሪት ከየት ማግኘት እንችላለን። ይህ ተለዋዋጭ በዚህ ጉዳይ ላይ ጠቃሚ ነው. refs/tags/v0.0.2 የተወሰነ ስሪት ለማግኘት የመጀመሪያዎቹን 11 ቁምፊዎች ቆርጠን ነበር. በመቀጠል፣ ለማተም መደበኛውን የGradle ትዕዛዞችን እንጠቀማለን፡- test publish

በSonatype ማከማቻ ውስጥ የማሰማራት ውጤቶችን በመፈተሽ ላይ

መለቀቅ ከተፈጠረ በኋላ, በቀድሞው ክፍል ውስጥ የተገለፀው የስራ ሂደት መጀመር አለበት. ይህንን ለማድረግ ልቀት ይፍጠሩ፡

የጃቫ ፕሮጀክትን ወደ Sonatype Maven Central Repository ለማተም Gradle እና Github Actions በመጠቀም

የመለያው ስም በ v መጀመር አለበት. ልቀትን አትም የሚለውን ጠቅ ካደረግን በኋላ የስራ ሂደቱ በተሳካ ሁኔታ ከተጠናቀቀ ወደዚህ መሄድ እንችላለን የጠንካይነት Nexus ለማረጋገጥ፡-

የጃቫ ፕሮጀክትን ወደ Sonatype Maven Central Repository ለማተም Gradle እና Github Actions በመጠቀም

ቅርሱ በ Staging ማከማቻ ውስጥ ታየ። ወዲያውኑ በክፍት ሁኔታ ውስጥ ይታያል, ከዚያም ተገቢውን ቁልፍ በመጫን በእጅ ወደ ዝጋ ሁኔታ መተላለፍ አለበት. ሁሉም መስፈርቶች መሟላታቸውን ካረጋገጡ በኋላ፣ ቅርሱ ወደ ዝጋ ሁኔታ ውስጥ ይገባል እና ለመሻሻያ አይገኝም። በዚህ ቅጽ፣ በ MavenCentral ውስጥ ያበቃል። ሁሉም ነገር ደህና ከሆነ, አዝራሩን መጫን ይችላሉ መልቀቅ፣ እና ቅርሱ በ Sonatype ማከማቻ ውስጥ ያበቃል።

ቅርሱ ወደ MavenCentral እንዲገባ መጀመሪያ ላይ በፈጠርነው ተግባር ውስጥ መጠየቅ አለቦት። ይህን ማድረግ ያለብህ አንድ ጊዜ ብቻ ነው፣ ስለዚህ እኛ ለመጀመሪያ ጊዜ አትመናል። በቀጣዮቹ ጊዜያት, ይህ አያስፈልግም, ሁሉም ነገር በራስ-ሰር ይመሳሰላል. ማመሳሰልን በፍጥነት አበሩልኝ፣ ነገር ግን ቅርሱ በ MavenCentral ውስጥ እስኪገኝ ድረስ 5 ቀናት ያህል ፈጅቷል።

ያ ብቻ ነው፣ የእኛን ቅርስ በ MavenCentral ውስጥ አሳትመናል።

ጠቃሚ አገናኞች

  • ተመሳሳይ ጽሑፍ፣ በማቨን በኩል ብቻ ያትሙ
  • ማሳያ ማከማቻ ሶናታይፕ
  • ዲያራ ተግባሩን የሚፈጥርበት Sonatype
  • ለምሳሌ: ሁሉም ነገር የተዘጋጀበት ማከማቻ

ምንጭ: hab.com