Mampiasa hetsika Gradle sy Github hamoahana tetikasa Java amin'ny Sonatype Maven Central Repository

Amin'ity lahatsoratra ity dia te-hijery akaiky kokoa ny fizotran'ny famoahana artifact Java aho amin'ny alΓ lan'ny Github Actions ao amin'ny Sonatype Maven Central Repository amin'ny fampiasana ny mpanangona Gradle.

Nanapa-kevitra ny hanoratra ity lahatsoratra ity aho noho ny tsy fisian'ny fampianarana mahazatra amin'ny toerana iray. Ny vaovao rehetra dia tsy maintsy nangonina tsikelikely avy amin'ny loharano samihafa, fa tsy vao haingana. Izay liana dia tongasoa eto amin'ny saka.

Mamorona tahiry ao amin'ny Sonatype

Ny dingana voalohany dia ny mamorona tahiry ao amin'ny Sonatype Maven Central. Ho an'ity dia mandeha izahay eto, misoratra anarana ary mamorona asa vaovao miaraka amin'ny fangatahana hamorona tahiry ho antsika. Mitondra fiara amin'ny anay izahay GroupId tetikasa, URL tetikasa rohy mankany amin'ny tetikasa ary SCM url rohy mankany amin'ny rafitra fanaraha-maso ny dikan-teny misy ny tetikasa. GroupId eto dia tokony ho toy ny com.example, com.example.domain, com.example.testsupport, ary mety amin'ny endrika rohy mankany amin'ny github-nao ihany koa: github.com/yourusername -> io.github.yourusername. Na izany na tsy izany dia mila manamarina ny tompon'ilay sehatra na piraofilina ianao. Raha nanondro ny mombamomba ny Github ianao, dia angatahina ianao hamorona tahiry ho an'ny daholobe miaraka amin'ny anarana tianao.

Fotoana vitsivitsy aorian'ny fanamafisana dia ho noforonina ny GroupId-nao ary afaka mandroso amin'ny dingana manaraka isika, ny fanamafisana Gradle.

Configuring Gradle

Tamin'ny fotoana nanoratana dia tsy nahita plugins ho an'ny Gradle aho izay afaka manampy amin'ny famoahana artifact. izany ny hany plugin hitako, fa ny mpanoratra dia nandΓ  ny hanohana azy bebe kokoa. Noho izany, nanapa-kevitra ny hanao ny zava-drehetra ny tenako, soa ihany fa tsy sarotra loatra.

Ny zavatra voalohany ho fantatra dia ny fepetra takian'ny famoahana an'i Sonatype. Toy izao izy ireo:

  • Ny fisian'ny kaody loharano sy JavaDoc, i.e. tsy maintsy manatrika -sources.jar ΠΈ-javadoc.jar rakitra. Araka ny voalaza ao amin'ny antontan-taratasy, raha tsy azo atao ny manome kaody loharano na antontan-taratasy, dia afaka manao dummy ianao -sources.jar na -javadoc.jar miaraka amin'ny README tsotra ao anatiny handalo ny fanamarinana.
  • Ny rakitra rehetra dia tsy maintsy misy sonia GPG/PGPary .asc ny rakitra misy ny sonia dia tsy maintsy ampidirina isaky ny rakitra.
  • fisian'ny pom rakitra
  • Soatoavina marina groupId, artifactId ΠΈ version. Ny dikan-teny dia mety ho tady tsy misy dikany ary tsy afaka mifarana amin'ny -SNAPSHOT
  • Ilaina ny fanatrehana name, description ΠΈ url
  • Ny fisian'ny fampahalalana momba ny fahazoan-dΓ lana, ny mpamorona ary ny rafitra fanaraha-maso ny dikan-teny

Ireo no fitsipika fototra tsy maintsy arahina rehefa mamoaka. Misy fanazavana feno eto.

Hampihatra ireo fepetra ireo isika amin'ny build.gradle rakitra. Voalohany, andao ampiana ny fampahalalana ilaina rehetra momba ny mpamorona, ny fahazoan-dΓ lana, ny rafitra fanaraha-maso ny dikan-teny, ary ny url, ny anarana ary ny famaritana ny tetikasa. Mba hanaovana izany, andeha hanoratra fomba tsotra:

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]'
                }
            }
        }
    }
}

Avy eo dia mila mamaritra ianao fa mandritra ny fivoriambe dia hiteraka izy ireo -sources.jar ΠΈ-javadoc.jar rakitra. Mba hanaovana izany, mandehana any amin'ny fizarana java mila manampy ireto manaraka ireto ianao:

java {
    withJavadocJar()
    withSourcesJar()
}

Andao hiroso amin'ny fepetra farany, mametraka sonia GPG/PGP. Mba hanaovana izany, andao hampifandray ny plugin signing:

plugins {
    id 'signing'
}

Ary ampio fizarana:

signing {
    sign publishing.publications
}

Farany, andao hanampy fizarana iray 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
            }
        }
    }
}

izany sonatypeUsername ΠΈ sonatypePassword variables misy ny fidirana sy tenimiafina noforonina nandritra ny fisoratana anarana amin'ny sonatype.org.

Ka ny farany build.gradle dia ho toy izao:

Kaody build.gradle feno

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]'
                }
            }
        }
    }
}

Tiako ny manamarika fa mahazo ny dikan-teny avy amin'ny fari-piainan'ny tontolo iainana izahay: System.getenv('RELEASE_VERSION'). Hametraka izany mandritra ny fivoriambe isika ary alaina amin'ny anaran'ny tag.

PGP key generation

Iray amin'ireo fepetra takian'ny Sonatype ny sonia ny rakitra rehetra amin'ny alΓ lan'ny famaha GPG/PGP. Ho an'ity dia mandeha izahay eto ary alaivo ny fitaovana GnuPG ho an'ny rafitra fiasanao.

  • Mamorona mpivady fanalahidy: gpg --gen-key, ampidiro ny solonanaranao, mailaka, ary mametraha tenimiafina.
  • Andeha hojerentsika id ny fanalahidinay miaraka amin'ny baiko: gpg --list-secret-keys --keyid-format short. Id dia haseho aorian'ny slash, ohatra: rsa2048/9B695056
  • Avoahy amin'ny mpizara ny fanalahidin'ny daholobe https://keys.openpgp.org baiko: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Manondrana ny fanalahidy miafina any amin'ny toerana tsy misy dikany isika; mila izany isika any aoriana: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Mametraka Github Actions

Andao hiroso amin'ny dingana farany, mametraka ny fananganana sy ny famoahana fiara amin'ny alΓ lan'ny Github Actions.
Github Actions dia fampiasa iray ahafahanao manao automatique ny workflow amin'ny fampiharana ny tsingerin'ny CI/CD feno. Ny fananganana, ny fitsapana ary ny fametrahana dia azo ateraky ny hetsika isan-karazany: fanosehana kaody, famoronana famoahana na olana. Maimaim-poana tanteraka ity fampiasa ity ho an'ny tahiry ho an'ny daholobe.

Amin'ity fizarana ity dia hasehoko anao ny fomba fametrahana ny fananganana sy fanosehana ny kaody ary ny fametrahana ny tahiry Sonatype rehefa mamoaka famoahana, ary koa ny fametrahana tsiambaratelo.

Mametraka tsiambaratelo

Ho an'ny fivoriambe mandeha ho azy sy ny fametrahana azy dia mila soatoavina miafina maromaro isika, toy ny ID key, ny tenimiafina nampidirintsika rehefa namorona ny lakile, ny lakile PGP mihitsy, ary koa ny fidirana / tenimiafina ho an'ny Sonatype. Azonao atao ny mametraka azy ireo amin'ny fizarana manokana ao amin'ny firafitry ny tahiry:

Mampiasa hetsika Gradle sy Github hamoahana tetikasa Java amin'ny Sonatype Maven Central Repository

Nametraka ireto variables ireto izahay:

  • SONATYPE_USERNAME/SONATYPE_PASSWORD - fidirana/ tenimiafina nampidirinay rehefa nisoratra anarana tamin'ny Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD β€” PGP key ID sy tenimiafina napetraka mandritra ny famoronana.

Te-hiresaka amin'ny antsipiriany bebe kokoa momba ny GPG_KEY_CONTENTS aho. Ny zava-misy dia ny famoahana dia mila fanalahidy PGP manokana. Mba hametrahana azy amin'ny tsiambaratelo dia nampiasako toromarika ary fanampin'izany dia nanao hetsika maromaro.

  • Andao atao encryption ny fanalahidin'ny gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgamin'ny fampidirana ny tenimiafina. Tokony hapetraka ao anaty fari-pitsipika: SECRET_PASSPHRASE
  • Andao avadika ho endrika lahatsoratra amin'ny alΓ lan'ny base64 ny lakile encryption vokatr'izany: base64 9B695056.gpg.gpg > 9B695056.txt. Hametraka ny atiny amin'ny fari-pitsipika: GPG_KEY_CONTENTS.

Mametraka fananganana rehefa manosika kaody sy mamorona PR

Voalohany dia mila mamorona lahatahiry ao amin'ny fototry ny tetikasanao ianao: .github/workflows.

Mariho ny rakitra ao, ohatra, gradle-ci-build.yml miaraka amin'ireto votoaty manaraka ireto:

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

Ity workflow ity dia hotanterahina rehefa manosika ny sampana master, dev ΠΈ testing, koa rehefa mamorona fangatahana misintona.

Ny fizarana asa dia mamaritra ny dingana tsy maintsy tanterahina mifototra amin'ny hetsika voafaritra. Amin'ity tranga ity, hanorina amin'ny dikan-teny farany an'ny ubuntu izahay, hampiasa Java 8, ary hampiasa plugin ho an'ny Gradle ihany koa. eskatos/gradle-command-action@v1, izay, amin'ny fampiasana ny kinova farany an'ny mpanangona, dia handefa ny baiko voalaza ao arguments. hiovaova secrets.SONATYPE_USERNAME ΠΈ secrets.SONATYPE_PASSWORD Ireo no tsiambaratelo nanontanianay teo aloha.

Ny valin'ny fananganana dia ho hita ao amin'ny tabilao Actions:

Mampiasa hetsika Gradle sy Github hamoahana tetikasa Java amin'ny Sonatype Maven Central Repository

Autodeploy rehefa mamoaka famoahana vaovao

Ho an'ny autodeployment dia hamorona fisie workflow misaraka izahay 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}}

Ny rakitra dia saika mitovy amin'ilay teo aloha afa-tsy ny hetsika izay hanombohany azy. Amin'ity tranga ity, ity no hetsika hamoronana marika misy anarana manomboka amin'ny v.

Alohan'ny fametrahana dia mila manala ny fanalahidin'ny PGP avy amin'ny tsiambaratelo isika ary mametraka izany ao amin'ny fototry ny tetikasa, ary koa manala azy. Avy eo dia mila mametraka fari-piainana manokana isika RELEASE_VERSION izay resahinay gradle.build rakitra. Izany rehetra izany dia atao amin'ny fizarana Prepare to publish. Mahazo ny fanalahidinay avy amin'ny fari-piadidiana GPG_KEY_CONTENTS izahay, mandika azy ho rakitra gpg, avy eo decrypt izany amin'ny fametrahana azy ao anaty rakitra secret.gpg.

Avy eo dia miditra amin'ny variable manokana isika GITHUB_REF, izay ahafahantsika mahazo ny dikan-teny nofaritana tamin'ny famoronana ny tag. Manana ny sandany io fari-piainana io amin'ity tranga ity refs/tags/v0.0.2 izay no nanapahanay ireo tarehintsoratra 11 voalohany mba hahazoana ilay dikan-teny manokana. Manaraka, mampiasa ny baiko Gradle mahazatra izahay amin'ny famoahana: test publish

Fanamarinana ny valin'ny fametrahana ao amin'ny tahiry Sonatype

Aorian'ny famoronana ny famoahana dia tokony hanomboka ny fizotran'ny asa voalaza ao amin'ny fizarana teo aloha. Mba hanaovana izany dia mamorona famoahana izahay:

Mampiasa hetsika Gradle sy Github hamoahana tetikasa Java amin'ny Sonatype Maven Central Repository

Amin'ity tranga ity, ny anaran'ny tag dia tsy maintsy manomboka amin'ny v. Raha, aorian'ny fipihana ny Publish release, mandeha tsara ny workflow, dia afaka mandeha any Sonatype Nexus mba hahazoana antoka:

Mampiasa hetsika Gradle sy Github hamoahana tetikasa Java amin'ny Sonatype Maven Central Repository

Nipoitra tao amin'ny tahiry Staging ny artifact. Mipoitra avy hatrany ao amin'ny sata Misokatra izy io, avy eo dia tsy maintsy afindra amin'ny tanana amin'ny sata Akatona amin'ny fipihana ny bokotra mifanaraka amin'izany. Rehefa avy nanamarina fa nahafeno ny fepetra rehetra, ny artifact dia mifindra mankany amin'ny status Close ary tsy azo ovaina intsony. Amin'ity endrika ity dia handeha any MavenCentral izany. Raha tsara ny zava-drehetra dia azonao atao ny manindry ny bokotra Release, ary ny artifact dia handeha any amin'ny tahiry Sonatype.

Mba hampidirana ny artifact ao amin'ny MavenCentral dia mila mangataka izany ianao amin'ny asa izay noforoninay tany am-boalohany. Indray mandeha ihany ianao no mila manao izany, ka sambany no avoakanay. Tsy ilaina ny manao izany amin'ny manaraka, ny zava-drehetra dia ho voarindra ho azy. Navelan'izy ireo haingana ho ahy ny fampifanarahana, saingy 5 andro teo ho eo vao tonga tao amin'ny MavenCentral ny artifact.

Izay ihany, navoakanay tao amin'ny MavenCentral ny artifacty.

rohy mahasoa

  • Similar lahatsoratra, famoahana amin'ny alalan'ny maven ihany
  • Staging repository Sonatype
  • Jira Sonatype izay ilainao hamoronana asa
  • ohatra repository izay misy azy rehetra

Source: www.habr.com