L-użu ta 'Azzjonijiet ta' Gradle u Github biex Tippubblika Proġett Java għar-Repożitorju Ċentrali ta 'Sonatype Maven

F'dan l-artikolu, nixtieq nagħti ħarsa dettaljata lejn il-proċess ta 'pubblikazzjoni ta' artifatt Java mill-bidu permezz ta 'Azzjonijiet Github għar-Repożitorju Ċentrali Sonatype Maven billi tuża l-bennej Gradle.

Iddeċidejt li nikteb dan l-artikolu minħabba n-nuqqas ta 'tutorja normali f'post wieħed. L-informazzjoni kollha kellha tinġabar biċċa biċċa minn diversi sorsi, barra minn hekk, mhux friska għal kollox. Min jimpurtah, merħba taħt qattus.

Ħolqien ta' repożitorju f'Sonatype

L-ewwel pass huwa li toħloq repożitorju f'Sonatype Maven Central. Għal dan immorru hawn, irreġistra u toħloq kompitu ġdid, u titlobna noħolqu repożitorju. Aħna nsuqu fil tagħna GroupId proġett, URL tal-Proġett rabta tal-proġett u SCM url link għas-sistema ta' kontroll tal-verżjoni li fiha jinsab il-proġett. GroupId hawnhekk għandu jkun tal-forma com.example, com.example.domain, com.example.testsupport, u jista 'jkun ukoll fil-forma ta' link għall-github tiegħek: github.com/yourusername -> io.github.yourusername. Fi kwalunkwe każ, ser ikollok bżonn tivverifika s-sjieda ta' dan id-dominju jew profil. Jekk speċifikajt profil github, inti tintalab toħloq repożitorju pubbliku bl-isem mixtieq.

Xi żmien wara l-konferma, se jinħoloq l-Id tal-Grupp tiegħek u nistgħu ngħaddu għall-pass li jmiss, il-konfigurazzjoni ta’ Gradle.

Konfigurazzjoni ta' Gradle

Fil-ħin tal-kitba, ma sibtx plugins Gradle li jistgħu jgħinu fil-pubblikazzjoni tal-artifatt. Hija l-uniku plugin li sibt, madankollu, l-awtur irrifjuta li jkompli jappoġġjah. Għalhekk, iddeċidejt li nagħmel kollox jien, peress li mhux wisq diffiċli li tagħmel dan.

L-ewwel ħaġa li għandek insemmu huma r-rekwiżiti ta 'Sonatype għall-pubblikazzjoni. Dawn huma dawn li ġejjin:

  • Disponibbiltà ta' kodiċijiet tas-sors u JavaDoc, jiġifieri. iridu jattendu -sources.jar и-javadoc.jar fajls. Kif iddikjarat fid-dokumentazzjoni, jekk ma jkunx possibbli li tipprovdi kodiċi tas-sors jew dokumentazzjoni, tista 'tagħmel manikin -sources.jar jew -javadoc.jar b'README sempliċi ġewwa biex tgħaddi mit-test.
  • Il-fajls kollha għandhom ikunu ffirmati bihom GPG/PGPU .asc il-fajl li jkun fih il-firma għandu jkun inkluż għal kull fajl.
  • disponibbiltà pom fajl
  • Valuri korretti groupId, artifactId и version. Il-verżjoni tista 'tkun string arbitrarja u ma tistax tispiċċa bi -SNAPSHOT
  • Preżenza meħtieġa name, description и url
  • Il-preżenza ta 'informazzjoni dwar il-liċenzja, l-iżviluppaturi u s-sistema ta' kontroll tal-verżjoni

Dawn huma r-regoli bażiċi li jridu jiġu segwiti meta tiġi ppubblikata. Informazzjoni sħiħa disponibbli hawn.

Aħna nimplimentaw dawn ir-rekwiżiti fi build.gradle fajl. L-ewwel, ejja nżidu l-informazzjoni kollha meħtieġa dwar l-iżviluppaturi, liċenzji, sistema ta 'kontroll tal-verżjoni, u wkoll issettja l-url, l-isem u d-deskrizzjoni tal-proġett. Ejja nikteb metodu sempliċi għal dan:

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

Sussegwentement, għandek bżonn tispeċifika li matul l-assemblaġġ iġġenerat -sources.jar и-javadoc.jar fajls. Għal din it-taqsima java trid iżżid dan li ġej:

java {
    withJavadocJar()
    withSourcesJar()
}

Ejja ngħaddu għall-aħħar rekwiżit, it-twaqqif ta 'firma GPG/PGP. Biex tagħmel dan, qabbad il-plugin signing:

plugins {
    id 'signing'
}

U żid taqsima:

signing {
    sign publishing.publications
}

Fl-aħħarnett, ejja żid taqsima 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
            }
        }
    }
}

Hawnhekk sonatypeUsername и sonatypePassword varjabbli li fihom il-login u l-password maħluqa waqt ir-reġistrazzjoni fuq sonatype.org.

Għalhekk il-finali build.gradle se tidher bħal din:

Kodiċi build.gradle sħiħ

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

Irrid ninnota li nġibu l-verżjoni mill-varjabbli ambjentali: System.getenv('RELEASE_VERSION'). Aħna se jesponuha waqt l-assemblaġġ u nieħduha mill-isem tat-tikketta.

Ġenerazzjoni taċ-ċavetta PGP

Wieħed mir-rekwiżiti ta' Sonatype huwa li l-fajls kollha jridu jiġu ffirmati b'ċavetta GPG/PGP. Għal dan immorru hawn u niżżel l-utilità GnuPG għas-sistema operattiva tiegħek.

  • Aħna niġġeneraw par ewlieni: gpg --gen-key, daħħal username, e-mail, u wkoll issettja password.
  • Nafu id iċ-ċavetta tagħna bil-kmand: gpg --list-secret-keys --keyid-format short. L-id se tkun speċifikata wara l-linja mmejla, pereżempju: rsa2048/9B695056
  • Il-pubblikazzjoni taċ-ċavetta pubblika għas-server https://keys.openpgp.org kmand: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Aħna nesportaw iċ-ċavetta sigrieta f'post arbitrarju, ikollna bżonnha fil-futur: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Twaqqif ta 'Azzjonijiet Github

Ejja ngħaddu għall-istadju finali, waqqaf il-bini u l-pubblikazzjoni awtomatika billi tuża Github Actions.
Github Actions hija karatteristika li tippermettilek awtomat il-fluss tax-xogħol billi timplimenta ċiklu CI / CD sħiħ. Il-bini, it-test u l-iskjerament jistgħu jiġu attivati ​​minn diversi avvenimenti: kodiċi push, ħolqien ta 'rilaxx, jew kwistjonijiet. Din il-funzjonalità hija assolutament b'xejn għar-repożitorji pubbliċi.

F'din it-taqsima, ser nuruk kif twaqqaf build u push code u tiskjera fir-repożitorju Sonatype mar-rilaxx, kif ukoll twaqqaf sigrieti.

Aħna nistabbilixxu sigrieti

Għall-assemblaġġ u l-iskjerament awtomatiku, neħtieġu numru ta 'valuri sigrieti, bħall-id taċ-ċavetta, il-password li dħalna meta ġġeneraw iċ-ċavetta, iċ-ċavetta PGP nnifisha, u l-login/password Sonatype. Tista' tissettjahom f'sezzjoni speċjali fis-settings tar-repożitorju:

L-użu ta 'Azzjonijiet ta' Gradle u Github biex Tippubblika Proġett Java għar-Repożitorju Ċentrali ta 'Sonatype Maven

Aħna stabbilixxew il-varjabbli li ġejjin:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - login / password li dħalna meta rreġistrajna ma' Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — ID taċ-ċavetta PGP u password stabbiliti waqt il-ġenerazzjoni.

Irrid nitkellem fuq il-varjabbli GPG_KEY_CONTENTS f'aktar dettall. Il-fatt hu li għall-pubblikazzjoni neħtieġu ċavetta PGP privata. Sabiex tpoġġiha fis-sigrieti, użajt istruzzjoni u barra minn hekk għamel numru ta’ azzjonijiet.

  • Ejja nikkriptaw iċ-ċavetta tagħna bil-gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgbilli ddaħħal password. Għandu jitqiegħed f'varjabbli: SECRET_PASSPHRASE
  • Ejja nittraduċu ċ-ċavetta kriptata riċevuta f'forma ta 'test billi tuża base64: base64 9B695056.gpg.gpg > 9B695056.txt. Il-kontenut se jitqiegħed fil-varjabbli: GPG_KEY_CONTENTS.

Ibni setup meta timbotta l-kodiċi u toħloq PR

L-ewwel trid toħloq folder fl-għerq tal-proġett tiegħek: .github/workflows.

Fiha, immarka l-fajl, pereżempju, gradle-ci-build.yml bil-kontenut li ġej:

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

Dan il-fluss tax-xogħol se jiġi eżegwit meta timbotta għall-fergħat master, dev и testing, ukoll meta toħloq talbiet għall-ġibda.

It-taqsima tal-impjiegi tispeċifika l-passi li għandhom jitwettqu fuq l-avvenimenti speċifikati. F'dan il-każ, aħna se nibnu fuq l-aħħar verżjoni ta 'ubuntu, nużaw Java 8, u nużaw ukoll il-plugin għal Gradle eskatos/gradle-command-action@v1li, bl-użu tal-aħħar verżjoni tal-bennej, se jmexxi l-kmandi speċifikati fi arguments. Varjabbli secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD dawn huma s-sigrieti li tlabna qabel.

Ir-riżultati tal-bini se jkunu riflessi fit-tab Azzjonijiet:

L-użu ta 'Azzjonijiet ta' Gradle u Github biex Tippubblika Proġett Java għar-Repożitorju Ċentrali ta 'Sonatype Maven

Skjerament awtomatiku meta toħroġ rilaxx ġdid

Ejja noħolqu fajl tal-fluss tax-xogħol separat għall-awtodeploy 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}}

Il-fajl huwa kważi identiku għal dak preċedenti, ħlief għall-avveniment li fih se jiġi attivat. F'dan il-każ, dan huwa l-avveniment li tinħoloq tikketta b'isem li jibda bil-v.

Qabel l-iskjerament, għandna bżonn niġbdu ċ-ċavetta PGP mis-sigrieti u npoġġuha fl-għerq tal-proġett, kif ukoll tiddekriptaha. Sussegwentement, għandna bżonn nissettjaw varjabbli ambjentali speċjali RELEASE_VERSION li nirreferu għalih gradle.build fajl. Dan kollu jsir fit-taqsima Prepare to publish. Aħna nġibu ċ-ċavetta tagħna mill-varjabbli GPG_KEY_CONTENTS, tittraduċiha f'fajl gpg, imbagħad tiddekriptha billi npoġġuha fil-fajl secret.gpg.

Sussegwentement, aħna nduru għal varjabbli speċjali GITHUB_REF, li minnha nistgħu niksbu l-verżjoni li nissettjaw meta noħolqu t-tikketta. Din il-varjabbli hija rilevanti f'dan il-każ. refs/tags/v0.0.2 li minnha naqtgħu l-ewwel 11-il karattru biex niksbu verżjoni speċifika. Sussegwentement, nużaw il-kmandi Gradle standard għall-pubblikazzjoni: test publish

Iċċekkja r-riżultati tal-iskjerament fir-repożitorju Sonatype

Wara li tinħoloq ir-rilaxx, il-fluss tax-xogħol deskritt fit-taqsima preċedenti għandu jibda. Biex tagħmel dan, oħloq rilaxx:

L-użu ta 'Azzjonijiet ta' Gradle u Github biex Tippubblika Proġett Java għar-Repożitorju Ċentrali ta 'Sonatype Maven

l-isem tat-tikketta għandu jibda bil-v. Jekk, wara li tikklikkja Ippubblika rilaxx, il-fluss tax-xogħol jitlesta b'suċċess, nistgħu mmorru Sonatype Nexus biex tiżgura:

L-użu ta 'Azzjonijiet ta' Gradle u Github biex Tippubblika Proġett Java għar-Repożitorju Ċentrali ta 'Sonatype Maven

L-artifact deher fir-repożitorju Staging. Jidher immedjatament fl-istatus Miftuħ, allura għandu jiġi trasferit manwalment għall-istatus Agħlaq billi tagħfas il-buttuna xierqa. Wara li tiċċekkja li r-rekwiżiti kollha huma sodisfatti, l-artifatt jidħol fl-istatus Agħlaq u m'għadux disponibbli għall-modifika. F'din il-forma, se jispiċċa f'MavenCentral. Jekk kollox huwa tajjeb, tista 'tagħfas il-buttuna Rilaxx, u l-artifact se jispiċċa fir-repożitorju Sonatype.

Sabiex l-artifact jidħol f'MavenCentral, trid titlobha fil-kompitu li ħloqna fil-bidu nett. Għandek bżonn tagħmel dan darba biss, għalhekk aħna nippubblikaw għall-ewwel darba. Fi żminijiet sussegwenti, dan mhux meħtieġ, kollox se jkun sinkronizzat awtomatikament. Huma daru s-sinkronizzazzjoni għalija malajr, iżda ħadet madwar 5 ijiem biex l-artifatt isir disponibbli f'MavenCentral.

Dak kollu, ippubblikajna l-artifatt tagħna f'MavenCentral.

Links utli

  • Simili artikolu, tippubblika biss permezz ta' maven
  • Stadji repożitorju Sonatip
  • Jira Sonatype li fih toħloq il-kompitu
  • Eżempju repożitorju fejn huwa stabbilit kollu

Sors: www.habr.com