Kugwiritsa Ntchito Gradle ndi Github Zochita Kusindikiza Java Project ku Sonatype Maven Central Repository

M'nkhaniyi, ndikufuna kuyang'ana mwatsatanetsatane ndondomeko yosindikiza zojambula za Java kuyambira pachiyambi kupyolera mu Github Actions kupita ku Sonatype Maven Central Repository pogwiritsa ntchito Gradle builder.

Ndinaganiza zolemba nkhaniyi chifukwa cha kusowa kwa maphunziro abwino pamalo amodzi. Chidziwitso chonse chinayenera kusonkhanitsidwa pang'onopang'ono kuchokera kuzinthu zosiyanasiyana, kuwonjezera apo, osati zatsopano. Ndani amasamala, kulandiridwa pansi pa mphaka.

Kupanga malo osungiramo zinthu ku Sonatype

Gawo loyamba ndikupanga malo osungiramo zinthu ku Sonatype Maven Central. Kwa ichi tipita apa, lembani ndikupanga ntchito yatsopano, kutipempha kuti tipange malo osungira. Timayendetsa m'mitima yathu GuluId polojekiti, Ulalo wa polojekiti ulalo wa polojekiti ndi SCM ulalo ulalo wa dongosolo lowongolera momwe polojekitiyi ilili. GuluId apa payenera kukhala mawonekedwe com.example, com.example.domain, com.example.testsupport, ndipo atha kukhalanso ngati ulalo ku github yanu: github.com/yourusername -> io.github.yourusername. Mulimonsemo, mufunika kutsimikizira umwini wa domeni kapena mbiriyi. Ngati mwatchula mbiri ya github, mudzafunsidwa kuti mupange malo osungira anthu ambiri ndi dzina lomwe mukufuna.

Patapita kanthawi mutatsimikizira, GroupId yanu idzapangidwa ndipo tikhoza kupita ku sitepe yotsatira, kasinthidwe ka Gradle.

Kukonza Gradle

Panthawi yolemba, sindinapeze mapulagini a Gradle omwe angathandize kufalitsa chojambulacho. izi pulogalamu yowonjezera yekha kuti ndinapeza Komabe, wolemba anakana zina kuthandizira izo. Chifukwa chake, ndinaganiza zopanga chilichonse ndekha, popeza sizovuta kuchita izi.

Chinthu choyamba kudziwa ndi zofunika za Sonatype kuti asindikize. Iwo ndi awa:

  • Kupezeka kwa ma source code ndi JavaDoc, mwachitsanzo. ayenera kupezekapo -sources.jar ΠΈ-javadoc.jar mafayilo. Monga tafotokozera m'mabuku, ngati sizingatheke kupereka zizindikiro kapena zolemba, mukhoza kupanga dummy -sources.jar kapena -javadoc.jar ndi losavuta README mkati kuti mupambane mayeso.
  • Mafayilo onse ayenera kusaina ndi GPG/PGPndi .asc fayilo yomwe ili ndi siginecha iyenera kuphatikizidwa pa fayilo iliyonse.
  • kupezeka pom fayilo
  • Mfundo zolondola groupId, artifactId ΠΈ version. Mtunduwu ukhoza kukhala wachingwe ndipo sungathe kutha -SNAPSHOT
  • Kukhalapo kumafunika name, description ΠΈ url
  • Kukhalapo kwa chidziwitso chokhudza laisensi, omanga ndi makina owongolera mtundu

Awa ndi malamulo ofunikira omwe ayenera kutsatiridwa pofalitsa. Zambiri zomwe zilipo apa.

Timakwaniritsa zofunikira izi mu build.gradle wapamwamba. Choyamba, tiyeni tiwonjezere zidziwitso zonse zofunika za opanga, zilolezo, makina owongolera mtundu, ndikuyikanso ulalo, dzina ndi kufotokozera ntchitoyo. Tiyeni tilembe njira yosavuta ya izi:

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

Kenako, muyenera kufotokoza kuti pa msonkhano kwaiye -sources.jar ΠΈ-javadoc.jar mafayilo. Za gawo ili java muyenera kuwonjezera izi:

java {
    withJavadocJar()
    withSourcesJar()
}

Tiyeni tipitirire ku chofunikira chomaliza, kukhazikitsa siginecha ya GPG/PGP. Kuti muchite izi, gwirizanitsani pulogalamu yowonjezera signing:

plugins {
    id 'signing'
}

Ndipo onjezani gawo:

signing {
    sign publishing.publications
}

Pomaliza, tiyeni tiwonjezere gawo 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
            }
        }
    }
}

ndi sonatypeUsername ΠΈ sonatypePassword zosintha zomwe zili ndi malowedwe ndi mawu achinsinsi omwe adapangidwa panthawi yolembetsa sonatype.org.

Choncho komaliza build.gradle zidzawoneka motere:

Full build.gradle kodi

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

Ndikufuna kuzindikira kuti timapeza mtunduwo kuchokera kumitundu yosiyanasiyana: System.getenv('RELEASE_VERSION'). Tidzawulula panthawi yosonkhanitsa ndikuzichotsa ku dzina lachidziwitso.

Kusintha kwamitengo ya PGP

Chimodzi mwazofunikira za Sonatype ndikuti mafayilo onse asainidwe ndi kiyi ya GPG/PGP. Kwa ichi tipita apa ndikutsitsa pulogalamu ya GnuPG pamakina anu ogwiritsira ntchito.

  • Timapanga makiyi awiri: gpg --gen-key, lowetsani dzina lolowera, imelo, komanso ikani mawu achinsinsi.
  • Kudziwa id kiyi yathu ndi lamulo: gpg --list-secret-keys --keyid-format short. Id idzafotokozedwa pambuyo slash, mwachitsanzo: rsa2048/9B695056
  • Kusindikiza kiyi yapagulu ku seva https://keys.openpgp.org ndi lamulo: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Timatumiza kiyi yachinsinsi kumalo osakhazikika, tidzayifuna mtsogolo: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Kukhazikitsa Zochita za Github

Tiyeni tipitirire ku gawo lomaliza, konzani zomanga ndikusindikiza zokha pogwiritsa ntchito Github Actions.
Github Actions ndi gawo lomwe limakupatsani mwayi woti muzitha kuyendetsa bwino ntchito pokhazikitsa kuzungulira kwa CI / CD. Kupanga, kuyesa, ndi kutumiza kumatha kuyambitsidwa ndi zochitika zosiyanasiyana: kukankha ma code, kupanga kutulutsa, kapena zovuta. Izi ndi mfulu mwamtheradi kwa anthu nkhokwe.

Mu gawo ili, ndikuwonetsani momwe mungakhazikitsire kachidindo ndikukankhira ndikuyika kunkhokwe ya Sonatype pakumasulidwa, komanso kukhazikitsa zinsinsi.

Timayika zinsinsi

Kuti tigwirizane ndi kutumiza, timafunikira zinthu zingapo zachinsinsi, monga ID ya kiyi, mawu achinsinsi omwe tidalowa popanga kiyi, fungulo la PGP palokha, ndi mawu achinsinsi a Sonatype. Mutha kuziyika mugawo lapadera pazokonda zosungira:

Kugwiritsa Ntchito Gradle ndi Github Zochita Kusindikiza Java Project ku Sonatype Maven Central Repository

Timapanga zosintha zotsatirazi:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - lowani / mawu achinsinsi omwe tidalowa polembetsa ndi Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD - ID ya kiyi ya PGP ndi mawu achinsinsi amayikidwa panthawi yakubadwa.

Ndikufuna kukhalabe pazosintha za GPG_KEY_CONTENTS mwatsatanetsatane. Chowonadi ndi chakuti pofalitsa timafunikira kiyi yachinsinsi ya PGP. Pofuna kuziyika mu zinsinsi, ndimagwiritsa ntchito malangizo ndipo adachitanso zinthu zingapo.

  • Tiyeni tilembetse kiyi yathu ndi gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgpolowetsa mawu achinsinsi. Iyenera kuyikidwa mosintha: SECRET_PASSPHRASE
  • Tiyeni titanthauzire kiyi yosungidwa yolandiridwa kukhala mawu pogwiritsa ntchito base64: base64 9B695056.gpg.gpg > 9B695056.txt. Zomwe zilipo zidzayikidwa muzosintha: GPG_KEY_CONTENTS.

Pangani khwekhwe mukakankhira kachidindo ndikupanga PR

Choyamba muyenera kupanga chikwatu muzu wa polojekiti yanu: .github/workflows.

Momwemo, lembani fayiloyo, mwachitsanzo, gradle-ci-build.yml ndi izi:

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

Ntchitoyi idzagwiritsidwa ntchito pokankhira ku nthambi master, dev ΠΈ testing, komanso popanga zopempha kukoka.

Gawo la ntchito limafotokoza njira zomwe zikuyenera kuchitika pazochitika zomwe zatchulidwa. Pankhaniyi, tidzamanga pa ubuntu waposachedwa, kugwiritsa ntchito Java 8, komanso kugwiritsa ntchito pulogalamu yowonjezera ya Gradle. eskatos/gradle-command-action@v1zomwe, pogwiritsa ntchito mtundu waposachedwa wa omanga, zidzayendetsa malamulo omwe afotokozedwamo arguments. Zosintha secrets.SONATYPE_USERNAME ΠΈ secrets.SONATYPE_PASSWORD izi ndi zinsinsi tidafunsa kale.

Zotsatira zomanga zidzawonetsedwa mu tabu ya Zochita:

Kugwiritsa Ntchito Gradle ndi Github Zochita Kusindikiza Java Project ku Sonatype Maven Central Repository

Ingotumizani zokha mukatulutsa chatsopano

Tiyeni tipange fayilo yosiyana ya kayendedwe ka ntchito ya 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}}

Fayiloyo ili pafupifupi yofanana ndi yapitayi, kupatulapo chochitika chomwe chidzayambitsidwe. Pachifukwa ichi, ichi ndi chochitika chopanga tag yokhala ndi dzina loyambira ndi v.

Tisanayambe kutumizidwa, tifunika kuchotsa kiyi ya PGP kuchokera ku zinsinsi ndikuyiyika muzu wa polojekitiyo, ndikuyichotsa. Kenaka, tiyenera kukhazikitsa kusintha kwapadera kwa chilengedwe RELEASE_VERSION zomwe tikunena gradle.build wapamwamba. Zonsezi zachitika mu gawo Prepare to publish. Timapeza makiyi athu kuchokera kumitundu ya GPG_KEY_CONTENTS, kumasulira kukhala fayilo ya gpg, kenako ndikuyilemba poyiyika mufayiloyo. secret.gpg.

Kenaka, timatembenukira ku kusintha kwapadera GITHUB_REF, komwe titha kupeza mtundu womwe timayika popanga tag. Kusintha uku ndikoyenera pankhaniyi. refs/tags/v0.0.2 pomwe tidadula zilembo 11 zoyambirira kuti tipeze mtundu wina wake. Kenaka, timagwiritsa ntchito malamulo a Gradle kuti tisindikize: test publish

Kuwona zotsatira zotumizidwa ku Sonatype repository

Pambuyo pomasulidwa, mayendedwe ofotokozedwa m'gawo lapitalo ayenera kuyamba. Kuti muchite izi, pangani kumasulidwa:

Kugwiritsa Ntchito Gradle ndi Github Zochita Kusindikiza Java Project ku Sonatype Maven Central Repository

dzina la tag liyenera kuyamba ndi v. Ngati, mutadina Publish kumasulidwa, mayendedwe akamaliza bwino, titha kupita Sonatype Nexus kuonetsetsa:

Kugwiritsa Ntchito Gradle ndi Github Zochita Kusindikiza Java Project ku Sonatype Maven Central Repository

Chojambulacho chinawonekera mu Staging repository. Nthawi yomweyo imawonekera mu Open status, ndiye iyenera kusamutsidwa pamanja ku Close status podina batani loyenera. Pambuyo powona kuti zofunikira zonse zakwaniritsidwa, chojambulacho chimapita ku Close status ndipo sichikupezekanso kuti chisinthidwe. Mwanjira iyi, idzatha ku MavenCentral. Ngati zonse zili bwino, mutha kukanikiza batani kumasulidwa, ndipo chopangidwacho chidzathera m'nkhokwe ya Sonatype.

Kuti chojambulacho chilowe mu MavenCentral, muyenera kufunsa mu ntchito yomwe tidapanga koyambirira. Muyenera kuchita izi kamodzi kokha, kotero timasindikiza koyamba. Munthawi zotsatila, izi sizofunikira, zonse zimalumikizidwa zokha. Adandiyatsira ine mwachangu, koma zidatenga pafupifupi masiku 5 kuti chojambulacho chipezeke ku MavenCentral.

Ndizo zonse, tasindikiza chojambula chathu ku MavenCentral.

maulalo othandiza

  • Zofanana nkhani, amangosindikiza kudzera pa maven
  • Kusinthana posungira Sonatype
  • Jira Sonatype momwe mungapangire ntchitoyi
  • Chitsanzo: posungira kumene zonse zakhazikitsidwa

Source: www.habr.com