Lilo Gradle ati Awọn iṣe Github lati ṣe atẹjade Ise agbese Java si Ibi ipamọ Sonatype Maven Central

Ninu nkan yii, Mo fẹ lati wo alaye ni kikun ilana ti titẹjade artifact Java kan lati ibere nipasẹ Github Actions si ibi ipamọ Sonatype Maven Central ni lilo Akole Gradle.

Mo pinnu lati kọ nkan yii nitori aini ikẹkọ deede ni aaye kan. Gbogbo alaye naa ni lati gba ni nkan nipasẹ nkan lati awọn orisun oriṣiriṣi, pẹlupẹlu, kii ṣe tuntun patapata. Tani o bikita, kaabo labẹ ologbo.

Ṣiṣẹda ibi ipamọ ni Sonatype

Igbesẹ akọkọ ni lati ṣẹda ibi ipamọ kan ni Sonatype Maven Central. Fun eyi a lọ nibi, forukọsilẹ ati ṣẹda iṣẹ-ṣiṣe tuntun kan, beere fun wa lati ṣẹda ibi ipamọ kan. A wakọ ninu wa GroupId ise agbese, URL ise agbese ọna asopọ ise agbese ati SCM url ọna asopọ si eto iṣakoso ẹya ninu eyiti iṣẹ akanṣe wa. GroupId nibi yẹ ki o jẹ ti fọọmu com.example, com.example.domain, com.example.testsupport, ati pe o tun le wa ni ọna ọna asopọ si github rẹ: github.com/yourusername -> io.github.orukọ olumulo rẹ. Ni eyikeyi idiyele, iwọ yoo nilo lati jẹrisi nini nini agbegbe tabi profaili. Ti o ba ṣalaye profaili github kan, ao beere lọwọ rẹ lati ṣẹda ibi ipamọ gbogbo eniyan pẹlu orukọ ti o fẹ.

Ni akoko diẹ lẹhin ìmúdájú, GroupId rẹ yoo ṣẹda ati pe a le lọ si igbesẹ ti nbọ, iṣeto Gradle.

Tito leto Gradle

Ni akoko kikọ, Emi ko rii awọn afikun Gradle ti o le ṣe iranlọwọ pẹlu titẹjade iṣẹ-ọnà naa. Eyi jẹ ohun itanna nikan ti Mo rii, sibẹsibẹ, onkọwe kọ lati ṣe atilẹyin siwaju sii. Nitorinaa, Mo pinnu lati ṣe ohun gbogbo funrararẹ, nitori ko nira pupọ lati ṣe eyi.

Ohun akọkọ lati ṣawari ni awọn ibeere Sonatype fun titẹjade. Wọn ti wa ni awọn wọnyi:

  • Wiwa awọn koodu orisun ati JavaDoc, ie. gbọdọ lọ -sources.jar и-javadoc.jar awọn faili. Gẹgẹbi a ti sọ ninu iwe, ti ko ba ṣee ṣe lati pese awọn koodu orisun tabi iwe, o le ṣe idinwon -sources.jar tabi -javadoc.jar pẹlu README ti o rọrun lati ṣe idanwo naa.
  • Gbogbo awọn faili gbọdọ wa ni ibuwolu pẹlu GPG/PGPati .asc faili ti o ni ibuwọlu gbọdọ wa pẹlu faili kọọkan.
  • Wiwa pom faili
  • Awọn iye to tọ groupId, artifactId и version. Ẹya naa le jẹ okun lainidii ati pe ko le pari pẹlu -SNAPSHOT
  • Wiwa nilo name, description и url
  • Iwaju alaye nipa iwe-aṣẹ, awọn olupilẹṣẹ ati eto iṣakoso ẹya

Iwọnyi jẹ awọn ofin ipilẹ ti o gbọdọ tẹle nigba titẹjade. Alaye ni kikun wa nibi.

A ṣe awọn ibeere wọnyi ni build.gradle faili. Ni akọkọ, jẹ ki a ṣafikun gbogbo alaye pataki nipa awọn olupilẹṣẹ, awọn iwe-aṣẹ, eto iṣakoso ẹya, ati tun ṣeto url, orukọ ati apejuwe iṣẹ naa. Jẹ ki a kọ ọna ti o rọrun fun eyi:

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

Nigbamii ti, o nilo lati pato pe lakoko apejọ ti ipilẹṣẹ -sources.jar и-javadoc.jar awọn faili. Fun apakan yii java o nilo lati fi awọn wọnyi kun:

java {
    withJavadocJar()
    withSourcesJar()
}

Jẹ ki a lọ si ibeere ti o kẹhin, ṣeto ibuwọlu GPG/PGP kan. Lati ṣe eyi, so ohun itanna pọ signing:

plugins {
    id 'signing'
}

Ki o si fi apakan kan kun:

signing {
    sign publishing.publications
}

Ni ipari, jẹ ki a ṣafikun apakan kan 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
            }
        }
    }
}

o ti wa ni sonatypeOrukọ olumulo и sonatypeỌrọigbaniwọle awọn oniyipada ti o ni iwọle ati ọrọ igbaniwọle ti a ṣẹda lakoko iforukọsilẹ lori sonatype.org.

Bayi ni ik build.gradle yoo dabi eyi:

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

Mo fẹ lati ṣe akiyesi pe a gba ẹya lati oniyipada ayika: System.getenv('RELEASE_VERSION'). A yoo fi han lakoko apejọ ati mu lati orukọ tag.

PGP bọtini iran

Ọkan ninu awọn ibeere Sonatype ni pe gbogbo awọn faili wa ni fowo si pẹlu bọtini GPG/PGP. Fun eyi a lọ nibi ati ṣe igbasilẹ ohun elo GnuPG fun ẹrọ ṣiṣe rẹ.

  • A ṣe ipilẹṣẹ bọtini meji kan: gpg --gen-key, tẹ orukọ olumulo sii, imeeli, ati tun ṣeto ọrọ igbaniwọle kan.
  • A ri jade id bọtini wa pẹlu aṣẹ: gpg --list-secret-keys --keyid-format short. Id yoo jẹ pato lẹhin idinku, fun apẹẹrẹ: rsa2048/9B695056
  • Titẹjade bọtini ita gbangba si olupin naa https://keys.openpgp.org pipaṣẹ: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • A ṣe okeere bọtini aṣiri si aye lainidii, a yoo nilo rẹ ni ọjọ iwaju: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Ṣiṣeto Awọn iṣe Github

Jẹ ki a lọ si ipele ikẹhin, ṣeto kikọ ati atẹjade adaṣe ni lilo Awọn iṣe Github.
Awọn iṣe Github jẹ ẹya ti o fun ọ laaye lati ṣe adaṣe adaṣe iṣẹ nipasẹ imuse iwọn CI / CD ni kikun. Kọ, idanwo, ati imuṣiṣẹ le jẹ okunfa nipasẹ awọn iṣẹlẹ lọpọlọpọ: titari koodu, ẹda idasilẹ, tabi awọn ọran. Iṣẹ ṣiṣe yii jẹ ọfẹ patapata fun awọn ibi ipamọ gbogbo eniyan.

Ni apakan yii, Emi yoo fihan ọ bi o ṣe le ṣeto Kọ ati Titari koodu ati ran lọ si ibi ipamọ Sonatype lori itusilẹ, ati ṣeto awọn aṣiri.

A ṣeto awọn asiri

Fun apejọ adaṣe ati imuṣiṣẹ, a nilo nọmba awọn iye aṣiri, gẹgẹbi id bọtini, ọrọ igbaniwọle ti a tẹ sii nigba ti o ṣẹda bọtini, bọtini PGP funrararẹ, ati iwọle/ọrọ igbaniwọle Sonatype. O le ṣeto wọn si apakan pataki ninu awọn eto ibi ipamọ:

Lilo Gradle ati Awọn iṣe Github lati ṣe atẹjade Ise agbese Java si Ibi ipamọ Sonatype Maven Central

A ṣeto awọn oniyipada wọnyi:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - buwolu wọle / ọrọ igbaniwọle ti a tẹ nigbati o forukọsilẹ pẹlu Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — ID bọtini PGP ati ọrọ igbaniwọle ṣeto lakoko iran.

Mo fẹ lati gbe lori GPG_KEY_CONTENTS oniyipada ni awọn alaye diẹ sii. Otitọ ni pe fun ikede a nilo bọtini PGP ikọkọ kan. Lati firanṣẹ ni awọn aṣiri, Mo lo itọsọna ati afikun ohun ti ṣe nọmba kan ti awọn sise.

  • Jẹ ki a paarọ bọtini wa pẹlu gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgnipa titẹ ọrọ igbaniwọle sii. O yẹ ki o gbe sinu oniyipada: SECRET_PASSPHRASE
  • Jẹ ki a tumọ bọtini fifi ẹnọ kọ nkan ti o gba sinu fọọmu ọrọ nipa lilo base64: base64 9B695056.gpg.gpg > 9B695056.txt. Awọn akoonu yoo wa ni gbe sinu oniyipada: GPG_KEY_CONTENTS.

Kọ iṣeto nigbati titari koodu ati ṣiṣẹda PR

Ni akọkọ o nilo lati ṣẹda folda kan ninu gbongbo iṣẹ akanṣe rẹ: .github/workflows.

Ninu rẹ, samisi faili naa, fun apẹẹrẹ, gradle-ci-build.yml pẹlu akoonu wọnyi:

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

Ṣiṣẹ iṣẹ-ṣiṣe yii yoo ṣiṣẹ nigba titari si awọn ẹka master, dev и testing, tun nigba ṣiṣẹda fa ibeere.

Awọn iṣẹ apakan pato awọn igbesẹ lati wa ni executed lori awọn pàtó kan iṣẹlẹ. Ni ọran yii, a yoo kọ sori ẹya tuntun ti ubuntu, lo Java 8, ati tun lo ohun itanna fun Gradle eskatos/gradle-command-action@v1eyi ti, lilo awọn titun ti ikede ti awọn Akole, yoo ṣiṣe awọn ofin pato ninu arguments. Awọn oniyipada secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD awọn wọnyi ni awọn asiri ti a beere tẹlẹ.

Awọn abajade kikọ yoo han ninu taabu Awọn iṣe:

Lilo Gradle ati Awọn iṣe Github lati ṣe atẹjade Ise agbese Java si Ibi ipamọ Sonatype Maven Central

Muu ṣiṣẹ laifọwọyi nigbati itusilẹ tuntun ba jade

Jẹ ki ká ṣẹda kan lọtọ bisesenlo faili fun 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}}

Faili naa fẹrẹ jẹ aami kanna si ti iṣaaju, ayafi fun iṣẹlẹ ninu eyiti yoo jẹ okunfa. Ni idi eyi, eyi ni iṣẹlẹ ti ṣiṣẹda tag pẹlu orukọ ti o bẹrẹ pẹlu v.

Ṣaaju ki o to imuṣiṣẹ, a nilo lati yọ bọtini PGP kuro lati awọn aṣiri ati gbe si gbongbo ti iṣẹ akanṣe naa, bakanna bi o ti kọ. Nigbamii ti, a nilo lati ṣeto iyipada agbegbe pataki kan RELEASE_VERSION eyi ti a tọka si gradle.build faili. Gbogbo eyi ni a ṣe ni apakan Prepare to publish. A gba bọtini wa lati oniyipada GPG_KEY_CONTENTS, tumọ si faili gpg kan, lẹhinna yọkuro nipa fifi sii sinu faili naa secret.gpg.

Nigbamii, a yipada si iyipada pataki kan GITHUB_REF, lati inu eyiti a le gba ẹya ti a ṣeto nigba ṣiṣẹda tag. Oniyipada yii jẹ pataki ninu ọran yii. refs/tags/v0.0.2 lati inu eyiti a ge awọn ohun kikọ 11 akọkọ kuro lati gba ẹya kan pato. Nigbamii, a lo awọn aṣẹ Gradle boṣewa fun titẹjade: test publish

Ṣiṣayẹwo awọn abajade imuṣiṣẹ ni ibi ipamọ Sonatype

Ni kete ti idasilẹ ba ti ṣẹda, ṣiṣan iṣẹ ti a ṣalaye ni apakan ti tẹlẹ yẹ ki o bẹrẹ. Lati ṣe eyi, ṣẹda idasilẹ kan:

Lilo Gradle ati Awọn iṣe Github lati ṣe atẹjade Ise agbese Java si Ibi ipamọ Sonatype Maven Central

orukọ tag gbọdọ bẹrẹ pẹlu v. Ti, lẹhin tite itusilẹ jade, ṣiṣiṣẹsẹhin pari ni aṣeyọri, a le lọ si Atilẹjade Ifiweranṣẹ lati rii daju:

Lilo Gradle ati Awọn iṣe Github lati ṣe atẹjade Ise agbese Java si Ibi ipamọ Sonatype Maven Central

Iṣẹ-ọnà han ni ibi ipamọ Staging. O han lojukanna ni ipo Ṣii, lẹhinna o gbọdọ gbe pẹlu ọwọ si ipo sunmọ nipa titẹ bọtini ti o yẹ. Lẹhin ti ṣayẹwo pe gbogbo awọn ibeere ti pade, artifact naa lọ si ipo Sunmọ ko si si fun iyipada. Ni fọọmu yii, yoo pari ni MavenCentral. Ti ohun gbogbo ba dara, o le tẹ bọtini naa Tu, ati awọn artifact yoo pari soke ni Sonatype ibi ipamọ.

Ni ibere fun artifact lati wọle si MavenCentral, o nilo lati beere fun ni iṣẹ-ṣiṣe ti a ṣẹda ni ibẹrẹ. O nilo lati ṣe eyi lẹẹkan, nitorinaa a ṣe atẹjade fun igba akọkọ. Ni awọn akoko atẹle, eyi ko nilo, ohun gbogbo yoo muuṣiṣẹpọ laifọwọyi. Wọn tan amuṣiṣẹpọ fun mi ni kiakia, ṣugbọn o gba to awọn ọjọ 5 fun artifact lati wa ni MavenCentral.

Iyẹn ni gbogbo rẹ, a ti ṣe atẹjade ohun-ọṣọ wa ni MavenCentral.

wulo awọn ọna asopọ

  • Iru nkan, nikan jade nipasẹ maven
  • Iṣeto ibi ipamọ Sonatype
  • Jira Sonatype ninu eyiti lati ṣẹda iṣẹ-ṣiṣe naa
  • Apeere: ibi ipamọ nibiti o ti ṣeto gbogbo rẹ

orisun: www.habr.com