Kutumia Vitendo vya Gradle na Github Kuchapisha Mradi wa Java kwa Jalada kuu la Sonatype Maven

Katika nakala hii, nataka kuangalia kwa karibu mchakato wa kuchapisha mabaki ya Java kutoka mwanzo kupitia Vitendo vya Github hadi Jalada kuu la Sonatype Maven kwa kutumia mjenzi wa Gradle.

Niliamua kuandika makala hii kutokana na ukosefu wa mafunzo ya kawaida katika sehemu moja. Taarifa zote zilipaswa kukusanywa kipande kwa kipande kutoka kwa vyanzo mbalimbali, zaidi ya hayo, sio safi kabisa. Nani anajali, karibu chini ya paka.

Kuunda hazina katika Sonatype

Hatua ya kwanza ni kuunda hazina katika Sonatype Maven Central. Kwa hili tunaenda hapa, jiandikishe na uunde kazi mpya, ukituuliza tuunde hazina. Tunaendesha ndani yetu Kitambulisho cha Kikundi mradi, URL ya Mradi kiungo cha mradi na url ya SCM kiungo kwa mfumo wa udhibiti wa toleo ambalo mradi unapatikana. Kitambulisho cha Kikundi hapa inapaswa kuwa ya fomu com.example, com.example.domain, com.example.testsupport, na pia inaweza kuwa katika mfumo wa kiunga cha github yako: github.com/yourusername -> io.github.jina lako la mtumiaji. Kwa hali yoyote, utahitaji kuthibitisha umiliki wa kikoa hiki au wasifu. Ikiwa umetaja wasifu wa github, utaulizwa kuunda hazina ya umma na jina unalotaka.

Muda fulani baada ya uthibitisho, GroupId yako itaundwa na tunaweza kuendelea hadi hatua inayofuata, usanidi wa Gradle.

Inasanidi Gradle

Wakati wa kuandika, sikupata programu-jalizi za Gradle ambazo zinaweza kusaidia kuchapisha mabaki. Ni programu-jalizi pekee ambayo nimepata, hata hivyo, mwandishi alikataa kuunga mkono zaidi. Kwa hiyo, niliamua kufanya kila kitu mwenyewe, kwa kuwa si vigumu sana kufanya hivyo.

Jambo la kwanza kujua ni mahitaji ya Sonatype kwa uchapishaji. Wao ni wafuatao:

  • Upatikanaji wa misimbo ya chanzo na JavaDoc, yaani. lazima kuhudhuria -sources.jar ΠΈ-javadoc.jar mafaili. Kama ilivyoelezwa katika hati, ikiwa haiwezekani kutoa misimbo ya chanzo au nyaraka, unaweza kufanya dummy -sources.jar au -javadoc.jar kwa README rahisi ndani ili kufaulu mtihani.
  • Faili zote lazima zisainiwe na GPG/PGPNa .asc faili iliyo na saini lazima iwekwe kwa kila faili.
  • upatikanaji pom faili
  • Maadili sahihi groupId, artifactId ΠΈ version. Toleo linaweza kuwa mfuatano wa kiholela na haliwezi kuisha na -SNAPSHOT
  • Uwepo unahitajika name, description ΠΈ url
  • Uwepo wa habari kuhusu leseni, watengenezaji na mfumo wa udhibiti wa toleo

Hizi ndizo sheria za msingi ambazo lazima zifuatwe wakati wa kuchapisha. Taarifa kamili zinapatikana hapa.

Tunatekeleza mahitaji haya katika build.gradle faili. Kwanza, hebu tuongeze maelezo yote muhimu kuhusu watengenezaji, leseni, mfumo wa udhibiti wa toleo, na pia kuweka url, jina na maelezo ya mradi huo. Wacha tuandike njia rahisi kwa hii:

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

Ifuatayo, unahitaji kutaja kwamba wakati wa mkusanyiko unaozalishwa -sources.jar ΠΈ-javadoc.jar mafaili. Kwa sehemu hii java unahitaji kuongeza yafuatayo:

java {
    withJavadocJar()
    withSourcesJar()
}

Wacha tuendelee kwenye hitaji la mwisho, kusanidi saini ya GPG/PGP. Ili kufanya hivyo, kuunganisha Plugin signing:

plugins {
    id 'signing'
}

Na ongeza sehemu:

signing {
    sign publishing.publications
}

Hatimaye, hebu tuongeze sehemu 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
            }
        }
    }
}

Hapa sonatypeJina la mtumiaji ΠΈ sonatypeNenosiri vigezo vyenye kuingia na nenosiri lililoundwa wakati wa usajili sonatype.org.

Hivyo fainali build.gradle itaonekana kama hii:

Msimbo kamili wa 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]'
                }
            }
        }
    }
}

Ninataka kutambua kuwa tunapata toleo kutoka kwa utofauti wa mazingira: System.getenv('RELEASE_VERSION'). Tutaifichua wakati wa kusanyiko na kuichukua kutoka kwa jina la lebo.

Uzalishaji wa ufunguo wa PGP

Moja ya mahitaji ya Sonatype ni kwamba faili zote zitiwe saini kwa ufunguo wa GPG/PGP. Kwa hili tunaenda hapa na upakue matumizi ya GnuPG kwa mfumo wako wa uendeshaji.

  • Tunatengeneza jozi muhimu: gpg --gen-key, ingiza jina la mtumiaji, barua pepe, na pia weka nenosiri.
  • Tunagundua id ufunguo wetu na amri: gpg --list-secret-keys --keyid-format short. Kitambulisho kitabainishwa baada ya kufyeka, kwa mfano: rsa2048/9B695056
  • Kuchapisha ufunguo wa umma kwa seva https://keys.openpgp.org amri: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Tunasafirisha ufunguo wa siri hadi mahali kiholela, tutauhitaji katika siku zijazo: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Kuanzisha Vitendo vya Github

Wacha tuendelee hadi hatua ya mwisho, tusanidi muundo na uchapishe kiotomatiki kwa kutumia Vitendo vya Github.
Vitendo vya Github ni kipengele kinachokuruhusu kuhariri mtiririko wa kazi kwa kutekeleza mzunguko kamili wa CI / CD. Kuunda, kujaribu na kupeleka kunaweza kuanzishwa na matukio mbalimbali: kusukuma msimbo, kuunda toleo au matatizo. Utendaji huu ni bure kabisa kwa hazina za umma.

Katika sehemu hii, nitakuonyesha jinsi ya kusanidi msimbo wa kujenga na kusukuma na kupeleka kwenye hazina ya Sonatype inapotolewa, pamoja na kuweka siri.

Tunaweka siri

Kwa uwekaji na uwekaji kiotomatiki, tunahitaji idadi ya thamani za siri, kama vile kitambulisho cha ufunguo, nenosiri ambalo tuliweka wakati wa kutengeneza ufunguo, ufunguo wa PGP wenyewe, na kuingia/nenosiri la Sonatype. Unaweza kuziweka katika sehemu maalum katika mipangilio ya hazina:

Kutumia Vitendo vya Gradle na Github Kuchapisha Mradi wa Java kwa Jalada kuu la Sonatype Maven

Tunaweka vigezo vifuatavyo:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - kuingia / nenosiri ambalo tuliweka wakati wa kusajili na Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD β€” kitambulisho cha kitufe cha PGP na nenosiri limewekwa wakati wa kuunda.

Ninataka kukaa juu ya utofauti wa GPG_KEY_CONTENTS kwa undani zaidi. Ukweli ni kwamba kwa uchapishaji tunahitaji ufunguo wa faragha wa PGP. Ili kuichapisha kwa siri, nilitumia maagizo na kuongeza hatua kadhaa.

  • Wacha tusimba ufunguo wetu na gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgkwa kuingiza nenosiri. Inapaswa kuwekwa katika kigezo: SECRET_PASSPHRASE
  • Wacha tutafsiri ufunguo uliosimbwa kwa njia ya maandishi kwa kutumia base64: base64 9B695056.gpg.gpg > 9B695056.txt. Maudhui yatawekwa katika kigezo: GPG_KEY_CONTENTS.

Unda usanidi wakati wa kusukuma msimbo na kuunda PR

Kwanza unahitaji kuunda folda kwenye mzizi wa mradi wako: .github/workflows.

Ndani yake, weka alama kwenye faili, kwa mfano, gradle-ci-build.yml na maudhui yafuatayo:

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

Mtiririko huu wa kazi utatekelezwa wakati wa kusukuma kwa matawi master, dev ΠΈ testing, pia wakati wa kuunda maombi ya kuvuta.

Sehemu ya kazi inabainisha hatua za kutekelezwa kwenye matukio maalum. Katika kesi hii, tutaunda juu ya toleo la hivi karibuni la ubuntu, tumia Java 8, na pia tutatumia programu-jalizi ya Gradle. eskatos/gradle-command-action@v1ambayo, kwa kutumia toleo la hivi karibuni la mjenzi, itaendesha amri zilizoainishwa ndani arguments. Vigezo secrets.SONATYPE_USERNAME ΠΈ secrets.SONATYPE_PASSWORD hizi ni siri tulizouliza hapo awali.

Matokeo ya muundo yataonyeshwa kwenye kichupo cha Vitendo:

Kutumia Vitendo vya Gradle na Github Kuchapisha Mradi wa Java kwa Jalada kuu la Sonatype Maven

Sambaza kiotomatiki toleo jipya linapotolewa

Wacha tuunde faili tofauti ya mtiririko wa kazi kwa uwekaji kiotomatiki 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 inakaribia kufanana na ile ya awali, isipokuwa kwa tukio ambalo itaanzishwa. Katika kesi hii, hili ni tukio la kuunda tepe yenye jina linaloanza na v.

Kabla ya kupeleka, tunahitaji kutoa ufunguo wa PGP kutoka kwa siri na kuuweka kwenye mzizi wa mradi, na pia kuuondoa. Ifuatayo, tunahitaji kuweka tofauti maalum ya mazingira RELEASE_VERSION ambayo tunarejelea gradle.build faili. Yote hii inafanywa katika sehemu Prepare to publish. Tunapata ufunguo wetu kutoka kwa kutofautisha kwa GPG_KEY_CONTENTS, kuitafsiri kuwa faili ya gpg, kisha kuifuta kwa kuiweka kwenye faili. secret.gpg.

Ifuatayo, tunageuka kwa kutofautiana maalum GITHUB_REF, ambayo tunaweza kupata toleo ambalo tunaweka wakati wa kuunda lebo. Tofauti hii ni muhimu katika kesi hii. refs/tags/v0.0.2 ambayo tulikata herufi 11 za kwanza kupata toleo maalum. Ifuatayo, tunatumia amri za kawaida za Gradle kwa uchapishaji: test publish

Kuangalia matokeo ya uwekaji katika hazina ya Sonatype

Mara tu toleo limeundwa, mtiririko wa kazi ulioelezewa katika sehemu iliyotangulia unapaswa kuanza. Ili kufanya hivyo, tengeneza toleo:

Kutumia Vitendo vya Gradle na Github Kuchapisha Mradi wa Java kwa Jalada kuu la Sonatype Maven

jina la lebo lazima lianze na v. Ikiwa, baada ya kubofya Chapisha toleo, mtiririko wa kazi utakamilika kwa ufanisi, tunaweza kwenda Sonatype Nexus ili kuhakikisha:

Kutumia Vitendo vya Gradle na Github Kuchapisha Mradi wa Java kwa Jalada kuu la Sonatype Maven

Vizalia vya programu vilionekana kwenye hazina ya Staging. Mara moja inaonekana katika hali ya Fungua, basi lazima ihamishwe kwa mikono kwa hali ya Funga kwa kushinikiza kifungo sahihi. Baada ya kuangalia kuwa mahitaji yote yametimizwa, vizalia vya programu huenda kwenye hali ya Funga na haipatikani tena kwa marekebisho. Katika fomu hii, itaishia MavenCentral. Ikiwa kila kitu kiko sawa, unaweza kubonyeza kitufe Achilia, na vizalia vya programu vitaishia kwenye hazina ya Sonatype.

Ili vizalia vya programu viingie MavenCentral, unahitaji kuuliza katika kazi ambayo tuliunda mwanzoni kabisa. Unahitaji kufanya hivi mara moja tu, kwa hivyo tutachapisha kwa mara ya kwanza. Katika nyakati zinazofuata, hii haihitajiki, kila kitu kitasawazishwa kiatomati. Waliwasha upatanishi kwa ajili yangu haraka, lakini ilichukua takriban siku 5 kwa vizalia vya programu kupatikana katika MavenCentral.

Ni hayo tu, tumechapisha vizalia vyetu huko MavenCentral.

Viungo muhimu

  • Sawa makala, kuchapisha tu kupitia maven
  • Kusonga hazina Sonatype
  • jira Sonatype ambayo itaunda kazi
  • Mfano hazina ambapo yote yamewekwa

Chanzo: mapenzi.com