Sèvi ak Aksyon Gradle ak Github pou Pibliye Pwojè Java nan Sonatype Maven Central Repository

Nan atik sa a, mwen vle pran yon gade detaye sou pwosesis pou pibliye yon zafè Java soti nan grafouyen atravè Github Actions nan Sonatype Maven Central Repository la lè l sèvi avèk Gradle builder la.

Mwen deside ekri atik sa a akòz mank de yon leson patikilye nòmal nan yon sèl kote. Tout enfòmasyon yo te dwe kolekte moso pa moso nan plizyè sous, Anplis, pa totalman fre. Ki moun ki pran swen, akeyi anba chat.

Kreye yon depo nan Sonatype

Premye etap la se kreye yon depo nan Sonatype Maven Central. Pou sa nou ale isit la, anrejistre epi kreye yon nouvo travay, mande nou kreye yon depo. Nou kondwi nan nou GroupId pwojè, URL Pwojè a lyen pwojè ak SCM adrès entènèt yon lyen nan sistèm kontwòl vèsyon an kote pwojè a sitiye. GroupId isit la ta dwe nan fòm nan com.example, com.example.domain, com.example.testsupport, epi li kapab tou nan fòm lan nan yon lyen nan github ou a: github.com/yourusername -> io.github.yourusername. Nan nenpòt ka, w ap bezwen verifye pwopriyetè domèn oswa pwofil sa a. Si ou espesifye yon pwofil github, yo pral mande w pou kreye yon depo piblik ak non vle a.

Kèk tan apre konfimasyon, GroupId ou a pral kreye epi nou ka ale nan pwochen etap la, konfigirasyon Gradle.

Konfigirasyon Gradle

Nan moman sa a, mwen pa t 'jwenn grefon Gradle ki ta ka ede ak pibliye zafè a. Li plugin a sèlman ke mwen te jwenn, sepandan, otè a te refize plis sipòte li. Se poutèt sa, mwen deside fè tout bagay tèt mwen, paske li pa twò difisil pou fè sa.

Premye bagay yo konnen se kondisyon Sonatype pou pibliye. Yo se sa ki annapre yo:

  • Disponibilite nan kòd sous ak JavaDoc, sa vle di. dwe ale nan -sources.jar и-javadoc.jar dosye. Jan sa endike nan dokiman an, si li pa posib pou bay kòd sous oswa dokimantasyon, ou ka fè yon enbesil. -sources.jar oswa -javadoc.jar ak yon senp README andedan pou pase tès la.
  • Tout fichye yo dwe siyen ak GPG/PGP, Ak .asc dosye ki genyen siyati a dwe enkli pou chak dosye.
  • disponiblite pom dosye
  • Valè kòrèk groupId, artifactId и version. Vèsyon an ka yon fisèl abitrè epi li pa ka fini ak -SNAPSHOT
  • Prezans obligatwa name, description и url
  • Prezans enfòmasyon sou lisans, devlopè ak sistèm kontwòl vèsyon an

Sa yo se règ debaz yo ki dwe swiv lè pibliye. Enfòmasyon konplè ki disponib isit la.

Nou aplike kondisyon sa yo nan build.gradle dosye. Premyèman, se pou yo ajoute tout enfòmasyon ki nesesè sou devlopè yo, lisans, sistèm kontwòl vèsyon an, epi tou li mete url la, non ak deskripsyon pwojè a. Ann ekri yon metòd senp pou sa 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]'
                }
            }
        }
    }
}

Apre sa, ou bezwen presize ke pandan asanble a te pwodwi -sources.jar и-javadoc.jar dosye. Pou seksyon sa a java ou bezwen ajoute bagay sa yo:

java {
    withJavadocJar()
    withSourcesJar()
}

Ann ale nan dènye kondisyon an, mete yon siyati GPG/PGP. Pou fè sa, konekte Plugin la signing:

plugins {
    id 'signing'
}

Epi ajoute yon seksyon:

signing {
    sign publishing.publications
}

Finalman, an n ajoute yon seksyon 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
            }
        }
    }
}

Isit la sonatypeUsername и sonatypePassword varyab ki genyen login ak modpas ki te kreye pandan enskripsyon an sonatype.org.

Kidonk final la build.gradle pral sanble sa a:

Kòd build.gradle konplè

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

Mwen vle sonje ke nou jwenn vèsyon an nan varyab anviwònman an: System.getenv('RELEASE_VERSION'). Nou pral ekspoze li pandan asanble epi pran li nan non tag la.

PGP jenerasyon kle

Youn nan kondisyon Sonatype a se ke tout dosye dwe siyen ak yon kle GPG/PGP. Pou sa nou ale isit la epi telechaje sèvis piblik GnuPG pou sistèm opere w la.

  • Nou jenere yon pè kle: gpg --gen-key, antre yon non itilizatè, e-mail, epi tou mete yon modpas.
  • Nou chèche konnen id kle nou an ak kòmandman an: gpg --list-secret-keys --keyid-format short. Yo pral espesifye id apre koupe an, pou egzanp: rsa2048/9B695056
  • Pibliye kle piblik la sou sèvè a https://keys.openpgp.org kòmandman: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Nou ekspòte kle sekrè a nan yon kote abitrè, nou pral bezwen li nan tan kap vini an: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Mete kanpe aksyon Github

Ann ale nan etap final la, mete kanpe bati a ak oto-pibliye lè l sèvi avèk Github Actions.
Github Actions se yon karakteristik ki pèmèt ou otomatize workflow la lè w aplike yon sik CI / CD konplè. Bati, teste, ak deplwaye ka deklanche pa divès evènman: pouse kòd, kreyasyon lage, oswa pwoblèm. Fonksyonalite sa a se absoliman gratis pou depo piblik yo.

Nan seksyon sa a, mwen pral montre w kouman yo mete kanpe kòd bati ak pouse ak deplwaye nan repozitwa Sonatype a sou lage, osi byen ke mete sekrè.

Nou mete sekrè

Pou asanble ak deplwaman otomatik, nou bezwen yon kantite valè sekrè, tankou id kle a, modpas ke nou te antre lè nou te jenere kle a, kle PGP li menm, ak login/modpas Sonatype. Ou ka mete yo nan yon seksyon espesyal nan anviwònman yo depo:

Sèvi ak Aksyon Gradle ak Github pou Pibliye Pwojè Java nan Sonatype Maven Central Repository

Nou mete varyab sa yo:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - login / modpas ke nou te antre lè nou te anrejistre ak Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — ID kle PGP ak modpas mete pandan jenerasyon an.

Mwen vle rete sou varyab GPG_KEY_CONTENTS nan plis detay. Reyalite a se ke pou piblikasyon nou bezwen yon kle PGP prive. Yo nan lòd yo poste li nan sekrè yo, mwen te itilize enstriksyon epi anplis fè yon kantite aksyon.

  • Ann ankripte kle nou an ak gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgpa antre yon modpas. Li ta dwe mete nan yon varyab: SECRET_PASSPHRASE
  • Ann tradwi kle ankripte resevwa a nan yon fòm tèks lè l sèvi avèk base64: base64 9B695056.gpg.gpg > 9B695056.txt. Yo pral mete kontni an nan varyab la: GPG_KEY_CONTENTS.

Bati konfigirasyon lè pouse kòd ak kreye PR

Premye ou bezwen kreye yon katab nan rasin pwojè ou a: .github/workflows.

Nan li, make dosye a, pou egzanp, gradle-ci-build.yml ak kontni sa 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}}

Workflow sa a pral egzekite lè pouse nan branch yo master, dev и testing, tou lè yo kreye demann rale.

Seksyon travay la presize etap yo dwe egzekite sou evènman yo espesifye. Nan ka sa a, nou pral bati sou dènye vèsyon an nan ubuntu, sèvi ak Java 8, epi tou itilize Plugin la pou Gradle. eskatos/gradle-command-action@v1ki, lè l sèvi avèk vèsyon an dènye nan mason an, pral kouri kòmandman yo espesifye nan arguments. Varyab secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD sa yo se sekrè nou te mande pi bonè.

Rezilta konstriksyon yo pral reflete nan tab la Aksyon:

Sèvi ak Aksyon Gradle ak Github pou Pibliye Pwojè Java nan Sonatype Maven Central Repository

Oto-deplwaye lè yo lage yon nouvo lage

Ann kreye yon dosye workflow separe pou 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}}

Fichye a se prèske ki idantik ak youn anvan an, eksepte pou evènman an nan ki li pral deklanche. Nan ka sa a, sa a se evènman an nan kreye yon tag ak yon non kòmanse ak v.

Anvan deplwaman, nou bezwen ekstrè kle PGP a soti nan sekrè yo epi mete l nan rasin pwojè a, osi byen ke dechifre li. Apre sa, nou bezwen mete yon varyab anviwònman espesyal RELEASE_VERSION ki nou refere gradle.build dosye. Tout bagay sa yo fè nan seksyon an Prepare to publish. Nou jwenn kle nou an nan varyab GPG_KEY_CONTENTS, tradui l nan yon fichye gpg, apresa dechifre li pa mete l nan dosye a. secret.gpg.

Apre sa, nou ale nan yon varyab espesyal GITHUB_REF, ki soti nan ki nou ka jwenn vèsyon an ke nou mete lè kreye tag la. Varyab sa a enpòtan nan ka sa a. refs/tags/v0.0.2 ki soti nan ki nou koupe 11 premye karaktè yo jwenn yon vèsyon espesifik. Apre sa, nou itilize kòmandman Gradle estanda yo pou pibliye: test publish

Tcheke rezilta deplwaman nan depo Sonatype

Apre yo fin kreye lage a, workflow ki dekri nan seksyon anvan an ta dwe kòmanse. Pou fè sa, kreye yon lage:

Sèvi ak Aksyon Gradle ak Github pou Pibliye Pwojè Java nan Sonatype Maven Central Repository

non tag la dwe kòmanse ak v. Si, apre yo fin klike sou Pibliye lage, workflow la konplete avèk siksè, nou ka ale nan Sonatype Nexus pou asire w:

Sèvi ak Aksyon Gradle ak Github pou Pibliye Pwojè Java nan Sonatype Maven Central Repository

Zafè a parèt nan depo Staging la. Li imedyatman parèt nan estati a Louvri, Lè sa a, li dwe manyèlman transfere nan estati a Fèmen pa peze bouton ki apwopriye a. Apre w fin tcheke si tout egzijans yo satisfè, zafè a antre nan estati Fèmen epi li pa disponib ankò pou modifikasyon. Nan fòm sa a, li pral fini nan MavenCentral. Si tout bagay byen, ou ka peze bouton an Remèt, ak zafè a pral fini nan depo Sonatype a.

Pou zafè a antre nan MavenCentral, ou bezwen mande pou li nan travay la ke nou te kreye nan kòmansman an anpil. Ou sèlman bezwen fè sa yon fwa, kidonk nou pibliye pou premye fwa. Nan tan ki vin apre, sa a pa obligatwa, tout bagay pral senkronize otomatikman. Yo te vire sou senkronizasyon pou mwen byen vit, men li te pran apeprè 5 jou pou zafè a vin disponib nan MavenCentral.

Sa a tout, nou te pibliye zafè nou an nan MavenCentral.

lyen itil

  • Menm jan an atik, sèlman pibliye atravè maven
  • Rasanbleman depo Sonatip
  • Jira Sonatype nan ki kreye travay la
  • Egzanp repozitwa kote li tout mete kanpe

Sous: www.habr.com