Gradle'i ja Githubi toimingute kasutamine Java projekti avaldamiseks Sonatype Maven Central Repository's

Selles artiklis tahan lähemalt uurida Java artefakti avaldamise protsessi nullist Githubi toimingute kaudu Sonatype Maveni keskvaramusse Gradle builderi abil.

Otsustasin selle artikli kirjutada, kuna ühes kohas puudub tavaline õpetus. Kogu info tuli jupikaupa erinevatest allikatest kokku korjata, pealegi mitte päris värske. Keda huvitab, tere tulemast kassi alla.

Hoidla loomine Sonatype'is

Esimene samm on hoidla loomine Sonatype Maven Centralis. Selleks me läheme kliki siia, registreeruge ja looge uus ülesanne, paludes meil luua hoidla. Sõidame oma sisse GroupId projekt, Projekti URL projekti link ja SCM-i URL link versioonikontrollisüsteemile, milles projekt asub. GroupId siin peaks olema kujul com.example, com.example.domain, com.example.testsupport ja see võib olla ka teie githubi lingi kujul: github.com/yourusername -> io.github.yourusername. Igal juhul peate kinnitama selle domeeni või profiili omandiõiguse. Kui määrasite Githubi profiili, palutakse teil luua soovitud nimega avalik hoidla.

Mõni aeg pärast kinnitamist luuakse teie GroupId ja saame liikuda järgmise sammu, Gradle'i seadistamise juurde.

Gradle'i seadistamine

Kirjutamise ajal ei leidnud ma Gradle'i pistikprogramme, mis aitaksid artefakti avaldamisel. see ainsa pistikprogrammi, mille ma leidsin, aga autor keeldus seda enam toetamast. Seetõttu otsustasin teha kõik ise, kuna seda pole liiga keeruline teha.

Esimese asjana tuleb välja mõelda, millised on Sonatype'i nõuded avaldamisele. Need on järgmised:

  • Lähtekoodide ja JavaDoc saadavus st. peab osalema -sources.jar и-javadoc.jar failid. Nagu dokumentides öeldud, kui lähtekoode või dokumentatsiooni ei ole võimalik esitada, võite teha mannekeeni -sources.jar või -javadoc.jar testi läbimiseks on sees lihtne README.
  • Kõik failid peavad olema allkirjastatud GPG/PGPJa .asc iga faili puhul tuleb lisada allkirja sisaldav fail.
  • kättesaadavus pom faili
  • Õiged väärtused groupId, artifactId и version. Versioon võib olla suvaline string ja see ei saa lõppeda tähega -SNAPSHOT
  • Kohalolek on vajalik name, description и url
  • Litsentsi, arendajate ja versioonikontrollisüsteemi kohta teabe olemasolu

Need on põhireeglid, mida tuleb avaldamisel järgida. Täielik teave saadaval siin.

Rakendame neid nõudeid aastal build.gradle faili. Esmalt lisame kogu vajaliku info arendajate, litsentside, versioonihaldussüsteemi kohta ning määrame ka projekti URL-i, nime ja kirjelduse. Kirjutame selle jaoks lihtsa meetodi:

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

Järgmiseks peate selle genereeritud koostu käigus täpsustama -sources.jar и-javadoc.jar failid. Selle jaotise jaoks java peate lisama järgmise:

java {
    withJavadocJar()
    withSourcesJar()
}

Liigume edasi viimase nõude juurde, milleks on GPG/PGP allkirja seadistamine. Selleks ühendage pistikprogramm signing:

plugins {
    id 'signing'
}

Ja lisage jaotis:

signing {
    sign publishing.publications
}

Lõpuks lisame jaotise 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
            }
        }
    }
}

see on sonatüüpKasutajanimi и sonatüüpParool muutujad, mis sisaldavad registreerimisel loodud kasutajanime ja parooli sonatype.org.

Seega finaal build.gradle näeb välja selline:

Täielik build.gradle kood

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

Tahan märkida, et saame versiooni keskkonnamuutujast: System.getenv('RELEASE_VERSION'). Me paljastame selle kokkupaneku ajal ja võtame selle sildi nimest.

PGP võtme genereerimine

Üks Sonatype'i nõudeid on, et kõik failid oleksid allkirjastatud GPG/PGP-võtmega. Selleks me läheme kliki siia ja laadige alla oma operatsioonisüsteemi jaoks mõeldud GnuPG utiliit.

  • Loome võtmepaari: gpg --gen-key, sisestage kasutajanimi, e-posti aadress ja määrake ka parool.
  • Saame teada id meie võti käsuga: gpg --list-secret-keys --keyid-format short. Id määratakse pärast kaldkriipsu, näiteks: rsa2048/9B695056
  • Avaliku võtme avaldamine serveris https://keys.openpgp.org käsuga: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Ekspordime salajase võtme suvalisse kohta, vajame seda tulevikus: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Githubi toimingute seadistamine

Liigume edasi viimasesse etappi, seadistame ehituse ja avaldame automaatselt Githubi toimingute abil.
Github Actions on funktsioon, mis võimaldab teil töövoogu automatiseerida, rakendades täielikku CI / CD tsüklit. Ehitamist, testimist ja juurutamist võivad käivitada erinevad sündmused: kooditõuge, väljalaske loomine või probleemid. See funktsioon on avalike hoidlate jaoks täiesti tasuta.

Selles jaotises näitan teile, kuidas seadistada koostamis- ja tõukekoodi ning juurutada Sonatype'i hoidlasse vabastamisel, samuti seadistada saladusi.

Panime saladused

Automaatseks kokkupanekuks ja juurutamiseks vajame mitmeid salajasi väärtusi, nagu võtme ID, parool, mille sisestasime võtme genereerimisel, PGP-võti ise ja Sonatype'i sisselogimine/parool. Saate need määrata hoidla sätete spetsiaalses jaotises:

Gradle'i ja Githubi toimingute kasutamine Java projekti avaldamiseks Sonatype Maven Central Repository's

Määrame järgmised muutujad:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD – sisselogimine / parool, mille sisestasime Sonatype'i registreerimisel
  • SIGNING_KEYID/SIGNING_PASSWORD – genereerimise käigus määratud PGP-võtme ID ja parool.

Ma tahan muutuja GPG_KEY_CONTENTS juures üksikasjalikumalt peatuda. Fakt on see, et avaldamiseks vajame privaatset PGP-võtit. Selle saladustesse postitamiseks kasutasin juhendamine ja lisaks teinud mitmeid toiminguid.

  • Krüpteerime oma võtme gpg-ga: gpg --symmetric --cipher-algo AES256 9B695056.gpgsisestades parooli. See tuleks asetada muutujasse: SECRET_PASSPHRASE
  • Tõlgime vastuvõetud krüptitud võtme tekstivormi kasutades base64: base64 9B695056.gpg.gpg > 9B695056.txt. Sisu paigutatakse muutujasse: GPG_KEY_CONTENTS.

Koostage seadistus koodi vajutamisel ja suhtekorralduse loomisel

Kõigepealt peate oma projekti juurtes looma kausta: .github/workflows.

Märgistage selles fail näiteks gradle-ci-build.yml järgmise sisuga:

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

See töövoog käivitatakse harudesse tõukamisel master, dev и testing, ka tõmbamistaotluste loomisel.

Tööde jaotis määrab kindlaks määratud sündmuste puhul teostatavad sammud. Sel juhul tugineme ubuntu uusimale versioonile, kasutame Java 8 ja kasutame ka Gradle'i pistikprogrammi eskatos/gradle-command-action@v1mis ehitaja uusimat versiooni kasutades käivitab punktis määratud käsud arguments. Muutujad secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD need on saladused, mida me varem küsisime.

Järgutulemused kajastuvad vahekaardil Toimingud:

Gradle'i ja Githubi toimingute kasutamine Java projekti avaldamiseks Sonatype Maven Central Repository's

Automaatne juurutamine, kui uus versioon avaldatakse

Loome automaatseks juurutamiseks eraldi töövoofaili 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}}

Fail on peaaegu identne eelmisega, välja arvatud sündmus, mille korral see käivitatakse. Sel juhul luuakse silt, mille nimi algab tähega v.

Enne juurutamist peame eraldama PGP-võtme saladustest ja asetama selle projekti juurtesse ning dekrüpteerima selle. Järgmiseks peame määrama spetsiaalse keskkonnamuutuja RELEASE_VERSION millele me viitame gradle.build faili. Kõik see tehakse jaotises Prepare to publish. Saame oma võtme muutujast GPG_KEY_CONTENTS, tõlgime selle gpg-failiks ja seejärel dekrüpteerime selle faili lisades secret.gpg.

Järgmisena pöördume spetsiaalse muutuja poole GITHUB_REF, kust saame märgendi loomisel määratud versiooni. See muutuja on antud juhul asjakohane. refs/tags/v0.0.2 millest konkreetse versiooni saamiseks lõikasime ära esimesed 11 tähemärki. Järgmisena kasutame avaldamiseks standardseid Gradle'i käske: test publish

Juurutustulemuste kontrollimine Sonatype'i hoidlas

Pärast väljalaske loomist peaks algama eelmises jaotises kirjeldatud töövoog. Selleks looge väljalase:

Gradle'i ja Githubi toimingute kasutamine Java projekti avaldamiseks Sonatype Maven Central Repository's

sildi nimi peab algama tähega v. Kui pärast valikul Avalda väljalase klõpsamist töövoog edukalt lõpule jõuab, võime minna aadressile Sonatüüp Nexus veenduda:

Gradle'i ja Githubi toimingute kasutamine Java projekti avaldamiseks Sonatype Maven Central Repository's

Artefakt ilmus lavastamishoidlasse. See ilmub kohe olekusse Ava, seejärel tuleb see vastavat nuppu vajutades käsitsi üle viia olekusse Close. Pärast kõigi nõuete täitmise kontrollimist läheb artefakt olekusse Sule ja pole enam muutmiseks saadaval. Sellisel kujul jõuab see MavenCentrali. Kui kõik on korras, võite nuppu vajutada Vabastageja artefakt jõuab Sonatype'i hoidlasse.

Selleks, et artefakt MavenCentrali pääseks, peate seda küsima ülesandes, mille me alguses lõime. Peate seda tegema ainult üks kord, seega avaldame esimest korda. Järgnevatel kordadel pole see vajalik, kõik sünkroonitakse automaatselt. Nad lülitasid minu jaoks sünkroonimise kiiresti sisse, kuid kulus umbes 5 päeva, enne kui artefakt MavenCentralis kättesaadavaks sai.

See on kõik, avaldasime oma artefakti MavenCentralis.

Kasulikud lingid

  • Sarnased artikkel, avaldada ainult maveni kaudu
  • Peatumine hoidla Sonatüüp
  • Jira Sonatüüp, milles ülesanne luua
  • Näide hoidla, kus see kõik on seadistatud

Allikas: www.habr.com