Ma te whakamahi i nga Mahi a Gradle me Github ki te Whakaputa i te Kaupapa Java ki te Sonatype Maven Central Repository

I roto i tenei tuhinga, e hiahia ana ahau ki te ata titiro ki te tukanga o te whakaputa i tetahi taonga Java mai i te wahanga ma nga Mahi a Github ki te Sonatype Maven Central Repository ma te whakamahi i te kaihanga Gradle.

I whakatau ahau ki te tuhi i tenei tuhinga na te kore o te akoranga noa i te waahi kotahi. Ko nga korero katoa me kohia ia wahanga i ia wahanga mai i nga puna maha, me te mea, ehara i te mea hou. Who cares, welcome under cat.

Te hanga putunga i roto i te Sonatype

Ko te mahi tuatahi ko te hanga i tetahi putunga i Sonatype Maven Central. Mo tenei ka haere matou konei, rēhita me te hanga i tetahi mahi hou, me te tono mai ki a maatau ki te hanga i tetahi putunga. Ka taraiwa matou i roto i to maatau GroupId kaupapa, URL Kaupapa hononga kaupapa me URL SCM he hononga ki te punaha whakahaere putanga kei reira te kaupapa. GroupId me penei te ahua com.example, com.example.domain, com.example.testsupport, ka taea hoki te hono ki to github: github.com/yurusername -> io.github.yourusername. Ahakoa he aha, ka hiahia koe ki te manatoko i te mana o tenei rohe, korero ranei. Mena kua tohua e koe he kōtaha github, ka tonoa koe ki te hanga i tetahi putunga putunga whanui me te ingoa e hiahiatia ana.

I etahi wa i muri i te whakapumautanga, ka hangaia to GroupId ka taea e matou te neke atu ki te taahiraa e whai ake nei, te whirihoranga Gradle.

Whirihora Gradle

I te wa e tuhi ana, kaore au i kite i nga taputapu Gradle hei awhina i te whakaputa i te taonga. tenei Ko te mono anake i kitea e au, heoi, kaore te kaituhi i pai ki te tautoko ake. Na reira, i whakatau ahau ki te mahi i nga mea katoa, na te mea ehara i te mea uaua ki te mahi i tenei.

Ko te mea tuatahi ki te whakaaro ko nga whakaritenga a Sonatype mo te whakaputa. Ko enei e whai ake nei:

  • Te waatea o nga waehere puna me te JavaDoc, ara. me haere mai -sources.jar и-javadoc.jar kōnae. Ka rite ki te korero i roto i nga tuhinga, ki te kore e taea te whakarato i nga waehere puna, tuhinga ranei, ka taea e koe te hanga i te taarua. -sources.jar ranei -javadoc.jar me te README ngawari ki roto hei tuku i te whakamatautau.
  • Me haina nga konae katoa GPG/PGPa .asc ko te kōnae kei roto te waitohu me whakauru mo ia kōnae.
  • wātea pom konae
  • Nga uara tika groupId, artifactId и version. Ko te putanga ka taea he aho noa, kaore e taea te mutu -SNAPSHOT
  • Me whai waahi name, description и url
  • Te aroaro o nga korero mo te raihana, nga kaihanga me te punaha whakahaere putanga

Koinei nga ture matua me whai i te wa e whakaputa ana. Kei te waatea nga korero katoa konei.

Ka whakatinanahia e matou enei whakaritenga i roto i build.gradle kōnae. Tuatahi, me taapiri nga korero katoa e tika ana mo nga kaihanga, raihana, punaha whakahaere putanga, me te tautuhi ano i te url, te ingoa me te whakaahuatanga o te kaupapa. Me tuhi he tikanga ngawari mo tenei:

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

I muri mai, me tohu e koe i te wa o te huihuinga i hangaia -sources.jar и-javadoc.jar kōnae. Mo tenei wahanga java me taapiri e koe nga mea e whai ake nei:

java {
    withJavadocJar()
    withSourcesJar()
}

Me haere ki te whakaritenga whakamutunga, ki te whakarite i tetahi waitohu GPG/PGP. Ki te mahi i tenei, hono te mono signing:

plugins {
    id 'signing'
}

Ka taapirihia he waahanga:

signing {
    sign publishing.publications
}

Ka mutu, me taapiri he waahanga 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
            }
        }
    }
}

ko te reira sonatypeUsername и sonatypeKupuhipa taurangi kei roto te takiuru me te kupuhipa i hangaia i te rehitatanga i runga sonatype.org.

Koia te whakamutunga build.gradle ka penei te ahua:

Waehere build.gradle katoa

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

E hiahia ana ahau ki te kite ka whiwhi tatou i te putanga mai i te taurangi taiao: System.getenv('RELEASE_VERSION'). Ka whakaatuhia e matou i te wa o te huihuinga ka tangohia mai i te ingoa tohu.

Te whakaputanga matua PGP

Ko tetahi o nga whakaritenga a Sonatype me haina nga konae katoa me te taviri GPG/PGP. Mo tenei ka haere matou konei ka tango i te taputapu GnuPG mo to punaha whakahaere.

  • Ka hangaia e matou he takirua matua: gpg --gen-key, tomo i te ingoa kaiwhakamahi, ī-mēra, me te tautuhi hoki i te kupuhipa.
  • Ka kitea e tatou id to tatou matua me te whakahau: gpg --list-secret-keys --keyid-format short. Ka tohua te Id i muri i te rītaha, hei tauira: rsa2048/9B695056
  • Te whakaputa i te kī tūmatanui ki te tūmau https://keys.openpgp.org whakahau: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Ka kaweake e matou te taviri ngaro ki tetahi waahi noa, ka hiahia matou a muri ake: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Te whakarite i nga Mahi a Github

Me neke atu ki te waahanga whakamutunga, whakarite i te hanga me te whakaputa-aunoa ma te whakamahi i nga Mahi a Github.
Ko nga Mahi a Github tetahi waahanga e taea ai e koe te whakahaere aunoa i te rerenga mahi ma te whakatinana i te huringa CI / CD katoa. Ko te hanga, te whakamatautau me te tohatoha ka taea e nga huihuinga rereke: pana waehere, hanga tuku, take ranei. He tino kore utu tenei mahi mo nga whare pupuri a te iwi.

I roto i tenei waahanga, ka whakaatu ahau ki a koe me pehea te whakarite i te hanga me te pana i te waehere me te tuku ki te putunga Sonatype i runga i te tukunga, me te whakarite i nga mea ngaro.

Ka whakatakotoria e matou nga mea ngaro

Mo te huihuinga aunoa me te whakatakotoranga, ka hiahia matou ki te maha o nga uara ngaro, penei i te id matua, te kupuhipa i whakauruhia e matou i te wa e whakaputa ana i te kii, te matua PGP ano, me te Sonatype takiuru/kupuhipa. Ka taea e koe te whakanoho ki tetahi waahanga motuhake i roto i nga tautuhinga putunga:

Ma te whakamahi i nga Mahi a Gradle me Github ki te Whakaputa i te Kaupapa Java ki te Sonatype Maven Central Repository

Ka tautuhia e matou nga taurangi e whai ake nei:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - takiuru / kupuhipa i whakauruhia e matou i to rehitatanga me Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP matua id me te kupuhipa kua whakaritea i roto i te reanga.

Kei te pirangi au ki te noho ki runga i te taurangi GPG_KEY_CONTENTS i roto i nga korero taipitopito. Ko te meka mo te whakaputanga ka hiahia matou ki te taviri PGP tūmataiti. I roto i te tikanga ki te tuku i te reira i roto i te ngaro, whakamahia ahau ako me etahi atu mahi i mahia.

  • Me whakamuna ta tatou matua ki te gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgmā te whakauru kupuhipa. Me whakanoho ki tetahi taurangi: SECRET_PASSPHRASE
  • Whakamāoritia te kī whakamunatia kua riro ki te puka kuputuhi mā te whakamahi base64: base64 9B695056.gpg.gpg > 9B695056.txt. Ka tuuhia te ihirangi ki te taurangi: GPG_KEY_CONTENTS.

Hangaia te tatūnga i te wa e pana ana te waehere me te hanga PR

Tuatahi me hanga e koe he kōpaki ki te putake o to kaupapa: .github/workflows.

I roto, tohuhia te konae, hei tauira, gradle-ci-build.yml me nga ihirangi e whai ake nei:

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

Ka mahia tenei rerenga mahi ina pana ana ki nga manga master, dev и testing, ano hoki i te wa e hanga tono toia ana.

Ko te waahanga mahi e tohu ana i nga kaupae ka mahia ki nga huihuinga kua tohua. I tenei keehi, ka hangaia e matou i runga i te putanga hou o ubuntu, whakamahi Java 8, me te whakamahi ano hoki i te mono mo Gradle eskatos/gradle-command-action@v1ma te whakamahi i te putanga hou o te kaihanga, ka whakahaere i nga whakahau kua tohua ki roto arguments. Taurangi secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD koinei nga mea ngaro i pataia e matou i mua.

Ka kitea nga hua hanga ki te ripa Hohenga:

Ma te whakamahi i nga Mahi a Gradle me Github ki te Whakaputa i te Kaupapa Java ki te Sonatype Maven Central Repository

Tuku-aunoa ina tukuna he tukunga hou

Me hanga he konae rerengamahi motuhake mo te tuku aunoa 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}}

He rite tonu te konae ki te konae o mua, engari mo te takahanga ka puta ai. I tenei keehi, koinei te huihuinga o te hanga tohu me te ingoa timata ki te v.

I mua i te tohatoha, me tango e tatou te matua PGP mai i nga mea ngaro ka waiho ki te pakiaka o te kaupapa, me te wetewete. I muri mai, me whakarite he taurangi taiao motuhake RELEASE_VERSION e korero ana matou gradle.build kōnae. Ka mahia tenei katoa i roto i te waahanga Prepare to publish. Ka whiwhi tatou i ta tatou kii mai i te taurangi GPG_KEY_CONTENTS, whakamaoritia ki roto i te konae gpg, katahi ka wetemuna ma te tuku ki roto i te konae secret.gpg.

I muri mai, ka huri tatou ki tetahi taurangi motuhake GITHUB_REF, ka taea e matou te tiki i te putanga i whakaritea e matou i te wa e hanga ana te tohu. He mea tika tenei taurangi i tenei keehi. refs/tags/v0.0.2 i tapahia e matou nga tohu tuatahi 11 ki te tiki i tetahi putanga motuhake. Whai muri, ka whakamahia e matou nga whakahau Gradle paerewa mo te whakaputa: test publish

Ko te tirotiro i nga hua tukunga ki te putunga Sonatype

Ina oti te whakaputanga, me timata te rerenga mahi i whakaahuatia i te waahanga o mua. Ki te mahi i tenei, hanga he tuku:

Ma te whakamahi i nga Mahi a Gradle me Github ki te Whakaputa i te Kaupapa Java ki te Sonatype Maven Central Repository

me timata te ingoa tohu ki te v. Mena, i muri i te panui Whakaputa i te tukunga, ka oti pai te rerengamahi, ka taea e tatou te haere ki Sonatype Nexus ki te whakarite:

Ma te whakamahi i nga Mahi a Gradle me Github ki te Whakaputa i te Kaupapa Java ki te Sonatype Maven Central Repository

I puta te toi i roto i te whare putunga Staging. Ka puta tonu ki te mana Tuwhera, katahi me whakawhiti a ringa ki te mana Kati ma te patene i te paatene e tika ana. Whai muri i te tirotiro kua tutuki nga whakaritenga katoa, ka uru te taonga ki te mana Kati ka kore e waatea mo te whakarereke. I tenei ahua, ka mutu ki MavenCentral. Mena kei te pai nga mea katoa, ka taea e koe te pehi i te paatene tuku, ka mutu te toi i roto i te putunga Sonatype.

Kia uru atu te taonga ki roto i te MavenCentral, me tono e koe i roto i te mahi i hangaia e matou i te timatanga. Kia kotahi noa iho te mahi, no reira ka whakaputa matou mo te wa tuatahi. I nga wa o muri mai, kaore tenei e hiahiatia, ka tukutahi aunoa nga mea katoa. Ka tere ratou ki te tukutahitanga mo au, engari e 5 pea nga ra ka waatea te taonga ki MavenCentral.

Heoi ano, kua whakaputahia e matou to maatau taonga ki MavenCentral.

hononga whaihua

  • He rite tuhinga, ka whakaputa noa ma te maven
  • Te whakarite putunga Sonatype
  • Jira Sonatype hei hanga i te mahi
  • Hei tauira: putunga kei reira nga mea katoa kua whakaritea

Source: will.com