Kasutame Gradle'i ja Github Actions'i Java projekti avaldamiseks Sonatype Maven Central Repository

Selles artiklis kĂ€sitlen ma ĂŒksikasjalikult Java artefakti avaldamise protsessi nullist lĂ€bi Github Actions Sonatype Maven Central Repository's, kasutades Gradle'i ehitajat.

Otsustasin selle artikli kirjutada seoses korraliku Ă”petuse puudumisega ĂŒhest kohast. KĂ”ik vajalik teave tuli kokku koguda erinevatest, mitte just uusimatest allikatest. Kes on huvitatud, on teretulnud edasi lugema.

Repo loomine Sonatype'is

Esimese etapina peame looma repot Sonatype Maven Centralis. Selleks liigume siia, registreerime end ja loome uue ĂŒlesande, paludes meil repo luua. Sisestame oma GroupId VK grupp projekti URL-i lingi projekti jaoks ja SCM url versioonihaldussĂŒsteemi lingi, kus projekt asub. GroupId see peaks olema vormis com.example, com.example.domain, com.example.testsupport, samuti vĂ”ib olla lingina teie githubi kontole: github.com/yourusername -> io.github.yourusername. Igatahes peate tĂ”endama selle domeeni vĂ”i profiili omaniku. Kui olete mĂ€rkinud githubi profiili, palutakse luua avalik repo soovitud nimega.

MÔne aja pÀrast pÀrast kinnitamist loodetakse teie GroupId'i ja saame edasi liikuda jÀrgmise sammu, Gradle'i konfigureerimise juurde.

Konfigureerime Gradle'i

Artikli kirjutamise hetkeks ei leidnud ma Gradle'i jaoks lisandeid, mis aitaksid artefakti avaldamisel. See Ainus leitud plugin, kuid autor on sellest loobunud. SeetÔttu otsustasin kÔik ise teha, Ônneks pole see liiga keeruline.

Esimene samm on vÀlja selgitada Sonatype'i avaldamise nÔuded. Need on jÀrgmised:

  • Allikakoode ja JavaDoc'i olemasolu, st peavad olema olemas -sources.jar ja-javadoc.jar failid. Nagu dokumentatsioonis öeldud, kui allikakoode vĂ”i dokumentatsiooni ei ole vĂ”imalik esitada, vĂ”ib teha tĂŒhja faili -sources.jar vĂ”i -javadoc.jar lihtsa README'ga, et lĂ€bida kontroll.
  • KĂ”ik failid peavad olema allkirjastatud GPG/PGP, ja .asc fail, mis sisaldab allkirja, peab olema kaasatud iga faili jaoks.
  • Olemasolu pom faile
  • Sobivad vÀÀrtused groupId, artifactId ja version. Versioon vĂ”ib olla suvaline string ja ei tohi lĂ”ppeda -SNAPSHOT
  • Peab olema olemas name, description ja url
  • Teave litsentsi, arendajate ja versioonihalduse kohta peab olema olemas.

Need on pÔhireeglid, mida tuleb avaldamisel jÀrgida. TÀielik teave on saadaval siit.

Rakendame need nĂ”uded build.gradle faili. Esmalt lisame kogu vajaliku teabe arendajate, litsentsi, versioonikontrolli sĂŒsteemi kohta, samuti mÀÀrame projekti URL-i, nime ja kirjelduse. Selleks kirjutame lihtsa meetodi:

def customizePom(pom) {
    pom.withXml {
        def root = asNode()

        root.dependencies.removeAll { dep ->
            dep.scope == "test"
        }

        root.children().last() + {
            resolveStrategy = DELEGATE_FIRST

            description 'MÔned artefakti kirjeldused'
            name 'Artefakti nimi'
            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@dev.ru'
                }
            }
        }
    }
}

SeejÀrel tuleb mÀrkida, et ehituse kÀigus genereeritakse -sources.jar ja-javadoc.jar failid. Selleks tuleb sektsiooni java lisada jÀrgmine:

java {
    withJavadocJar()
    withSourcesJar()
}

Liigume viimase nĂ”udmise juurde, GPG/PGP allkirja seadistamine. Selleks ĂŒhendame pistikprogrammi allkirjastamine:

plugins {
    id 'signing'
}

Ja lisame sektsiooni :

signing {
    sign publishing.publications
}

LÔpuks lisame sektsiooni 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
            }
        }
    }
}

Siit sonatypeUsername ja sonatypePassword muutujad, mis sisaldavad sisselogimis- ja parooliteavet, mis loodi registreerimisel sonatype.org.

Seega nÀeb lÔplik build.gradle vÀlja jÀrgmine:

TĂ€ielik kood 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 'MÔned artefakti kirjeldavad andmed'
            name 'Artefakti nimi'
            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 'Apache License, Versioon 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'
                }
            }
        }
    }
}

Tahan mĂ€rkida, et versiooni saame keskkonnamuutujast: System.getenv('RELEASE_VERSION'). Seadistame selle ĂŒles ehituse kĂ€igus ja vĂ”tame sildi nimest.

PGP vÔtme genereerimine

Üks Sonatype'i nĂ”udeid on iga faili allkirjastamine GPG/PGP vĂ”tmega. Selleks lĂ€heme siia ja laadime alla GnuPG utiliidi oma operatsioonisĂŒsteemi jaoks.

  • Genereerime vĂ”tme paari: gpg --gen-key, sisestame kasutajanime, e-posti aadressi ja mÀÀrame parooli.
  • Selgitame vĂ€lja id oma vĂ”tme kĂ€suga: gpg --list-secret-keys --keyid-format short. Id on mĂ€rgitud kaldkriipsu taha, nĂ€iteks: rsa2048/9B695056
  • Avaldame avaliku vĂ”tme serverisse https://keys.openpgp.org kĂ€sklusega: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Eksportime salajase vĂ”tme suvalisse kohta, see on meil hiljem vajalik: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Seame ĂŒles Github Actions

Liigume lÔpetava sammu juurde, seadistame ehituse ja automaatse avaldamise, kasutades Github Actions.
Github Actions on funktsionaalsus, mis vĂ”imaldab automatiseerida töövoogu, rakendades tĂ€islahendust CI/CD. Ehitamine, testimine ja juurutamine vĂ”ivad kĂ€ivituda erinevate sĂŒndmuste korral: koodi pushimine, vĂ€ljaande loomine vĂ”i probleemide esitamine. See funktsionaalsus on tĂ€iesti tasuta avalike hoidlate jaoks.

Selles osas nÀitan, kuidas seadistada koodi kogumist ja edastamist ning juurutamist Sonatype'i hoidlasse vÀljaande vabastamisel, samuti kuidas seadistada salaandmeid.

Seadistame saladused

Automaatseks kogumiseks ja juurutamiseks vajame mitmeid salajasi vÀÀrtusi, nagu vÔtme ID, parool, mille sisestasime vÔtme genereerimise ajal, PGP vÔtme enda ning Sonatype'i sisselogimise/parooli. Neid saab seadistada hoidlakontrollide seadete spetsiaalses vaates:

Kasutame Gradle'i ja Github Actions'i Java projekti avaldamiseks Sonatype Maven Central Repository

Seadistame jÀrgmised muutujad:

  • SONATYPE_USERNAME/SONATYPE_PASSWORD — sisselogimine/parool, mida kasutasime Sonatype'i registreerimisel
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP vĂ”tme ID ja parool, mille seadsime ĂŒles genereerimise ajal.

Muutuja GPG_KEY_CONTENTS kohta tahan peatuda lÀhemalt. Asi on selles, et vÀljaandmiseks on meil vajalik privaatne PGP vÔti. Selle salajastesse asetamiseks kasutasin juhendit ja tegin tÀiendavalt hulga toiminguid.

  • Ć ifreerime meie vĂ”ti kasutades gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpg, sisestades parooli. See tuleks asetada muutujasse: SECRET_PASSPHRASE
  • TĂ”lkime saadud ĆĄifreeritud vĂ”tme tekstivormingusse kasutades base64: base64 9B695056.gpg.gpg > 9B695056.txt. Sisu asetame muutujasse: GPG_KEY_CONTENTS.

Koodi jÔudmisel ja PR-i loomisel seadistamine

Esmalt tuleb luua kaust oma projekti juures: .github/workflows.

Sinna tuleb paigutada fail, nÀiteks gradle-ci-build.yml jÀrgnevate sisu kujul:

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Àivitub, kui pusitakse harudesse master, dev ja testing, samuti pull requestide loomisel.

Jaotises jobs on mĂ€rgitud sammud, mis tuleb jooksutada vastavalt nimetatud sĂŒndmustele. Antud juhul ehitame me viimasel versioonil ubuntu, kasutame Java 8-ndat ning samuti kasutame Gradle’i pistikut eskatos/gradle-command-action@v1, mis kasutab viimasel versioonil kokkuvĂ”tjate kĂ€ivitamiseks antud kĂ€ske argumentide. Muutujad secrets.SONATYPE_USERNAME ja secrets.SONATYPE_PASSWORD need on varad, mille me eelnevalt mÀÀrasime.

Kogumise tulemused kajastuvad vahekaardil Actions:

Kasutame Gradle'i ja Github Actions'i Java projekti avaldamiseks Sonatype Maven Central Repository

Autodeploy uue vÀljaande vÀljalaskmisel

Autodeploy jaoks loome töövoo jaoks eraldi faili gradle-ci-publish.yml:

nimi: publish

sisse:
  push:
    sildid:
      - 'v*'

tööd:
  publish:
    töötab: ubuntu-latest
    sammud:
      - kasutab: actions/checkout@v1
      - nimi: Seadista JDK 8
        kasutab: actions/setup-java@v1
        with:
          java-versioon: 8

      - nimi: Valmistuge avaldamiseks
        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}"

      - nimi: Avaldage Gradlega
        kasutab: eskatos/gradle-command-action@v1
        with:
          gradle-versioon: current
          argumentide: 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, millega see aktiveeritakse. Antud juhul on see sildiga loomise sĂŒndmus, mis algab tĂ€hekombinatsiooniga v.

Enne juurutamist peame tĂ”mbama PGP vĂ”tme saladustest ning asetama selle projekti juurkausta ja dekrĂŒpteerima selle. Edasi peame seadistama spetsiaalse keskkonnamuutuja RELEASE_VERSION millele viitame gradle.build failis. KĂ”ik see toimub osas Valmistuge avaldamiseks. Saame meie vĂ”ti muutuja GPG_KEY_CONTENTS, muundame selle gpg-failiks ja dekrĂŒpteerime selle, asetades faili secret.gpg.

JĂ€rgmisena tutvume erimuutuja GITHUB_REF, millest saame vĂ€lja vĂ”tta versiooni, mille mÀÀrasime sildi loomisel. Sel juhul on selle muutuja vÀÀrtus refs/tags/v0.0.2 , millest lĂ”ikame maha esimesed 11 sĂŒmbolit, et saada tĂ€pselt versioon. Edasi kasutame standardseid Gradle kĂ€ske avaldamiseks: test publish

Kinnitus tulemuste deploimisel Sonatype’i registrisse

PÀrast versiooni loomist peab kÀivituma eelnevas jaotises kirjeldatud töövoog. Selleks loome vÀljalaske:

Kasutame Gradle'i ja Github Actions'i Java projekti avaldamiseks Sonatype Maven Central Repository

samal ajal peab sildi nimi algama v-tÀhega. Kui pÀrast Publish release'i nupule vajutamist töövoog edukalt töötab, saame minna Sonatype Nexus et seda kinnitada:

Kasutame Gradle'i ja Github Actions'i Java projekti avaldamiseks Sonatype Maven Central Repository

Artefakt ilmub Staging registrisse. Alguses on see olekus Open, seejĂ€rel tuleb see kĂ€sitsi sulgeda, vajutades vastavat nuppu. PĂ€rast kĂ”igi nĂ”uete tĂ€itmise kontrollimist lĂ€heb artefakt olekusse Close ja ei ole enam muudetav. Sellisel kujul jĂ”uab see MavenCentralisse. Kui kĂ”ik on hĂ€sti, saab vajutada nuppu Release, sel juhul jĂ”uab artefakt Sonatype’i registrisse.

Kuna artefakt jĂ”uda MavenCentral-i, tuleb seda taotleda ĂŒlesandes, mille me alguses lĂ”ime. Seda on vaja teha ainult ĂŒks kord, kuna me avaldame seda esmakordselt. Edaspidi ei ole seda enam vajalik, kĂ”ik sĂŒnkroniseeritakse automaatselt. SĂŒnkroniseerimise lubamine toimus kiiresti, kuid et artefakt oleks MavenCentralis kergesti kĂ€tte saadav, lĂ€ks umbes 5 pĂ€eva.

Sellega on kÔik, oleme avaldanud oma artefakti MavenCentralis.

Kasulikud lingid

  • Sarnane artikkel, ainult avaldamine lĂ€bi maven
  • Staging repo Sonatype
  • Jira Sonatype, kus tuleb luua ĂŒlesanne
  • NĂ€ide reposiit, kus see kĂ”ik on seadistatud

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster