Uporaba dejanj Gradle in Github za objavo projekta Java v osrednjem skladišču Sonatype Maven

V tem članku si želim podrobno ogledati postopek objave artefakta Java od začetka prek Github Actions v Sonatype Maven Central Repository z graditeljem Gradle.

Za pisanje tega članka sem se odločil zaradi pomanjkanja običajnega tutoriala na enem mestu. Vse podatke je bilo treba zbirati po delih iz različnih virov, poleg tega ne povsem svežih. Kogar briga, dobrodošel pod kat.

Ustvarjanje repozitorija v Sonatype

Prvi korak je ustvariti repozitorij v Sonatype Maven Central. Za to gremo tukaj, se registrirajte in ustvarite novo nalogo ter nas prosite, da ustvarimo repozitorij. Vozimo se v našem GroupId projekt, URL projekta povezava projekta in URL SCM povezava do sistema za nadzor različic, v katerem se nahaja projekt. GroupId tukaj mora biti v obliki com.example, com.example.domain, com.example.testsupport, lahko pa tudi v obliki povezave do vašega githuba: github.com/vašeuporabniškoime -> io.github.vaše uporabniško ime. V vsakem primeru boste morali preveriti lastništvo te domene ali profila. Če ste določili profil github, boste pozvani, da ustvarite javno skladišče z želenim imenom.

Nekaj ​​časa po potrditvi bo ustvarjen vaš GroupId in lahko nadaljujemo z naslednjim korakom, konfiguracijo Gradle.

Konfiguriranje Gradle

V času pisanja tega članka nisem našel vtičnikov Gradle, ki bi lahko pomagali pri objavi artefakta. To edini vtičnik, ki sem ga našel, pa je avtor zavrnil nadaljnjo podporo. Zato sem se odločil, da vse naredim sam, saj to ni preveč težko narediti.

Prva stvar, ki jo je treba ugotoviti, so zahteve Sonatype za objavo. To so naslednje:

  • Razpoložljivost izvornih kod in JavaDoc, tj. se mora udeležiti -sources.jar и-javadoc.jar datoteke. Kot je navedeno v dokumentaciji, če ni mogoče zagotoviti izvorne kode ali dokumentacije, lahko naredite lutko -sources.jar ali -javadoc.jar s preprostim README znotraj, da opravite preizkus.
  • Vse datoteke morajo biti podpisane z GPG/PGPIn .asc datoteka, ki vsebuje podpis, mora biti vključena v vsako datoteko.
  • razpoložljivost pom mapa
  • Pravilne vrednosti groupId, artifactId и version. Različica je lahko poljuben niz in se ne sme končati z -SNAPSHOT
  • Obvezna prisotnost name, description и url
  • Prisotnost informacij o licenci, razvijalcih in sistemu za nadzor različic

To so osnovna pravila, ki jih je treba upoštevati pri objavi. Na voljo so vse informacije tukaj.

Te zahteve izvajamo v build.gradle mapa. Najprej dodamo vse potrebne informacije o razvijalcih, licencah, sistemu za nadzor različic in nastavimo url, ime in opis projekta. Napišimo preprosto metodo za to:

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

Nato morate to določiti med ustvarjenim sklopom -sources.jar и-javadoc.jar datoteke. Za ta razdelek java morate dodati naslednje:

java {
    withJavadocJar()
    withSourcesJar()
}

Preidimo na zadnjo zahtevo, nastavitev podpisa GPG/PGP. Če želite to narediti, povežite vtičnik signing:

plugins {
    id 'signing'
}

In dodajte razdelek:

signing {
    sign publishing.publications
}

Nazadnje dodajmo razdelek 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
            }
        }
    }
}

Tukaj sonatypeUsername и sonatypePassword spremenljivke, ki vsebujejo prijavo in geslo, ustvarjeno med registracijo na sonatype.org.

Torej finale build.gradle bo videti tako:

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

Želim opozoriti, da dobimo različico iz spremenljivke okolja: System.getenv('RELEASE_VERSION'). Izpostavili ga bomo med sestavljanjem in ga vzeli iz imena oznake.

Generiranje ključev PGP

Ena od zahtev družbe Sonatype je, da so vse datoteke podpisane s ključem GPG/PGP. Za to gremo tukaj in prenesite pripomoček GnuPG za vaš operacijski sistem.

  • Ustvarimo par ključev: gpg --gen-key, vnesite uporabniško ime, e-pošto in nastavite tudi geslo.
  • Ugotavljamo id naš ključ z ukazom: gpg --list-secret-keys --keyid-format short. ID bo naveden za poševnico, na primer: rsa2048/9B695056
  • Objava javnega ključa na strežniku https://keys.openpgp.org z ukazom: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Skrivni ključ izvozimo na poljubno mesto, potrebovali ga bomo v prihodnosti: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Nastavitev Github Actions

Pojdimo na zadnjo stopnjo, nastavimo gradnjo in samodejno objavo z Github Actions.
Github Actions je funkcija, ki vam omogoča avtomatizacijo poteka dela z implementacijo celotnega cikla CI/CD. Gradnjo, testiranje in uvajanje lahko sprožijo različni dogodki: potiskanje kode, ustvarjanje izdaje ali težave. Ta funkcija je popolnoma brezplačna za javne repozitorije.

V tem razdelku vam bom pokazal, kako nastaviti kodo za gradnjo in potiskanje ter jo namestiti v repozitorij Sonatype ob izdaji, kot tudi nastaviti skrivnosti.

Postavljamo skrivnosti

Za samodejno sestavljanje in uvajanje potrebujemo številne tajne vrednosti, kot so ID ključa, geslo, ki smo ga vnesli pri generiranju ključa, sam ključ PGP in prijava/geslo Sonatype. Nastavite jih lahko v posebnem razdelku v nastavitvah repozitorija:

Uporaba dejanj Gradle in Github za objavo projekta Java v osrednjem skladišču Sonatype Maven

Nastavimo naslednje spremenljivke:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - prijava / geslo, ki smo ga vnesli ob registraciji pri Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — ID ključa PGP in geslo, nastavljeno med ustvarjanjem.

Želim se podrobneje posvetiti spremenljivki GPG_KEY_CONTENTS. Dejstvo je, da za objavo potrebujemo zasebni ključ PGP. Da bi ga objavil v skrivnostih, sem uporabil navodilo in poleg tega izvedli številne ukrepe.

  • Šifrirajmo naš ključ z gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgz vnosom gesla. Postavite ga v spremenljivko: SECRET_PASSPHRASE
  • Prevedimo prejeti šifrirani ključ v besedilno obliko z uporabo base64: base64 9B695056.gpg.gpg > 9B695056.txt. Vsebina bo postavljena v spremenljivko: GPG_KEY_CONTENTS.

Nastavitev gradnje pri potiskanju kode in ustvarjanju PR

Najprej morate ustvariti mapo v korenu vašega projekta: .github/workflows.

V njej označite datoteko, npr. gradle-ci-build.yml z naslednjo vsebino:

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

Ta potek dela se bo izvajal pri potiskanju v veje master, dev и testing, tudi pri ustvarjanju zahtev za vlečenje.

Razdelek o opravilih določa korake, ki jih je treba izvesti ob podanih dogodkih. V tem primeru bomo gradili na najnovejši različici ubuntuja, uporabljali Javo 8 in uporabljali tudi vtičnik za Gradle eskatos/gradle-command-action@v1ki bo z uporabo najnovejše različice graditelja izvajal ukaze, določene v arguments. Spremenljivke secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD to so skrivnosti, ki smo jih vprašali prej.

Rezultati gradnje bodo prikazani na zavihku Dejanja:

Uporaba dejanj Gradle in Github za objavo projekta Java v osrednjem skladišču Sonatype Maven

Samodejno uvedi, ko je izdana nova izdaja

Ustvarimo ločeno datoteko poteka dela za samodejno uvajanje 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}}

Datoteka je skoraj enaka prejšnji, razen dogodka, v katerem se bo sprožila. V tem primeru je to dogodek ustvarjanja oznake z imenom, ki se začne z v.

Pred uvedbo moramo ključ PGP ekstrahirati iz skrivnosti in ga postaviti v koren projekta ter ga dešifrirati. Nato moramo nastaviti posebno spremenljivko okolja RELEASE_VERSION na katerega se sklicujemo gradle.build mapa. Vse to se naredi v razdelku Prepare to publish. Naš ključ dobimo iz spremenljivke GPG_KEY_CONTENTS, ga prevedemo v datoteko gpg, nato pa dešifriramo tako, da ga vstavimo v datoteko secret.gpg.

Nato se obrnemo na posebno spremenljivko GITHUB_REF, iz katerega lahko pridobimo različico, ki smo jo nastavili pri ustvarjanju oznake. Ta spremenljivka je v tem primeru pomembna. refs/tags/v0.0.2 iz katerega smo izrezali prvih 11 znakov, da dobimo točno določeno različico. Nato za objavo uporabimo standardne ukaze Gradle: test publish

Preverjanje rezultatov uvajanja v skladišču Sonatype

Ko je izdaja ustvarjena, se mora začeti potek dela, opisan v prejšnjem razdelku. Če želite to narediti, ustvarite izdajo:

Uporaba dejanj Gradle in Github za objavo projekta Java v osrednjem skladišču Sonatype Maven

ime oznake se mora začeti z v. Če se po kliku na Objavi izdajo potek dela uspešno zaključi, lahko gremo na Sonatip Nexus Prepričati se:

Uporaba dejanj Gradle in Github za objavo projekta Java v osrednjem skladišču Sonatype Maven

Artefakt se je pojavil v repozitoriju Staging. Takoj se prikaže v statusu Odprto, nato pa ga je treba ročno prenesti v stanje Zapri s pritiskom na ustrezno tipko. Po preverjanju, ali so izpolnjene vse zahteve, artefakt preide v stanje Zapri in ni več na voljo za spreminjanje. V tej obliki bo končal v MavenCentral. Če je vse v redu, lahko pritisnete gumb Sprostite, in artefakt bo končal v skladišču Sonatype.

Da artefakt pride v MavenCentral, ga morate zahtevati v nalogi, ki smo jo ustvarili na samem začetku. To morate storiti le enkrat, zato objavljamo prvič. V naslednjih časih to ni potrebno, vse se bo samodejno sinhroniziralo. Hitro so mi vklopili sinhronizacijo, vendar je trajalo približno 5 dni, da je artefakt postal na voljo v MavenCentral.

To je vse, naš artefakt smo objavili v MavenCentral.

Uporabne povezave

  • Podobno članek, objavi samo prek maven
  • Uprizoritev repozitorij Sonatip
  • Jira Sonatype, v katerem ustvarite nalogo
  • Primer repozitorij, kjer je vse nastavljeno

Vir: www.habr.com