Faʻaaogaina Gradle ma Github Actions e faʻasalalau ai se poloketi Java i le Sonatype Maven Central Repository

I totonu o lenei tusiga, ou te manaʻo e vaʻavaʻai totoʻa i le faʻagasologa o le lolomiina o se Java artifact mai le sasa e ala i Github Actions i le Sonatype Maven Central Repository e faʻaaoga ai le Gradle collector.

Na ou filifili e tusi lenei tusiga ona o le leai o se aʻoaʻoga masani i se tasi nofoaga. O faʻamatalaga uma e tatau ona aoina faʻatasi ma lea vaega mai faʻamatalaga eseese, ae le o faʻamatalaga lata mai. So'o se tasi e fiafia, fa'afeiloa'i ile pusi.

Fausia se fale teu oloa i Sonatype

O le laasaga muamua o le fatuina lea o se fale teu oloa i Sonatype Maven Central. Mo lenei mea tatou te o ai iinei, resitala ma faia se galuega fou ma se talosaga e fai se fale teu oloa mo i matou. Matou te tietie i la matou taavale GroupId galuega faatino, Poloketi URL sootaga i le poloketi ma SCM url se so'oga i le fa'atonuga o fa'asologa o lo'o i ai le poloketi. GroupId e tatau ona pei o com.example, com.example.domain, com.example.testsupport, ma e mafai foi ona i ai i le tulaga o se sootaga i lau github: github.com/yourusername -> io.github.yourusername. I so'o se tulaga, e te mana'omia le fa'amaonia o le umiaina o le vaega po'o le fa'amatalaga. Afai na e faʻamaonia se faʻamatalaga Github, o le a talosagaina oe e fai se fale teu oloa lautele ma le igoa e manaʻomia.

I se taimi pe a maeʻa le faʻamaoniga, o le a faia lau GroupId ma e mafai ona matou agai atu i le isi laasaga, Gradle configuration.

Fa'atonu Gradle

I le taimi o le tusitusi, ou te leʻi mauaina ni mea faʻapipiʻi mo Gradle e mafai ona fesoasoani i le lolomiina o se mea. lea na o le plugin lea na ou mauaina, ae na musu le tusitala e toe lagolagoina. O le mea lea, na ou filifili ai e fai mea uma lava ia, o le mea e lelei ai e le faigata tele.

O le mea muamua e suʻesuʻe o manaoga faʻasalalau a Sonatype. O latou nei:

  • Avanoa o faʻailoga punaʻoa ma JavaDoc, i.e. e tatau ona i ai -sources.jar и-javadoc.jar faila. E pei ona taʻua i totonu o faʻamaumauga, afai e le mafai ona tuʻuina atu tulafono faʻavae poʻo faʻamaumauga, e mafai ona e faia se dummy -sources.jar poʻo -javadoc.jar fa'atasi ai ma se README faigofie i totonu e pasi ai fa'amaoniga.
  • E tatau ona sainia uma faila GPG/PGPma .asc o le faila o loʻo i ai le saini e tatau ona aofia ai mo faila taʻitasi.
  • avanoa pom faila
  • Fa'atatau sa'o groupId, artifactId и version. Fa'aliliuga e mafai ona avea ma se manoa fa'apitoa ma e le mafai ona fa'ai'u i -SNAPSHOT
  • Manaomia le auai name, description и url
  • Le i ai o faʻamatalaga e uiga i le laisene, tagata atiaʻe ma le faʻatonuga o faiga

O tulafono fa'avae ia e tatau ona mulimulita'ia pe a fa'asalalau. E maua fa'amatalaga atoa iinei.

O le a matou faʻatinoina nei manaʻoga i build.gradle faila. Muamua, seʻi o tatou faʻaopoopo uma faʻamatalaga talafeagai e uiga i tagata atiaʻe, laisene, faiga faʻatonuga, ma seti foi le url, igoa ma faʻamatalaga o le poloketi. Ina ia faia lenei mea, seʻi o tatou tusia se auala faigofie:

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

Sosoo ai e tatau ona e faʻamaonia i le taimi o le faʻapotopotoga o le a latou gaosia -sources.jar и-javadoc.jar faila. Ina ia faia lenei mea, alu i le vaega java e tatau ona e fa'aopoopo mea nei:

java {
    withJavadocJar()
    withSourcesJar()
}

Se'i o tatou agai i luma i le mana'oga mulimuli, fa'atulaga se saini GPG/PGP. Ina ia faia lenei mea, tatou faʻafesoʻotaʻi le plugin signing:

plugins {
    id 'signing'
}

Ma faaopoopo se vaega:

signing {
    sign publishing.publications
}

Mulimuli ane, tatou faaopoopo se vaega 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 sonatypeUsername и sonatypePassword fesuia'i o lo'o iai le saini ma le fa'aupuga na faia i le taimi o le resitalaina i sonatype.org.

O le mea mulimuli la build.gradle e pei o lenei:

Fa'ailoga atoa build.gradle

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

Ou te fia maitauina tatou te mauaina le faʻamatalaga mai le fesuiaiga o le siosiomaga: System.getenv('RELEASE_VERSION'). O le a matou setiina i le taimi o le faʻapotopotoga ma ave mai le igoa igoa.

PGP fa'atupuina autu

O se tasi o mana'oga a Sonatype o le sainia uma o faila e fa'aaoga ai le GPG/PGP key. Mo lenei mea tatou te o ai iinei ma la'u mai le aoga GnuPG mo lau faiga fa'aoga.

  • Fausia se paga autu: gpg --gen-key, ulufale i lou username, i-meli, ma seti foi se upu faataga.
  • Se'i tatou su'e id la tatou ki ma le poloaiga: gpg --list-secret-keys --keyid-format short. Id o le a faʻaalia pe a uma le faʻailoga, mo se faʻataʻitaʻiga: rsa2048/9B695056
  • Fa'asalalau le ki fa'alaua'itele i le server https://keys.openpgp.org poloa'iga: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Matou te auina atu i fafo le ki faalilolilo i se nofoaga faʻapitoa; matou te manaʻomia mulimuli ane: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Fa'atulaga Github Actions

Sei o tatou agai i luma i le tulaga mulimuli, faʻatulagaina le fausiaina ma le faʻasalalau faʻasalalau e faʻaaoga ai Github Actions.
Github Actions o se gaioiga e mafai ai e oe ona faʻaogaina le faʻaogaina o galuega e ala i le faʻatinoina o se taamilosaga CI / CD atoa. Fausia, faʻataʻitaʻiga ma faʻapipiʻiina e mafai ona faʻaosoina e ala i mea eseese: tuleia le code, fatuina o se faʻamalolo poʻo ni faʻafitauli. O lenei galuega e matua leai se totogi mo faleteuoloa lautele.

I lenei vaega, o le a ou faʻaali atu ia te oe le faʻatulagaina o le fausiaina ma le tuleia o le code ma le faʻapipiʻiina i le Sonatype repository pe a tuʻuina atu se faʻamalologa, faʻapea foʻi ma le faʻatulagaina o mealilo.

Faatuina mea lilo

Mo le faʻapipiʻiina otometi ma le faʻapipiʻiina, matou te manaʻomia se numera o mea lilo, e pei o le ki id, le upu faʻaulu na matou ulufale i le faʻatupuina o le ki, le ki PGP lava ia, faʻapea foʻi ma le login / password mo Sonatype. E mafai ona e setiina i latou i se vaega faʻapitoa i totonu o le fale teu oloa:

Faʻaaogaina Gradle ma Github Actions e faʻasalalau ai se poloketi Java i le Sonatype Maven Central Repository

Matou te setiina suiga nei:

  • SONATYPE_USERNAME/SONATYPE_PASSWORD - saini/password na matou ulufale ina ua lesitala ile Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP ki id ma upu faataga seti i le faagasologa

Ou te fia nofo i le GPG_KEY_CONTENTS fesuiaiga i nisi auiliiliga. O le mea moni o le lolomiina matou te manaʻomia se ki PGP tumaoti. Ina ia tuu i mea lilo, sa ou faaaogaina faatonuga ma sa faia foi le tele o gaioiga.

  • Sei o tatou faʻailogaina la tatou ki e faʻaaoga ai le gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpge ala i le ulufale i le upu faataga. E tatau ona tu'u i se fesuiaiga: SECRET_PASSPHRASE
  • Se'i o tatou fa'aliliuina le ki fa'ailoga fa'atupu i totonu o fa'amatalaga tusitusia e fa'aaoga ai le base64: base64 9B695056.gpg.gpg > 9B695056.txt. O le a matou tu'uina mea i totonu o le fesuiaiga: GPG_KEY_CONTENTS.

Faʻatulagaina se fale pe a tuleia le code ma fatuina se PR

Muamua e tatau ona e fatuina se faila i le aʻa o lau poloketi: .github/workflows.

Faailoga le faila i totonu, mo se faataitaiga, gradle-ci-build.yml fa'atasi ai ma mea 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}}

O le a fa'atinoina lea fa'asologa o galuega pe a tulei i lala master, dev и testing, fa'apea fo'i pe a faia ni talosaga toso.

O le vaega o galuega o loʻo faʻamaonia ai laasaga e tatau ona faʻatinoina e faʻatatau i mea faʻapitoa. I lenei tulaga, o le a matou fausia i luga o le lomiga lata mai o ubuntu, faʻaaoga Java 8, ma faʻaaoga foi se masini mo Gradle eskatos/gradle-command-action@v1, lea, i le faʻaaogaina o le lomiga lata mai o le aoina, o le a faʻatautaia poloaiga o loʻo faʻamaonia i totonu arguments. Fuafuaga secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD O mealilo ia na matou fesiligia muamua.

O fa'ai'uga faufale o le a fa'aalia i le Fa'asagaga fa'amau:

Faʻaaogaina Gradle ma Github Actions e faʻasalalau ai se poloketi Java i le Sonatype Maven Central Repository

Autodeploy pe a fa'amatu'u se fa'asalalauga fou

Mo le autodeployment, o le a matou fatuina se faila faila galue 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}}

O le faila e toetoe lava a tutusa ma le muamua sei vagana ai le mea na tupu o le a faʻaosoina ai. I lenei tulaga, o le mea lea na tupu o le fatuina o se pine ma se igoa e amata i le v.

Aʻo leʻi faʻapipiʻiina, e manaʻomia ona aveese le ki PGP mai mea lilo ma tuʻu i totonu o le aʻa o le poloketi, faʻapea foʻi ma le faʻamaonia. O le isi mea e tatau ona tatou setiina se fesuiaiga o le siosiomaga faʻapitoa RELEASE_VERSION lea tatou te faasino i ai gradle.build faila. O nei mea uma e faia i le vaega Prepare to publish. Matou te maua la matou ki mai le GPG_KEY_CONTENTS fesuia'i, fa'aliliu i se faila gpg, ona fa'ailoga lea e ala i le tu'u i totonu o le faila. secret.gpg.

Ona sosoo ai lea ma le avanoa i le fesuiaiga faapitoa GITHUB_REF, lea e mafai ai ona matou maua le faʻamatalaga na matou faʻamaonia pe a fatuina le pine. O lenei fesuiaiga i lenei tulaga ei ai le tau refs/tags/v0.0.2 lea matou te tipi ese ai le 11 mataitusi muamua e maua ai le faʻamatalaga patino. Ma le isi, matou te faʻaogaina tulafono masani a Gradle mo le lolomiina: test publish

O le siakiina o le faʻapipiʻiina o taunuʻuga i le Sonatype repository

A mae'a ona faia le fa'asalalauga, e tatau ona amata le galuega fa'amatala i le vaega muamua. Ina ia faia lenei mea, matou te faia se faʻasalalauga:

Faʻaaogaina Gradle ma Github Actions e faʻasalalau ai se poloketi Java i le Sonatype Maven Central Repository

i lenei tulaga, o le igoa fa'ailoga e tatau ona amata i le v. Afai, a maeʻa ona kiliki Faʻasalalau faʻasalalauga, o loʻo sologa lelei le galuega, e mafai ona tatou alu i Faʻatonu Faʻatonu ia mautinoa:

Faʻaaogaina Gradle ma Github Actions e faʻasalalau ai se poloketi Java i le Sonatype Maven Central Repository

Na fa'aalia lea mea i totonu o le faleteuoloa o le Staging. E vave ona aliali mai i le tulaga Tatala, ona tatau lea ona faʻafeiloaʻi ma le lima i le tulaga Close e ala i le kilikiina o le ki fetaui. A uma ona siaki ua ausia uma mana'oga, o le meafaitino e alu i le tulaga Close ma ua le toe avanoa mo suiga. I lenei fomu o le a alu i MavenCentral. Afai e lelei mea uma, e mafai ona e oomi le ki tatala, ma o le a alu le meafaitino i le Sonatype repository.

Ina ia mafai ona faʻapipiʻi le mea faʻapitoa i MavenCentral, e tatau ona e fesili i ai i le galuega na matou fatuina i le amataga. E na'o le tasi le mea e te mana'omia, o lea matou te fa'asalalauina mo le taimi muamua. E leai se mea e manaʻomia e fai ai i le isi taimi, o mea uma o le a faʻapipiʻiina otometi. Na vave ona latou kiina le fa'amaopoopoina mo a'u, ae pe a ma le 5 aso na maua ai le meafaitino i MavenCentral.

Pau lava lena, na matou faʻasalalau a matou mea faʻapitoa i MavenCentral.

aoga fesoʻotaʻiga

  • E tutusa se tusiga, na'o le lolomiina e ala i le maven
  • Faatulagaga faleteuoloa Sonatype
  • Jira Sonatype e te manaʻomia e fai ai se galuega
  • Faataitaiga: faleteuoloa o lo'o fa'atulaga uma ai

puna: www.habr.com