Iji Gradle na Github Actions bipụta Java Project na Sonatype Maven Central Repository

N'edemede a, achọrọ m ileba anya na usoro nke ibipụta artifact Java sitere na ọkọ site na Github Actions na Sonatype Maven Central Repository site na iji onye nrụpụta Gradle.

Ekpebiri m ide edemede a n'ihi enweghị nkuzi nkịtị n'otu ebe. Ekwesịrị ịnakọta ozi niile n'otu n'otu site na isi mmalite dị iche iche, Ọzọkwa, ọ bụghị kpamkpam. Onye na-eche, nabata n'okpuru pusi.

Ịmepụta ebe nchekwa na Sonatype

Nzọụkwụ mbụ bụ ịmepụta ebe nchekwa na Sonatype Maven Central. Maka nke a anyị na-aga ebe a, Debanye aha ma mepụta ọrụ ọhụrụ, na-arịọ anyị ka anyị mepụta ebe nchekwa. Anyị na-anya ụgbọ ala anyị GroupId oru ngo, URL ọrụ njikọ oru ngo na SCM url njikọ na usoro njikwa ụdị nke ọrụ ahụ dị. GroupId ebe a kwesịrị ịbụ nke ụdị com.example, com.example.domain, com.example.testsupport, ma nwekwara ike ịbụ n'ụdị njikọ github gị: github.com/yourusername -> io.github.aha njirimara gị. N'ọnọdụ ọ bụla, ị ga-achọ ịchọpụta ikike nke ngalaba ma ọ bụ profaịlụ. Ọ bụrụ na ị kọwapụta profaịlụ github, a ga-ajụ gị ka ịmepụta ebe nchekwa ọha nwere aha achọrọ.

Oge ụfọdụ mgbe nkwenye gasịrị, a ga-emepụta GroupId gị ma anyị nwere ike ịga n'ihu na nzọụkwụ ọzọ, nhazi Gradle.

Na-ahazi Gradle

N'oge edere, ahụghị m plugins Gradle nwere ike inye aka na ibipụta ihe ahụ. a naanị ngwa mgbakwunye m chọtara, Otú ọ dị, onye edemede jụrụ ịkwado ya ọzọ. Ya mere, ekpebiri m ime ihe niile n'onwe m, ebe ọ bụ na ọ bụghị ihe siri ike ime nke a.

Ihe mbụ ị ga-achọpụta bụ ihe Sonatype chọrọ maka mbipụta. Ha bụ ndị a:

  • Nnweta koodu iyi na JavaDoc, ntụgharị. ga-agarịrị -sources.jar и-javadoc.jar faịlụ. Dị ka ekwuru na akwụkwọ ahụ, ọ bụrụ na ọ gaghị ekwe omume ịnye koodu isi ma ọ bụ akwụkwọ, ị nwere ike ịme mkpọmkpọ ebe -sources.jar ma ọ bụ -javadoc.jar ya na README dị mfe n'ime ka ịgafe ule.
  • A ga-ejirịrị akwụkwọ edebanye aha faịlụ niile GPG/PGPna .asc faịlụ nwere mbinye aka ga-etinyerịrị maka faịlụ ọ bụla.
  • nnweta pom faịlụ
  • Ụkpụrụ ziri ezi groupId, artifactId и version. Ụdị ahụ nwere ike ịbụ eriri aka ike na enweghị ike ịkwụsị ya -SNAPSHOT
  • Achọrọ ọnụnọ name, description и url
  • Ọnụnọ nke ozi gbasara ikike, ndị nrụpụta na sistemụ njikwa ụdị

Ndị a bụ iwu ndị bụ isi a ga-agbaso mgbe a na-ebipụta ya. Ozi zuru ezu dị ebe a.

Anyị na-emejuputa ihe achọrọ n'ime build.gradle faịlụ. Nke mbụ, ka anyị tinye ozi niile dị mkpa gbasara ndị nrụpụta, ikikere, sistemụ njikwa ụdị, ma tọọkwa url, aha na nkọwa nke ọrụ ahụ. Ka anyị dee usoro dị mfe maka nke a:

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

Na-esote, ịkwesịrị ịkọwapụta nke ahụ n'oge mgbakọ emepụtara -sources.jar и-javadoc.jar faịlụ. Maka ngalaba a java ịkwesịrị ịgbakwunye ihe ndị a:

java {
    withJavadocJar()
    withSourcesJar()
}

Ka anyị gaa n'ihu na nke ikpeazụ a chọrọ, na-edozi mbinye aka GPG/PGP. Iji mee nke a, jikọọ ngwa mgbakwunye signing:

plugins {
    id 'signing'
}

Ma tinye akụkụ:

signing {
    sign publishing.publications
}

N'ikpeazụ, ka anyị tinye akụkụ 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
            }
        }
    }
}

ọ bụ aha njirimara sonatype и sonatypePaswọdu mgbanwe ndị nwere nbanye na paswọọdụ emepụtara n'oge ndebanye aha sonatype.org.

Ya mere ikpeazụ build.gradle ga-adị ka nke a:

N'uju build.gradle koodu

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

Achọrọ m ịmara na anyị na-enweta ụdị ahụ site na mgbanwe gburugburu ebe obibi: System.getenv('RELEASE_VERSION'). Anyị ga-ekpughere ya n'oge mgbakọ ma wepụ ya na aha mkpado.

Ọgbọ igodo PGP

Otu n'ime ihe Sonatype chọrọ bụ ka ejiri igodo GPG/PGP bịanye aka na faịlụ niile. Maka nke a anyị na-aga ebe a wee budata ngwa GnuPG maka sistemụ arụmọrụ gị.

  • Anyị na-emepụta otu ụzọ igodo: gpg --gen-key, tinye aha njirimara, e-mail, ma tọọkwa paswọọdụ.
  • Anyị chọpụtara id igodo anyi jiri iwu a: gpg --list-secret-keys --keyid-format short. A ga-akọwapụta ID mgbe slash gachara, dịka ọmụmaatụ: rsa2048/9B695056
  • Na-ebipụta igodo ọha na sava ahụ https://keys.openpgp.org iwu: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Anyị na-ebupụ igodo nzuzo na ebe aka ike, anyị ga-achọ ya n'ọdịnihu: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Ịtọlite ​​​​Ọrụ Github

Ka anyị gaa n'ihu na ọkwa ikpeazụ, guzobe ihe nrụpụta wee bipụta onwe ya site na iji Github Actions.
Github Actions bụ atụmatụ na-enye gị ohere ịmegharị usoro ọrụ site na itinye usoro CI / CD zuru oke. Enwere ike ịkpalite iwulite, nwalee na ibugharị site na mmemme dị iche iche: ntinye koodu, imepụta ntọhapụ, ma ọ bụ okwu. Ọrụ a bụ n'efu maka ebe nchekwa ọha.

Na ngalaba a, m ga-egosi gị otu esi edozi koodu nrụpụta na ntinye ma tinye ya na ebe nchekwa Sonatype na ntọhapụ, yana ịtọlite ​​​​nzuzo.

Anyị na-edobe ihe nzuzo

Maka mgbakọ na mbugharị akpaaka, anyị chọrọ ọtụtụ ụkpụrụ nzuzo, dị ka id igodo, paswọọdụ anyị banyere mgbe ị na-emepụta igodo ahụ, igodo PGP n'onwe ya, yana nbanye / paswọọdụ Sonatype. Ị nwere ike ịtọ ha na ngalaba pụrụ iche na ntọala ebe nchekwa:

Iji Gradle na Github Actions bipụta Java Project na Sonatype Maven Central Repository

Anyị debere mgbanwe ndị a:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - nbanye / paswọọdụ anyị tinyere mgbe ị na-edebanye aha na Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP igodo id na okwuntughe edobere n'oge ọgbọ.

Achọrọ m ibi na mgbanwe GPG_KEY_CONTENTS n'ụzọ zuru ezu karị. Nke bụ eziokwu bụ na maka mbipụta anyị chọrọ igodo PGP nkeonwe. Iji biputere ya na nzuzo, m na-eji nkuzi ma meekwa ọtụtụ omume.

  • Ka anyị jiri gpg zoo igodo anyị: gpg --symmetric --cipher-algo AES256 9B695056.gpgsite na itinye okwuntughe. Ekwesịrị idowe ya na mgbanwe: SECRET_PASSPRASE
  • Ka anyị tụgharịa igodo ezoro ezo enwetara n'ụdị ederede site na iji base64: base64 9B695056.gpg.gpg > 9B695056.txt. A ga-edowe ọdịnaya ahụ na mgbanwe: GPG_KEY_CONTENTS.

Mee ntọala mgbe ị na-agbanye koodu na ịmepụta PR

Mbụ ị ga-emepụta folda na mgbọrọgwụ nke ọrụ gị: .github/workflows.

N'ime ya, kaa akara faịlụ, dịka ọmụmaatụ, gradle-ci-build.yml ya na ọdịnaya ndị a:

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

A ga-eme usoro a mgbe a na-atụgharị ya na alaka master, dev и testing, nakwa mgbe ị na-emepụta arịrịọ ịdọrọ.

Ngalaba ọrụ na-akọwapụta usoro a ga-eme na mmemme ndị akọwapụtara. N'okwu a, anyị ga-ewu na ubuntu kachasị ọhụrụ, jiri Java 8, ma jirikwa ngwa mgbakwunye maka Gradle. eskatos/gradle-command-action@v1nke, na-eji ụdị ọhụrụ nke onye na-ewu ụlọ, ga-agba ọsọ iwu ndị akọwapụtara na ya arguments. Mgbanwe secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD ndị a bụ ihe nzuzo anyị jụrụ na mbụ.

A ga-egosipụta nsonaazụ nrụpụta na taabụ Omume:

Iji Gradle na Github Actions bipụta Java Project na Sonatype Maven Central Repository

Bugharịa na akpaghị aka mgbe ewepụtara ntọhapụ ọhụrụ

Ka anyị mepụta faịlụ na-arụ ọrụ dị iche maka 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}}

Faịlụ fọrọ nke nta ka ọ bụrụ nke gara aga, ewezuga ihe omume nke a ga-akpalite ya. N'okwu a, nke a bụ mmemme nke ịmepụta mkpado nwere aha na-amalite na v.

Tupu ebuga ya, anyị kwesịrị iwepụ igodo PGP na nzuzo wee tinye ya na mgbọrọgwụ nke ọrụ ahụ, yana decrypt ya. Ọzọ, anyị kwesịrị ịtọ mgbanwe gburugburu ebe obibi pụrụ iche RELEASE_VERSION nke anyị na-ezo aka gradle.build faịlụ. A na-eme ihe niile na ngalaba Prepare to publish. Anyị na-enweta igodo anyị site na mgbanwe GPG_KEY_CONTENTS, tụgharịa ya na faịlụ gpg, wee wepụ ya site na itinye ya na faịlụ ahụ. secret.gpg.

Ọzọ, anyị na-atụgharị na mgbanwe pụrụ iche GITHUB_REF, nke anyị nwere ike nweta ụdị nke anyị debere mgbe ị na-emepụta mkpado. Ngbanwe a dị mkpa na nke a. refs/tags/v0.0.2 nke anyị na-ebipụ mkpụrụedemede 11 mbụ iji nweta otu ụdị. Na-esote, anyị na-eji ụkpụrụ Gradle ọkọlọtọ maka ibipụta: test publish

Na-enyocha nsonaazụ mbugharị na ebe nchekwa Sonatype

Mgbe emechara ntọhapụ, usoro ọrụ akọwara na ngalaba gara aga kwesịrị ịmalite. Iji mee nke a, mepụta ntọhapụ:

Iji Gradle na Github Actions bipụta Java Project na Sonatype Maven Central Repository

aha mkpado ga-amalite na v. Ọ bụrụ na, mgbe ịpịsịrị mbipụta mbipụta, usoro ọrụ ahụ ga-agwụ nke ọma, anyị nwere ike ịga na Sonatype Nexus iji hụ na:

Iji Gradle na Github Actions bipụta Java Project na Sonatype Maven Central Repository

Ihe ngosi a pụtara na ebe nchekwa Staging. Ọ na-apụta ozugbo na ọnọdụ Mepee, mgbe ahụ, a ga-eji aka bufee ya na ọnọdụ nso site na ịpị bọtịnụ kwesịrị ekwesị. Mgbe enyochachara na emezuru ihe niile achọrọ, arịa ahụ na-abanye n'ọkwa dị nso na ọ nweghịzị maka mgbanwe. N'ụdị a, ọ ga-ejedebe na MavenCentral. Ọ bụrụ na ihe niile dị mma, ị nwere ike pịa bọtịnụ ntọhapụ, na artifact ga-ejedebe na Sonatype repository.

Ka artifact wee banye na MavenCentral, ịkwesịrị ịrịọ maka ya na ọrụ anyị mepụtara na mbido. Naanị ị ga-eme nke a otu ugboro, yabụ anyị na-ebipụta nke mbụ. N'oge na-esote, nke a anaghị achọ, ihe niile ga-emekọrịta na-akpaghị aka. Ha gbanyere m mmekọrịta ngwa ngwa, mana o were ihe dị ka ụbọchị 5 maka arịa ahụ ka ọ dị na MavenCentral.

Nke ahụ bụ naanị, anyị ebipụtala arịa anyị na MavenCentral.

Njikọ ndị bara uru

isi: www.habr.com