Ho sebelisa Gradle le Github Actions ho Phatlalatsa Java Project ho Sonatype Maven Central Repository

Sehloohong sena, ke batla ho shebisisa ts'ebetso ea ho hatisa sebopeho sa Java ho tloha qalong ka Github Actions ho ea Sonatype Maven Central Repository ho sebelisa Gradle builder.

Ke ile ka etsa qeto ea ho ngola sehlooho sena ka lebaka la ho hloka thuto e tloaelehileng sebakeng se le seng. Boitsebiso bohle bo ne bo lokela ho bokelloa ka sengoathoana ho tsoa mehloling e sa tšoaneng, ho feta moo, eseng e ncha ka ho feletseng. Ke mang ea tsotellang, amohela tlas'a katse.

Ho theha sebaka sa polokelo ho Sonatype

Mohato oa pele ke ho theha polokelo ho Sonatype Maven Central. Bakeng sa sena re ea mona, ngolisa le ho theha mosebetsi o mocha, o re kopa hore re thehe sebaka sa polokelo. Re khanna ka koloi ea rona GroupId morero, URL ea Morero sehokelo sa morero le SCM url sehokelo ho sistimi ea taolo ea mofuta oo morero o leng ho ona. GroupId mona e lokela ho ba ea mofuta oa com.example, com.example.domain, com.example.testsupport, hape e ka ba ka sebopeho sa sehokelo ho github ea hau: github.com/yourusername -> io.github.yourusername. Leha ho le joalo, o tla hloka ho netefatsa mong'a sebaka sena kapa profaele ena. Haeba u boletse profil ea github, u tla kopuoa ho theha polokelo ea sechaba ka lebitso leo u le batlang.

Nako e itseng ka mor'a ho netefatsa, GroupId ea hau e tla etsoa 'me re ka fetela mohatong o latelang, tlhophiso ea Gradle.

Ho lokisa Gradle

Nakong ea ho ngola, ha kea ka ka fumana li-plugins tsa Gradle tse ka thusang ka ho phatlalatsa sengoloa. sena plugin feela eo ke e fumaneng, leha ho le joalo, mongoli o ile a hana ho e tšehetsa ka ho eketsehileng. Ka hona, ke ile ka etsa qeto ea ho iketsetsa ntho e 'ngoe le e' ngoe, kaha ha ho thata haholo ho etsa sena.

Ntho ea pele eo u lokelang ho e tseba ke litlhoko tsa Sonatype bakeng sa khatiso. Ke tse latelang:

  • Ho fumaneha ha likhoutu tsa mohloli le JavaDoc, ke hore. tlameha ho ba teng -sources.jar и-javadoc.jar lifaele. Joalokaha ho boletsoe litokomaneng, haeba ho ke ke ha khoneha ho fana ka li-code tsa mohloli kapa litokomane, u ka etsa dummy -sources.jar kapa -javadoc.jar ka README e bonolo ka hare ho fetisa tlhahlobo.
  • Lifaele tsohle li tlameha ho saena le GPG/PGPle .asc faele e nang le signature e tlameha ho kenyelletsoa bakeng sa faele ka 'ngoe.
  • ho fumaneha pom faele
  • Mekhoa e nepahetseng groupId, artifactId и version. Phetolelo e ka ba khoele e sa reroang 'me e ke ke ea fella ka -SNAPSHOT
  • Ho hlokahala ho ba teng name, description и url
  • Boteng ba tlhahisoleseling mabapi le laesense, bahlahisi le sistimi ea taolo ea mofuta

Ena ke melao ea motheo e lokelang ho lateloa ha ho phatlalatsoa. Boitsebiso bo feletseng bo teng mona.

Re kenya tshebetsong ditlhoko tsena ka build.gradle faele. Taba ea pele, a re kenyelleng lintlha tsohle tse hlokahalang mabapi le bahlahisi, lilaesense, sistimi ea taolo ea mofuta, hape re behe url, lebitso le tlhaloso ea morero. Ha re ngole mokhoa o bonolo oa sena:

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

E latelang, o hloka ho hlakisa hore nakong ea kopano e hlahisitsoeng -sources.jar и-javadoc.jar lifaele. Bakeng sa karolo ena java o hloka ho eketsa tse latelang:

java {
    withJavadocJar()
    withSourcesJar()
}

Ha re feteleng ho tlhoko ea ho qetela, ho theha tshaeno ea GPG/PGP. Ho etsa sena, hokela plugin signing:

plugins {
    id 'signing'
}

Ebe u eketsa karolo:

signing {
    sign publishing.publications
}

Qetellong, ha re kenye karolo 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
            }
        }
    }
}

ke sonatypeLebitso la mosebedisi и sonatypePassword mefuta e fapaneng e nang le login le password e entsoeng nakong ea ho ngolisa sonatype.org.

Ka hona ea ho qetela build.gradle e tla shebahala tjena:

Full build.gradle khoutu

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

Ke batla ho hlokomela hore re fumana mofuta ona ho tsoa tikolohong e fapaneng: System.getenv('RELEASE_VERSION'). Re tla e pepesa nakong ea kopano ebe re e nka lebitsong la tag.

Phetoho ea senotlolo sa PGP

E 'ngoe ea litlhoko tsa Sonatype ke hore lifaele tsohle li saennoe ka konopo ea GPG/PGP. Bakeng sa sena re ea mona 'me u khoasolle lisebelisoa tsa GnuPG bakeng sa sistimi ea hau ea ts'ebetso.

  • Re etsa li-pair tsa bohlokoa: gpg --gen-key, kenya lebitso la mosebedisi, e-mail, mme hape o seta le phasewete.
  • Rea fumana id senotlolo sa rona ka taelo: gpg --list-secret-keys --keyid-format short. Id e tla hlalosoa ka mor'a slash, mohlala: rsa2048/9B695056
  • Ho phatlalatsa senotlolo sa sechaba ho seva https://keys.openpgp.org taelo: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Re romella senotlolo sa lekunutu sebakeng se sa reroang, re tla se hloka nakong e tlang: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Ho theha Liketso tsa Github

Ha re feteleng pele ho ea mothating oa ho qetela, re thehe moaho le ho phatlalatsa ka boits'oaro re sebelisa Github Actions.
Github Actions ke karolo e u lumellang hore u iketsetse tšebetso ea tšebetso ka ho kenya tšebetsong potoloho e felletseng ea CI / CD. Ho aha, ho leka, le ho tsamaisa ho ka hlahisoa ke liketsahalo tse fapaneng: ho sututsa khoutu, tlhahiso ea tokollo, kapa litaba. Ts'ebetso ena ke mahala bakeng sa polokelo ea sechaba.

Karolong ena, ke tla u bontša mokhoa oa ho theha le ho sutumetsa khoutu le ho e fetisetsa sebakeng sa polokelo ea Sonatype ha o lokolloa, hammoho le ho theha liphiri.

Re beha liphiri

Bakeng sa ho kopanya le ho romelloa ka mokhoa o itekanetseng, re hloka palo ea litekanyetso tsa lekunutu, tse kang senotlolo id, phasewete eo re e kentseng ha re hlahisa senotlolo, senotlolo sa PGP ka boeona, le ho kena ha Sonatype / password. U ka li beha karolong e khethehileng libakeng tsa polokelo:

Ho sebelisa Gradle le Github Actions ho Phatlalatsa Java Project ho Sonatype Maven Central Repository

Re khetha mefuta e latelang:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - ho kena / phasewete eo re e kentseng ha re ingolisa le Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP key id le phasewete e behiloeng nakong ea tlhahiso.

Ke batla ho lula ka ho feto-fetoha ha GPG_KEY_CONTENTS ka botlalo. Taba ke hore ho phatlalatsoa senotlolo sa PGP sa poraefete sea hlokahala bakeng sa rona. E le ho e beha liphiring, ke ne ke sebelisa taeo mme hape o entse diketso tse ngatanyana.

  • Ha re kenye senotlolo sa rona ka gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgka ho kenya phasewete. E tlameha ho behoa ka mofuta o fapaneng: SECRET_PASSPHRASE
  • Ha re fetoleleng senotlolo se kentsoeng ka mokhoa oa mongolo re sebelisa base64: base64 9B695056.gpg.gpg > 9B695056.txt. Likahare li tla behoa ka mefuta e fapaneng: GPG_KEY_CONTENTS.

Theha setaele ha o sututsa khoutu mme o theha PR

Pele, o hloka ho theha foldara motso oa projeke ea hau: .github/workflows.

Ho eona, tšoaea faele, mohlala, gradle-ci-build.yml ka litaba tse latelang:

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

Ts'ebetso ena e tla etsoa ha e sutumelletsa makaleng master, dev и testing, hape ha u theha likopo tsa ho hula.

Karolo ea mesebetsi e totobatsa mehato e lokelang ho etsoa liketsahalong tse boletsoeng. Tabeng ena, re tla aha holim'a mofuta oa morao-rao oa ubuntu, sebelisa Java 8, hape re sebelise plugin bakeng sa Gradle. eskatos/gradle-command-action@v1eo, ka ho sebelisa mofuta oa morao-rao oa sehahi, e tla tsamaisa litaelo tse boletsoeng ho arguments. Mefuta e fapaneng secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD ke liphiri tseo re li botsitseng pejana.

Liphetho tsa moaho li tla hlaha ho tab ea Liketso:

Ho sebelisa Gradle le Github Actions ho Phatlalatsa Java Project ho Sonatype Maven Central Repository

Sebelisa ka boits'oaro ha tokollo e ncha e lokolloa

Ha re theheng faele e arohaneng ea phallo ea mosebetsi bakeng sa 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}}

Faele e batla e ts'oana le e fetileng, ntle le ketsahalo eo e tla qalisoa ho eona. Tabeng ena, ena ke ketsahalo ea ho theha tag e nang le lebitso le qalang ka v.

Pele re romelloa, re hloka ho ntša senotlolo sa PGP liphiring ebe re se beha motso oa morero, hammoho le ho se hlakola. Ka mor'a moo, re hloka ho beha phetoho e khethehileng ea tikoloho RELEASE_VERSION tseo re buang ka tsona gradle.build faele. Tsena tsohle li etsoa karolong Prepare to publish. Re fumana senotlolo sa rona ho GPG_KEY_CONTENTS e fapaneng, re e fetolela ho faele ea gpg, ebe re e hlakola ka ho e kenya faeleng. secret.gpg.

Ka mor'a moo, re retelehela ho phetoho e khethehileng GITHUB_REF, eo ho eona re ka fumanang mofuta oo re o behileng ha re theha tag. Phapang ena e bohlokoa tabeng ena. refs/tags/v0.0.2 eo ho eona re ileng ra khaola litlhaku tsa pele tse 11 ho fumana mofuta o itseng. Ka mor'a moo, re sebelisa litaelo tse tloaelehileng tsa Gradle bakeng sa ho hatisa: test publish

Ho hlahloba liphetho tsa phepelo sebakeng sa polokelo ea Sonatype

Hang ha tokollo e bōpiloe, mokhoa oa ho sebetsa o hlalositsoeng karolong e fetileng o lokela ho qala. Ho etsa sena, etsa tokollo:

Ho sebelisa Gradle le Github Actions ho Phatlalatsa Java Project ho Sonatype Maven Central Repository

lebitso la tag le tlameha ho qala ka v. Haeba, ka mor'a ho tobetsa Phatlalatsa tokollo, mosebetsi oa ho sebetsa o phethela ka katleho, re ka ea ho Sonatype Nexus ho etsa bonnete:

Ho sebelisa Gradle le Github Actions ho Phatlalatsa Java Project ho Sonatype Maven Central Repository

The artifact e hlahile sebakeng sa polokelo ea Staging. Hang-hang e hlaha ka boemo ba Open, joale e tlameha ho fetisetsoa ka letsoho ho boemo ba Koala ka ho tobetsa konopo e loketseng. Ka mor'a ho hlahloba hore na litlhoko tsohle li finyelloa, artifact e kena boemong ba Koala 'me ha e sa fumaneha bakeng sa ho fetoloa. Ka mokhoa ona, e tla qetella e le MavenCentral. Haeba tsohle li lokile, o ka tobetsa konopo lokolloe, 'me lintho tse entsoeng ka matsoho li tla qetella li le sebakeng sa polokelo ea Sonatype.

E le hore artifact e kene MavenCentral, o hloka ho e kopa mosebetsing oo re o entseng qalong. U hloka ho etsa sena hang feela, kahoo re phatlalatsa lekhetlo la pele. Linakong tse latelang, sena ha se hlokehe, ntho e 'ngoe le e' ngoe e tla lumellana ka bo eona. Ba ile ba ntumella khokahano kapele, empa ho ile ha nka matsatsi a ka bang 5 hore artefact e fumanehe MavenCentral.

Ke phetho, re phatlalalitse mosebetsi oa rona oa maiketsetso ho MavenCentral.

likhokahano tse sebetsang

  • E tšoanang sehlooho, phatlalatsa feela ka maven
  • Ho senya polokelo Sonatype
  • Jira Sonatype eo ho eona ho bopang mosebetsi
  • Mohlala: polokelo moo tsohle li hlophisitsoeng

Source: www.habr.com