Bikaranîna Çalakiyên Gradle û Github ji bo Weşandina Projeya Java li Depoya Navendî ya Sonatype Maven

Di vê gotarê de, ez dixwazim bi hûrgulî li pêvajoya weşandina hunerek Java-yê ji sifrê bi navgîniya Github Actions-ê heya Depoya Navendî ya Sonatype Maven bi karanîna avakerê Gradle-ê bigerim.

Min biryar da ku ez vê gotarê binivîsim ji ber nebûna dersek normal li yek cîhek. Diviyabû ku hemî agahdarî perçe perçe ji çavkaniyên cihêreng werin berhev kirin, ji bilî vê, ne bi tevahî nû. Kî xem dike, bi xêr hatî bin pisîkê.

Afirandina depoyek li Sonatype

Gava yekem ev e ku meriv li Sonatype Maven Central depoyek biafirîne. Ji bo vê em diçin vir, qeyd bikin û peywirek nû biafirînin, ji me dipirsin ku em depoyek çêbikin. Em di nav xwe de ajotin GroupId rêvename, Projeya URL girêdana projeyê û SCM url girêdanek bi pergala kontrola guhertoya ku proje tê de ye. GroupId Li vir divê forma com.example, com.example.domain, com.example.testsupport be, û dikare di forma girêdana github-a we de jî be: github.com/yourusername -> io.github. navê bikarhêner. Di her rewşê de, hûn ê hewce bikin ku xwediyê vê domainê an profîlê rast bikin. Ger we profîlek github diyar kir, dê ji we were xwestin ku hûn depoyek giştî ya bi navê xwestinê biafirînin.

Demek piştî pejirandinê, GroupId-ya we dê were afirandin û em dikarin derbasî qonaxa din bibin, veavakirina Gradle.

Veavakirina Gradle

Di dema nivîsandinê de, min pêvekên Gradle nedît ku dikarin di weşandina hunerê de bibin alîkar. ev yekane pêveka ku min dît, lêbelê, nivîskar red kir ku bêtir wê piştgirî bike. Ji ber vê yekê, min biryar da ku ez her tiştî bi xwe bikim, ji ber ku kirina vê yekê ne pir dijwar e.

Yekem tiştê ku meriv pê fêhm dike hewcedariyên Sonatype yên ji bo weşanê ye. Ew li jêr in:

  • Hebûna kodên çavkanî û JavaDoc, ango. divê beşdar bibin -sources.jar и-javadoc.jar pelan. Wekî ku di belgeyê de tê gotin, heke ne gengaz be ku kodên çavkaniyê an belgeyan peyda bikin, hûn dikarin dummyek çêbikin. -sources.jar an -javadoc.jar bi README-ya hêsan a hundurîn ku ceribandinê derbas bike.
  • Divê hemî pelan bi wan re bêne îmze kirin GPG/PGPû .asc divê ji bo her dosyayê dosyaya ku îmze tê de hebe.
  • berdestbûnî pom dosî
  • Nirxên rast groupId, artifactId и version. Versiyon dikare rêzek keyfî be û nikare pê biqede -SNAPSHOT
  • Hebûna pêwîst name, description и url
  • Hebûna agahdariya li ser lîsans, pêşdebiran û pergala kontrolkirina guhertoyê

Ev qaîdeyên bingehîn in ku divê di dema weşanê de bêne şopandin. Agahdariya tevahî heye vir.

Em van daxwazan di nav xwe de bi cih tînin build.gradle dosî. Pêşîn, bila em hemî agahdariya pêwîst di derbarê pêşdebiran, lîsans, pergala kontrolkirina guhertoyê de zêde bikin, û her weha url, nav û danasîna projeyê destnîşan bikin. Ka em ji bo vê rêbazek hêsan binivîsin:

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

Piştre, hûn hewce ne ku diyar bikin ku di dema civînê de hatî çêkirin -sources.jar и-javadoc.jar pelan. Ji bo vê beşê java divê hûn tiştên jêrîn lê zêde bikin:

java {
    withJavadocJar()
    withSourcesJar()
}

Ka em biçin ser hewcedariya paşîn, danîna îmzeyek GPG/PGP. Ji bo vê yekê, pêvekê ve girêdin signing:

plugins {
    id 'signing'
}

Û beşek lê zêde bike:

signing {
    sign publishing.publications
}

Di dawiyê de, em beşek lê zêde bikin 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
            }
        }
    }
}

Ev e sonatypeUsername и sonatypePassword guhêrbarên têketin û şîfreya ku di dema qeydkirinê de hatine çêkirin hene sonatype.org.

Bi vî awayî dawî build.gradle dê wiha xuya bike:

Full build.gradle code

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

Ez dixwazim bibînim ku em guhertoyê ji guhêrbara jîngehê digirin: System.getenv('RELEASE_VERSION'). Em ê wê di dema civînê de eşkere bikin û ji navê tagê bigirin.

nifşê mifteya PGP

Yek ji hewcedariyên Sonatype ev e ku hemî pel bi mifteyek GPG/PGP bêne îmze kirin. Ji bo vê em diçin vir û ji bo pergala xebitandina xwe amûra GnuPG dakêşin.

  • Em cotek sereke çêdikin: gpg --gen-key, navek bikarhêner, e-name, û şîfreyek jî destnîşan bikin.
  • Em dizanin id mifteya me bi fermanê: gpg --list-secret-keys --keyid-format short. Nasname dê piştî şiklê were diyar kirin, mînakî: rsa2048/9B695056
  • Weşandina mifteya giştî ya serverê https://keys.openpgp.org ferman: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Em mifteya veşartî derdixînin cîhek keyfî, em ê di pêşerojê de jê re hewce bikin: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Sazkirina Çalakiyên Github

Ka em derbasî qonaxa dawîn bibin, bi karanîna Github Actions çêkirinê saz bikin û bixweber çap bikin.
Çalakiyên Github taybetmendiyek e ku destûrê dide te ku hûn bi pêkanîna çerxek CI / CD-ya tam, geroka xebatê otomatîk bikin. Çêkirin, ceribandin û bicihkirin dikare ji hêla bûyerên cihêreng ve were rêve kirin: kodê xistina kodê, çêkirina berdanê, an pirsgirêk. Vê fonksiyonê ji bo depoyên gelemperî belaş e.

Di vê beşê de, ez ê nîşanî we bidim ka meriv çawa koda çêkirinê û pelixandinê saz dike û di dema berdanê de li depoya Sonatype bicîh dike, û hem jî razan saz dike.

Me sirên danîn

Ji bo civandin û bicîhkirina otomatîkî, em hewceyê çend nirxên veşartî ne, wek id-ya mifteyê, şîfreya ku me dema çêkirina mifteyê têxe, bişkoka PGP bixwe, û têketin / şîfreya Sonatype. Hûn dikarin di mîhengên depoyê de wan di beşa taybetî de bicîh bikin:

Bikaranîna Çalakiyên Gradle û Github ji bo Weşandina Projeya Java li Depoya Navendî ya Sonatype Maven

Em guhêrbarên jêrîn destnîşan dikin:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - têketin / şîfreya ku me dema ku bi Sonatype re qeyd kir
  • SIGNING_KEYID/SIGNING_PASSWORD - Nasnameya mifteya PGP û şîfreya di dema hilberînê de hate danîn.

Ez dixwazim bi hûrgulî li ser guhêrbara GPG_KEY_CONTENTS rawestim. Rastî ev e ku ji bo weşanê em hewceyê mifteyek PGP ya taybet e. Ji bo ku ez wê di veşartan de biweşînim, min bikar anî fêrbûnê û bi ser de jî gelek çalakî kirin.

  • Ka em mifteya xwe bi gpg şîfre bikin: gpg --symmetric --cipher-algo AES256 9B695056.gpgbi ketina şîfreyekê. Divê ew di guhêrbarekê de were danîn: SECRET_PASSPHRASE
  • Ka em bi karanîna base64 mifteya şîfrekirî ya wergirtî wergerînin formek nivîsê: base64 9B695056.gpg.gpg > 9B695056.txt. Naverok dê di guherbarê de were danîn: GPG_KEY_CONTENTS.

Dema ku kodê dişoxilînin û PR-ê diafirînin sazûman ava bikin

Pêşî hûn hewce ne ku peldankek di koka projeya xwe de biafirînin: .github/workflows.

Di wê de, pelê nîşan bikin, mînakî, gradle-ci-build.yml bi naveroka jêrîn:

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

Dema ku berbi şaxan vekêşin dê ev xebata xebatê were darve kirin master, dev и testing, di heman demê de dema ku daxwazên kişandinê diafirînin.

Di beşa kar de gavên ku li ser bûyerên diyarkirî têne darve kirin diyar dike. Di vê rewşê de, em ê li ser guhertoya herî dawî ya ubuntu ava bikin, Java 8 bikar bînin, û ji bo Gradle jî pêvekê bikar bînin. eskatos/gradle-command-action@v1ku, bi karanîna guhertoya herî dawî ya çêker, dê emrên ku tê de hatine destnîşan kirin bimeşîne arguments. Variables secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD ev razên ku me berê jê pirsî ne.

Encamên çêkirinê dê di tabloya Çalakiyan de bêne xuyang kirin:

Bikaranîna Çalakiyên Gradle û Github ji bo Weşandina Projeya Java li Depoya Navendî ya Sonatype Maven

Dema ku serbestberdanek nû tê berdan bixweber bi cîh bikin

Werin em ji bo otodeployê pelek xebata cûda biafirînin 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}}

Pelê hema hema wekî ya berê ye, ji bilî bûyera ku ew ê tê de were derxistin. Di vê rewşê de, ev bûyera afirandina tagek bi navek ku bi v re dest pê dike.

Berî bicîhkirinê, pêdivî ye ku em mifteya PGP-ê ji nehêniyan derxînin û wê di koka projeyê de bi cih bikin, û hem jî wê deşîfre bikin. Dûv re, pêdivî ye ku em guhêrbarek hawîrdora taybetî saz bikin RELEASE_VERSION ku em behs dikin gradle.build dosî. Ev hemî di beşê de têne kirin Prepare to publish. Em mifteya xwe ji guhêrbara GPG_KEY_CONTENTS distînin, wê werdigerînin pelek gpg, dûv re bi danîna pelê wê deşîfre dikin. secret.gpg.

Piştre, em vedigerin guhêrbarek taybetî GITHUB_REF, ya ku em dikarin guhertoya ku me dema çêkirina tagê danîbûn jê bistînin. Ev guherbar di vê rewşê de têkildar e. refs/tags/v0.0.2 ku em jê 11 tîpên pêşîn qut dikin da ku guhertoyek taybetî bistînin. Dûv re, em ji bo weşanê fermanên standard Gradle bikar tînin: test publish

Kontrolkirina encamên bicîhkirinê di depoya Sonatype de

Piştî ku berdan hate afirandin, divê xebata ku di beşa berê de hatî diyar kirin dest pê bike. Ji bo vê yekê, serbestberdanek çêbikin:

Bikaranîna Çalakiyên Gradle û Github ji bo Weşandina Projeya Java li Depoya Navendî ya Sonatype Maven

divê navê tagê bi v dest pê bike. Ger, piştî tikandina Weşandina Weşandinê, gera xebatê bi serfirazî qediya, em dikarin biçin Sonatype Nexus ji bo piştrast bikin:

Bikaranîna Çalakiyên Gradle û Github ji bo Weşandina Projeya Java li Depoya Navendî ya Sonatype Maven

Artifact di depoya Staging de xuya bû. Ew tavilê di statûya Vekirî de xuya dibe, wê hingê pêdivî ye ku ew bi tikandina bişkoja guncan bi destan veguhezîne rewşa Girtin. Piştî ku tê kontrol kirin ku hemî hewcedarî têne bicîh kirin, artifact diçe rewşa Girtîbûnê û êdî ji bo guheztinê tune. Di vê formê de, ew ê di MavenCentral de biqede. Ger her tişt baş e, hûn dikarin bişkojkê bikirtînin Berdan, û huner dê di depoya Sonatype de biqede.

Ji bo ku huner têkeve MavenCentral, hûn hewce ne ku wê di peywira ku me di destpêkê de afirandiye de bipirsin. Pêdivî ye ku hûn tenê carekê vê yekê bikin, ji ber vê yekê em yekem car çap dikin. Di demên paşîn de, ev ne hewce ye, her tişt dê bixweber were hevdem kirin. Wan ji min re zû hevdemkirinê vekir, lê nêzîkê 5 rojan girt ku huner li MavenCentral peyda bibe.

Ew hemî ye, me hunera xwe li MavenCentral weşand.

Girêdanên bikarhêner

  • Nêzbûn gotara, tenê bi rêya maven weşandin
  • Standing depo Sonatype
  • Jira Sonatype ku tê de peywirê diafirîne
  • Nimûne: depoya ku ew hemî sazkirî ye

Source: www.habr.com