Notkun Gradle og Github aðgerðir til að birta Java Project í Sonatype Maven Central Repository

Í þessari grein vil ég skoða ítarlega ferlið við að birta Java artifact frá grunni í gegnum Github Actions til Sonatype Maven Central Repository með því að nota Gradle smiðinn.

Ég ákvað að skrifa þessa grein vegna skorts á venjulegu kennsluefni á einum stað. Öllum upplýsingum þurfti að safna stykki fyrir stykki úr ýmsum áttum, þar að auki ekki alveg ferskt. Hverjum er ekki sama, velkominn undir kött.

Að búa til geymslu í Sonatype

Fyrsta skrefið er að búa til geymslu í Sonatype Maven Central. Fyrir þetta förum við hér, skráðu þig og búðu til nýtt verkefni og biður okkur um að búa til geymslu. Við keyrum í okkar GroupId verkefni, Slóð verkefnis verkefnatengil og SCM slóð tengill á útgáfustýringarkerfið sem verkefnið er í. GroupId hér ætti að vera af forminu com.example, com.example.domain, com.example.testsupport, og getur líka verið í formi tengils á githubinn þinn: github.com/notandanafn þitt -> io.github.notandanafn þitt. Í öllum tilvikum þarftu að staðfesta eignarhald á þessu léni eða prófíl. Ef þú tilgreindir github prófíl verðurðu beðinn um að búa til opinbera geymslu með því nafni sem þú vilt.

Nokkru eftir staðfestingu verður GroupId þitt búið til og við getum haldið áfram í næsta skref, Gradle stillingar.

Stillir Gradle

Þegar þetta var skrifað fann ég ekki Gradle viðbætur sem gætu hjálpað til við að birta gripinn. Það eina viðbótin sem ég fann, hins vegar neitaði höfundurinn að styðja það frekar. Þess vegna ákvað ég að gera allt sjálfur, þar sem það er ekki of erfitt að gera þetta.

Það fyrsta sem þarf að reikna út eru kröfur Sonatype um útgáfu. Þau eru eftirfarandi:

  • Framboð frumkóða og JavaDoc, þ.e. verður að mæta -sources.jar и-javadoc.jar skrár. Eins og fram kemur í skjölunum, ef ekki er hægt að leggja fram frumkóða eða skjöl, geturðu búið til dummy -sources.jar eða -javadoc.jar með einfaldri README inni til að standast prófið.
  • Allar skrár verða að vera undirritaðar með GPG/PGPOg .asc skráin sem inniheldur undirskriftina verður að fylgja með fyrir hverja skrá.
  • framboð pom skrá
  • Rétt gildi groupId, artifactId и version. Útgáfan getur verið handahófskenndur strengur og getur ekki endað með -SNAPSHOT
  • Viðvera krafist name, description и url
  • Tilvist upplýsinga um leyfið, forritara og útgáfustýringarkerfi

Þetta eru grundvallarreglur sem þarf að fylgja við útgáfu. Allar upplýsingar fáanlegar hér.

Við innleiðum þessar kröfur í build.gradle skrá. Í fyrsta lagi skulum við bæta við öllum nauðsynlegum upplýsingum um forritara, leyfi, útgáfustýringarkerfi og einnig setja slóð, nafn og lýsingu á verkefninu. Við skulum skrifa einfalda aðferð fyrir þetta:

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

Næst þarftu að tilgreina það meðan á samsetningunni stendur -sources.jar и-javadoc.jar skrár. Fyrir þennan kafla java þú þarft að bæta við eftirfarandi:

java {
    withJavadocJar()
    withSourcesJar()
}

Við skulum halda áfram að síðustu kröfunni, setja upp GPG/PGP undirskrift. Til að gera þetta skaltu tengja viðbótina signing:

plugins {
    id 'signing'
}

Og bættu við hluta:

signing {
    sign publishing.publications
}

Að lokum skulum við bæta við kafla 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
            }
        }
    }
}

Hér sonatype Notandanafn и sónatypeLykilorð breytur sem innihalda innskráningu og lykilorð sem búið var til við skráningu á sonatype.org.

Þar með úrslitaleikurinn build.gradle mun líta svona út:

Full build.gradle kóða

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

Ég vil taka fram að við fáum útgáfuna frá umhverfisbreytunni: System.getenv('RELEASE_VERSION'). Við munum afhjúpa það meðan á samsetningu stendur og taka það af merkisheitinu.

PGP lyklagerð

Ein af kröfum Sonatype er að allar skrár séu undirritaðar með GPG/PGP lykli. Fyrir þetta förum við hér og hlaðið niður GnuPG tólinu fyrir stýrikerfið þitt.

  • Við búum til lykilpar: gpg --gen-key, sláðu inn notandanafn, tölvupóst og stilltu einnig lykilorð.
  • Við komumst að því id lykillinn okkar með skipuninni: gpg --list-secret-keys --keyid-format short. Auðkenni verður tilgreint á eftir skástrikinu, til dæmis: rsa2048/9B695056
  • Birtir opinbera lykilinn á netþjóninn https://keys.openpgp.org með skipun: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Við flytjum út leynilykilinn á handahófskenndan stað, við munum þurfa á honum að halda í framtíðinni: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Setja upp Github Actions

Við skulum halda áfram á lokastigið, setja upp bygginguna og birta sjálfkrafa með því að nota Github Actions.
Github Actions er eiginleiki sem gerir þér kleift að gera sjálfvirkan verkflæði með því að innleiða fulla CI / CD hringrás. Byggja, prófa og dreifa er hægt að koma af stað með ýmsum atburðum: kóða ýta, útgáfu útgáfu eða vandamálum. Þessi virkni er algerlega ókeypis fyrir opinberar geymslur.

Í þessum hluta mun ég sýna þér hvernig á að setja upp byggingu og ýta kóða og dreifa á Sonatype geymsluna við útgáfu, auk þess að setja upp leyndarmál.

Við setjum leyndarmál

Fyrir sjálfvirka samsetningu og uppsetningu þurfum við fjölda leynilegra gilda, svo sem lykilauðkenni, lykilorðið sem við slóum inn þegar lykillinn var búinn til, PGP lykilinn sjálfan og Sonatype innskráningu/lykilorð. Þú getur stillt þau í sérstökum hluta í stillingum geymslunnar:

Notkun Gradle og Github aðgerðir til að birta Java Project í Sonatype Maven Central Repository

Við setjum eftirfarandi breytur:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - innskráningu / lykilorð sem við slóum inn við skráningu hjá Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP lykilauðkenni og lykilorð stillt við gerð.

Ég vil dvelja nánar við breytuna GPG_KEY_CONTENTS. Staðreyndin er sú að fyrir útgáfu þurfum við einka PGP lykil. Til þess að birta það í leyndarmálum notaði ég kennsla og gerði auk þess ýmsar aðgerðir.

  • Við skulum dulkóða lykilinn okkar með gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgmeð því að slá inn lykilorð. Það ætti að vera sett í breytu: SECRET_PASSPHRASE
  • Við skulum þýða móttekna dulkóðaða lykilinn í textaform með því að nota base64: base64 9B695056.gpg.gpg > 9B695056.txt. Efnið verður sett í breytuna: GPG_KEY_CONTENTS.

Byggja uppsetningu þegar ýtt er á kóða og búið til PR

Fyrst þarftu að búa til möppu í rót verkefnisins: .github/workflows.

Í henni skaltu merkja skrána, til dæmis, gradle-ci-build.yml með eftirfarandi innihaldi:

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

Þetta verkflæði verður framkvæmt þegar ýtt er á útibú master, dev и testing, einnig þegar þú býrð til dráttarbeiðnir.

Verkhlutinn tilgreinir skrefin sem á að framkvæma á tilgreindum atburðum. Í þessu tilfelli munum við byggja á nýjustu útgáfunni af ubuntu, nota Java 8 og einnig nota viðbótina fyrir Gradle eskatos/gradle-command-action@v1sem, með því að nota nýjustu útgáfuna af smiðnum, mun keyra skipanirnar sem tilgreindar eru í arguments. Breytur secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD þetta eru leyndarmálin sem við spurðum áðan.

Byggingarniðurstöðurnar munu endurspeglast á flipanum Aðgerðir:

Notkun Gradle og Github aðgerðir til að birta Java Project í Sonatype Maven Central Repository

Sjálfvirk dreifing þegar ný útgáfa kemur út

Við skulum búa til sérstaka verkflæðisskrá fyrir sjálfvirka dreifingu 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}}

Skráin er næstum eins og sú fyrri, fyrir utan atburðinn þar sem hún verður ræst. Í þessu tilviki er þetta tilvikið að búa til merki með nafni sem byrjar á v.

Fyrir dreifingu þurfum við að draga PGP lykilinn úr leyndarmálunum og setja hann í rót verkefnisins, sem og afkóða hann. Næst þurfum við að stilla sérstaka umhverfisbreytu RELEASE_VERSION sem við vísum til gradle.build skrá. Allt er þetta gert í kaflanum Prepare to publish. Við fáum lykilinn okkar úr GPG_KEY_CONTENTS breytunni, þýðum hana í gpg skrá og afkóða hana síðan með því að setja hana í skrána secret.gpg.

Næst snúum við okkur að sérstakri breytu GITHUB_REF, þaðan sem við getum fengið útgáfuna sem við stillum þegar merkið var búið til. Þessi breyta á við í þessu tilviki. refs/tags/v0.0.2 þar sem við klipptum fyrstu 11 stafina af til að fá ákveðna útgáfu. Næst notum við staðlaðar Gradle skipanir til að birta: test publish

Athugun á niðurstöðum dreifingar í Sonatype geymslunni

Eftir að útgáfan er búin til ætti verkflæðið sem lýst er í fyrri hlutanum að byrja. Til að gera þetta skaltu búa til útgáfu:

Notkun Gradle og Github aðgerðir til að birta Java Project í Sonatype Maven Central Repository

merkisnafnið verður að byrja á v. Ef verkflæðinu lýkur eftir að hafa smellt á Birta útgáfu, getum við farið á Sonatype Nexus til að ganga úr skugga um:

Notkun Gradle og Github aðgerðir til að birta Java Project í Sonatype Maven Central Repository

Munurinn birtist í Staging geymslunni. Það birtist strax í Opna stöðu, þá verður að flytja það handvirkt í Loka stöðu með því að ýta á viðeigandi hnapp. Eftir að hafa gengið úr skugga um að allar kröfur séu uppfylltar fer gripurinn í Loka stöðuna og er ekki lengur hægt að breyta. Í þessu formi mun það enda í MavenCentral. Ef allt er í lagi geturðu ýtt á hnappinn Slepptu, og gripurinn mun enda í Sonatype geymslunni.

Til þess að gripurinn komist inn í MavenCentral þarftu að biðja um hann í verkefninu sem við bjuggum til strax í upphafi. Þú þarft aðeins að gera þetta einu sinni, þannig að við birtum í fyrsta skipti. Í síðari tímum er þetta ekki krafist, allt verður samstillt sjálfkrafa. Þeir kveiktu fljótt á samstillingu fyrir mig, en það tók um 5 daga fyrir gripinn að verða fáanlegur í MavenCentral.

Það er allt, við höfum birt gripinn okkar í MavenCentral.

gagnlegir krækjur

  • Svipað grein, birtu aðeins í gegnum maven
  • Staging geymsla Sónatýpa
  • Jira Sónagerð til að búa til verkefnið
  • Dæmi geymsla þar sem það er allt sett upp

Heimild: www.habr.com