Kushandisa Gradle uye Github Zviito Kuburitsa Java Project kuSonatype Maven Central Repository

Muchikamu chino, ndinoda kunyatsotarisisa maitiro ekudhindisa Java artifact kubva kutanga kuburikidza neGithub Actions kune Sonatype Maven Central Repository uchishandisa Gradle muvaki.

Ndakafunga kunyora chinyorwa ichi nekuda kwekushaikwa kwechidzidzo chenguva dzose munzvimbo imwechete. Ruzivo rwese rwaifanira kuunganidzwa chidimbu nechidimbu kubva kwakasiyana zvinyorwa, uyezve, kwete kutsva zvachose. Ndiani ane hanya, anogamuchirwa pasi pekati.

Kugadzira repository muSonatype

Danho rekutanga kugadzira repository muSonatype Maven Central. Nokuda kwaizvozvi tinoenda pano, nyoresa uye gadzira basa idzva, uchikumbira kuti tigadzire repository. Tinotyaira zvedu GroupId chirongwa, Project URL project link uye SCM url chinongedzo kune vhezheni control system umo purojekiti iripo. GroupId pano panofanira kuva yefomu com.example, com.example.domain, com.example.testsupport, uye inogonawo kunge iri muchimiro chekubatanidza kune github yako: github.com/yourusername -> io.github.yourusername. Chero zvazvingava, iwe unozofanirwa kuona kuti uridzi weiyi domain kana mbiri. Kana iwe wakatsanangura github mbiri, iwe uchakumbirwa kugadzira repository yeruzhinji ine zita raunoda.

Imwe nguva mushure mekusimbiswa, GroupId yako ichagadzirwa uye isu tinogona kuenderera kune inotevera nhanho, Gradle kumisikidza.

Kugadzirisa Gradle

Panguva yekunyora, ini handina kuwana Gradle plugins inogona kubatsira nekuburitsa iyo artifact. ichi iyo chete plugin yandakawana, zvisinei, munyori akaramba kuitsigira. Nokudaro, ndakasarudza kuita zvose ini, nokuti hazvina kuoma kuita izvi.

Chinhu chekutanga kufunga ndeche Sonatype inodiwa pakutsikisa. Ndiwo anotevera:

  • Kuvepo kwemasource codes uye JavaDoc, kureva. anofanira kupinda -sources.jar ΠΈ-javadoc.jar mafaira. Sezvakataurwa muzvinyorwa, kana zvisingaite kupa makodhi makodhi kana zvinyorwa, unogona kuita dummy -sources.jar kana -javadoc.jar ine nyore README mukati kuti upfuure bvunzo.
  • Mafaira ese anofanira kusainwa nawo GPG/PGPuye .asc iyo faira ine siginicha inofanira kuiswa kune imwe neimwe faira.
  • Kuwanika pom faira
  • Hunhu hwakarurama groupId, artifactId ΠΈ version. Iyo vhezheni inogona kuve yakasarudzika tambo uye haigone kupera nayo -SNAPSHOT
  • Hupo hunodiwa name, description ΠΈ url
  • Kuvapo kweruzivo nezve rezinesi, vagadziri uye shanduro control system

Iyi ndiyo mitemo yakakosha inofanirwa kutevedzwa pakudhindisa. Ruzivo rwakazara rwuripo pano.

Isu tinoshandisa izvi zvinodiwa mu build.gradle file. Kutanga, ngatiwedzerei ruzivo rwese rwunodiwa nezvevagadziri, marezinesi, vhezheni control system, uye zvakare kuseta url, zita uye tsananguro yeprojekiti. Ngatinyorei nzira iri nyore yeizvi:

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

Tevere, iwe unofanirwa kutsanangura kuti panguva yegungano yakagadzirwa -sources.jar ΠΈ-javadoc.jar mafaira. Zvechikamu ichi java unofanira kuwedzera zvinotevera:

java {
    withJavadocJar()
    withSourcesJar()
}

Ngatienderei kune chekupedzisira chinodiwa, kumisikidza GPG/PGP siginicha. Kuti uite izvi, batanidza iyo plugin signing:

plugins {
    id 'signing'
}

Uye wedzera chikamu:

signing {
    sign publishing.publications
}

Pakupedzisira, ngatiwedzere chikamu 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
            }
        }
    }
}

zviri sonatypeUsername ΠΈ sonatypePassword akasiyana ane login uye password yakagadzirwa panguva yekunyoresa pa sonatype.org.

Saka iyo yekupedzisira build.gradle zvicharatidzika seizvi:

Full build.gradle code

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

Ini ndoda kuona kuti isu tinowana iyo vhezheni kubva kune nharaunda shanduko: System.getenv('RELEASE_VERSION'). Tichazvifumura panguva yegungano uye toitora kubva pazita reti.

PGP kiyi yekugadzira

Chimwe chezvinoda Sonatype ndechekuti mafaera ese asainwe nekiyi yeGPG/PGP. Nokuda kwaizvozvi tinoenda pano uye dhawunirodha iyo GnuPG yekushandisa kune yako yekushandisa system.

  • Isu tinogadzira maviri akakosha: gpg --gen-key, isa zita rekushandisa, e-mail, uye zvakare isa password.
  • Tinozviona id kiyi yedu nemurairo: gpg --list-secret-keys --keyid-format short. Id ichatsanangurwa mushure mekucheka, semuenzaniso: rsa2048/9B695056
  • Kuburitsa kiyi yeruzhinji kune server https://keys.openpgp.org raira: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Isu tinotumira kunze kiyi yakavanzika kunzvimbo yekupokana, isu tichaida mune ramangwana: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Kumisikidza Github Zviito

Ngatienderei padanho rekupedzisira, gadzira kuvaka uye otomatiki-kushambadzira uchishandisa Github Zviito.
Github Zviito chinhu chinokutendera kuti uite otomatiki mafambiro ebasa nekuita yakazara CI / CD kutenderera. Kuvaka, kuyedza, uye kuendesa kunogona kukonzereswa nezviitiko zvakasiyana: kodhi kusunda, kuburitsa kusikwa, kana nyaya. Izvi zvinoshanda zvachose zvemahara kune veruzhinji repositori.

Muchikamu chino, ini ndinokuratidza nzira yekumisikidza kuvaka uye kusunda kodhi uye kuendesa kune Sonatype repository pakuburitswa, pamwe nekumisikidza zvakavanzika.

Tinoisa zvakavanzika

Kuti tiunganidze otomatiki uye kutumira, tinoda huwandu hwezvakavanzika, senge kiyi id, password yatakaisa pakugadzira kiyi, kiyi yePGP pachayo, uye Sonatype login/password. Iwe unogona kuzvimisa muchikamu chakakosha mune repository marongero:

Kushandisa Gradle uye Github Zviito Kuburitsa Java Project kuSonatype Maven Central Repository

Isu tinogadzira zvinotevera zvakasiyana:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - login / password yatakapinda tichinyoresa neSonatype
  • SIGNING_KEYID/SIGNING_PASSWORD - PGP kiyi id uye password yakaiswa panguva yechizvarwa.

Ini ndinoda kugara pane iyo GPG_KEY_CONTENTS chinja mune zvakadzama. Icho chokwadi ndechekuti pakushambadza tinoda yakavanzika PGP kiyi. Kuti ndizvitumire mune zvakavanzika, ndakashandisa kuraira uyezve akaita akati wandei zviito.

  • Ngatinyorei kiyi yedu ne gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgnekuisa password. Inofanirwa kuiswa mushanduko: SECRET_PASSPHRASE
  • Ngatishandurei kiyi yakavharidzirwa kuita fomu remavara tichishandisa base64: base64 9B695056.gpg.gpg > 9B695056.txt. Zvirimo zvichaiswa mune vhezheni: GPG_KEY_CONTENTS.

Vaka setup paunenge uchisundidzira kodhi uye kugadzira PR

Kutanga iwe unofanirwa kugadzira folda mumudzi weprojekiti yako: .github/workflows.

Mariri, maka iyo faira, semuenzaniso, gradle-ci-build.yml nezvinotevera zvirimo:

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

Uku kufambiswa kwebasa kuchaitwa kana uchisundidzira kumapazi master, dev ΠΈ testing, zvakare pakugadzira zvikumbiro zvekudhonza.

Chikamu chemabasa chinotsanangura matanho anofanirwa kuitwa pazviitiko zvakatsanangurwa. Muchiitiko ichi, tichavaka pane yazvino vhezheni ye ubuntu, shandisa Java 8, uye zvakare shandisa iyo plugin yeGradle. eskatos/gradle-command-action@v1iyo, uchishandisa yazvino vhezheni yemuvaki, inomhanyisa mirairo yakataurwa mukati arguments. Variables secrets.SONATYPE_USERNAME ΠΈ secrets.SONATYPE_PASSWORD izvi ndizvo zvakavanzika zvatakabvunza kare.

Mhedzisiro yekuvaka icharatidzwa muActions tab:

Kushandisa Gradle uye Github Zviito Kuburitsa Java Project kuSonatype Maven Central Repository

Auto-deploy kana kuburitswa kutsva kwaburitswa

Ngatigadzire yakaparadzana yekufambisa faira ye autodeploy 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}}

Iro faira rinenge rakafanana nerekare, kunze kwechiitiko icho chichakonzerwa. Pakadai, ichi ndicho chiitiko chekugadzira tag ine zita rinotanga na v.

Tisati tatumirwa, isu tinofanirwa kuburitsa kiyi yePGP kubva pazvakavanzika toiisa mumudzi weprojekiti, pamwe nekuibvisa. Tevere, isu tinofanirwa kuseta yakakosha nharaunda inoshanduka RELEASE_VERSION izvo zvatinoreva gradle.build file. Zvose izvi zvinoitwa muchikamu Prepare to publish. Isu tinotora kiyi yedu kubva kuGPG_KEY_CONTENTS chinja, tishandure kuita gpg faira, wobva warinyora nekuisa mufaira. secret.gpg.

Zvadaro, tinotendeukira kune yakasiyana yakasiyana GITHUB_REF, kubva kwatinogona kuwana shanduro yatinoseta kana tichigadzira tag. Kusiyana uku kunokosha munyaya iyi. refs/tags/v0.0.2 kubva patakacheka mavara gumi nerimwe ekutanga kuti tiwane chaiyo vhezheni. Tevere, isu tinoshandisa yakajairwa Gradle mirairo yekushambadzira: test publish

Kutarisa kutumirwa kunoguma muSonatype repository

Mushure mekunge kusunungurwa kwagadzirwa, kufambiswa kwebasa kunotsanangurwa muchikamu chekare kunofanira kutanga. Kuti uite izvi, gadzira kuburitswa:

Kushandisa Gradle uye Github Zviito Kuburitsa Java Project kuSonatype Maven Central Repository

zita retag rinofanira kutanga na v. Kana, mushure mekudzvanya Publish kuburitswa, kufambiswa kwebasa kunopera, tinogona kuenda Sonatype Nexus kuve nechokwadi:

Kushandisa Gradle uye Github Zviito Kuburitsa Java Project kuSonatype Maven Central Repository

Iyo artifact yakaonekwa muStaging repository. Inobva yangooneka muOpen status, saka inofanira kuendeswa nemaoko kuChimiro Chekuvhara nekudzvanya bhatani rakakodzera. Mushure mekutarisa kuti zvese zvinodiwa zvinosangana here, iyo artifact inopinda muChimiro cheKuvhara uye haichawanikwi kuti igadziriswe. Mune iyi fomu, ichaguma muMavenCentral. Kana zvese zvakanaka, unogona kudzvanya bhatani rusununguko, uye chigadzirwa chacho chinozoguma chiri muSonatype repository.

Kuti iyo artefact ipinde muMavenCentral, iwe unofanirwa kuibvunza mune iro basa iro ratakagadzira pakutanga. Iwe unongoda kuita izvi kamwe chete, saka tinoburitsa kekutanga. Munguva dzinotevera, izvi hazvidiwe, zvese zvinozowiriraniswa otomatiki. Vakandibatidza kuwiriranisa nekukurumidza, asi zvakatora anenge mazuva mashanu kuti chigadzirwa chacho chiwanikwe muMavenCentral.

Ndizvo chete, isu takaburitsa chigadzirwa chedu muMavenCentral.

Useful links

Source: www.habr.com