Kasvame Gradle ja Github Actions abil Java projekti avaldamiseks Sonatype Maven Central Repository'sse

Selles artiklis tahan ma ĂŒksikasjalikult sĂ”nastada Java artefakti nullist avaldamise protsessi GitHub Actions kaudu Sonatype Maven Central Repository's, kasutades Gradle'i kogujat.

Selle artikli kirjutamine oli vajalik, kuna puudusid korralikud Ă”petused ĂŒhes kohas. KĂ”ik teave pidi olema kogutud erinevatest allikatest, mis ei olnud ka kuigi vĂ€rsked. Kui see teema sind huvitab, oled teretulnud lugema edasi.

Sonatype'i repositooriumi loomine

Esimese sammuna peame looma repositooriumi Sonatype Maven Centralis. Selleks suundume siia, registreerime end ja loome uue ĂŒlesande, paludes luua meile repositoorium. Sisestame oma GroupId for the project, Projekti URL projekti lingi ja SCM url versioonihaldussĂŒsteemi lingi, kus projekt asub. GroupId see peaks olema kujul com.example, com.example.domain, com.example.testsupport, kuid vĂ”ib olla ka lingina sinu GitHubi kontole: github.com/yourusername -> io.github.yourusername. Igal juhul pead sa kinnitama selle domeeni vĂ”i profiili omamist. Kui sa mĂ€rkisid GitHubi profiili, palutakse sul luua avalik repositoorium soovitud nimega.

MÔne aja pÀrast, kui kinnitamine on tehtud, luuakse sinu GroupId ja saame liikuda jÀrgmise sammu juurde, Gradle'i konfigureerimise juurde.

Konfigureerime Gradle'i

Artikli kirjutamise hetkel ei leidnud ma Gradle'i pluginaid, mis vĂ”iksid aita artefakti avaldamisel. See on ainult ĂŒhe plugina, mille leidsin, kuid autor loobus selle edasise toe andmisest. SeetĂ”ttu otsustasin teha kĂ”ik ise, Ă”nneks pole see liiga keeruline.

Esimene asi, mis tuleb vÀlja selgitada, on Sonatype'i nÔuded avaldamiseks. Need on jÀrgmised:

  • Allika- ja JavaDoc-failide olemasolu, st need peavad olema olemas -sources.jar ja-javadoc.jar failid. Nagu dokumentatsioonis öeldakse, kui allikaid vĂ”i dokumentatsiooni pole vĂ”imalik esitada, vĂ”ib teha tĂŒhja failiga, milles on lihtne README, et lĂ€bida kontroll. -sources.jar vĂ”i -javadoc.jar KĂ”ik failid peavad olema allkirjastatud kasutades
  • GPG/PGP .asc, ja fail, mis sisaldab allkirja, peab olema kaasatud iga faili jaoks. pom
  • Standardsete moodulite komplekti olemasolu Korrektsed vÀÀrtused failist
  • groupId artifactId, . Versioon vĂ”ib olla suvaline string ja ei tohi lĂ”ppeda ja version-SNAPSHOT Peab olema olemas
  • Teave litsentsi, arendajate ja versioonihaldussĂŒsteemi kohta nimi, kirjeldus ja url
  • Need on peamised reeglid, mida tuleb jĂ€rgida avaldamisel. TĂ€ielik teave on saadaval

Rakendame need nÔuded siin.

jĂ€rgmiseks build.gradle failis. Esiteks lisame kogu vajaliku teabe arendajate, litsentsi, versioonihalduse sĂŒsteemi kohta, samuti mÀÀrame projekti URL-i, nime ja kirjelduse. Selleks kirjutame lihtsa meetodi:

def customizePom(pom) {
    pom.withXml {
        def root = asNode()

        root.dependencies.removeAll { dep ->
            dep.scope == "test"
        }

        root.children().last() + {
            resolveStrategy = DELEGATE_FIRST

            description 'MÔned kirjeldused artefaktist'
            name 'Artefakti nimi'
            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 '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 'ArendajaNimi'
                    email 'email@dev.ru'
                }
            }
        }
    }
}

SeejÀrel tuleb mÀÀrata, et ehitamisel genereeritaks -sources.jar ja-javadoc.jar failid. Selleks sektsiooni java tuleb lisada jÀrgmine:

java {
    withJavadocJar()
    withSourcesJar()
}

Liigume viimase nĂ”ude juurde, GPG/PGP allkirja seadistamine. Selleks ĂŒhendame plugina signing:

plugins {
    id 'signing'
}

Ja lisame sektsiooni:

signing {
    sign publishing.publications
}

LÔpuks lisame sektsiooni 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
            }
        }
    }
}

Siin sonatypeUsername ja sonatypePassword muutujad, mis sisaldavad sisselogimis- ja parooliteavet, loodud registreerumisel sonatype.org.

Seega, lÔplik build.gradle nÀeb vÀlja jÀrgmiselt:

TĂ€ielik kood 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@dev.ru'
                }
            }
        }
    }
}

Tahan mÀrkida, et versiooni saame keskkonna muutujast: System.getenv('RELEASE_VERSION'). Seadistame selle koostamise ajal ja vÔtame sildist.

PGP vÔtme genereerimine

Üks Sonatype'i nĂ”udeid on, et kĂ”ik failid tuleb allkirjastada GPG/PGP vĂ”tmega. Selleks lĂ€heme siia ja laadime alla GnuPG utiliidi oma operatsioonisĂŒsteemi jaoks.

  • Genereerime vĂ”tmepaari: gpg --gen-key, sisestame kasutajanime, e-posti aadressi ning mÀÀrame parooli.
  • Selgitame vĂ€lja id oma vĂ”tme, kasutades kĂ€sku: gpg --list-secret-keys --keyid-format short. Id on mĂ€rgitud pĂ€rast kaldkriipsu, nĂ€iteks: rsa2048/9B695056
  • Avaldame avaliku vĂ”ti serverisse https://keys.openpgp.org with the command: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Eksportime salajase vĂ”tme suvalisse kohta, seda vajame hiljem: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Seadistame Github Actions

Liigume lÔpetamise etappi, seadistame koostamise ja automaatse avaldamise, kasutades Github Actions.
Github Actions – funktsioon, mis vĂ”imaldab automatiseerida töövoogu, realiseerides tĂ€ieliku CI/CD tsĂŒkli. Kogumine, testimine ja deploy vĂ”ivad olla kĂ€ivitatud erinevate sĂŒndmuste tĂ”ttu: koodi pushimine, vĂ€ljalaske loomine vĂ”i issues. See funktsioon on tĂ€iesti tasuta avalike repo jaoks.

Selles osas nÀitan, kuidas seadistada koodi kogumist ja pushimist ning deploy-d Sonatype repo-s, kui vÀljastatakse uus versioon, samuti salasÔnade seadistamist.

Seadistame saladused

Automaatseks kogumiseks ja deploy-ks vajame rida salajasi vÀÀrtusi, nagu vÔtme ID, parool, mille me sisestasime vÔtme genereerimisel, ise PGP vÔti, samuti kasutajanimi/parool Sonatype jaoks. Need saab seadistada repo seadete eraldi osas:

Kasvame Gradle ja Github Actions abil Java projekti avaldamiseks Sonatype Maven Central Repository'sse

Seadistame jÀrgmised muutujad:

  • SONATYPE_USERNAME/SONATYPE_PASSWORD — kasutajanimi/parool, mille sisestasime Sonatype registreerimisel
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP vĂ”tme ID ja parool, mis mÀÀrati genereerimise ajal.

Muudatavale muutujale GPG_KEY_CONTENTS soovin rohkem tÀhelepanu pöörata. Fakt on see, et avaldamiseks on meil vaja privaatset PGP vÔtit. Selle lisamiseks saladustesse kasutasin juhendile ja tegin lisaks rida toiminguid.

  • KrĂŒpteerime meie vĂ”tme gpg abil: gpg --symmetric --cipher-algo AES256 9B695056.gpg, sisestades parooli. Selle tuleks paigutada muutuja sisse: SECRET_PASSPHRASE
  • TĂ”lgime saadud krĂŒpteeritud vĂ”tme tekstivormingusse base64 abil: base64 9B695056.gpg.gpg > 9B695056.txt. Sisus paigutame muutuja sisse: GPG_KEY_CONTENTS.

Kogumise seadistamine koodi pushimise ja PR loomise ajal

Esmalt tuleb luua kaust teie projekti juures: .github/workflows.

Sinna paigutage fail, nÀiteks gradle-ci-build.yml jÀrjgnevate sisuga:

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

See tööprotsess kÀivitub, kui pushitakse harudesse master, dev ja testimine, samuti PR loomise ajal.

Jobs sektsioonis on vĂ€lja toodud sammud, mis peavad toimuma nimetatud sĂŒndmuste kohaselt. Antud juhul kogume viimasel ubuntu versioonil, kasutame Java 8 ja samuti pluginat Gradle jaoks eskatos/gradle-command-action@v1, mis kasutades viimast versiooni kogujast kĂ€ivitab kĂ€sud, mis on mÀÀratud — valikulised argumendid. Allpool vaatame lĂ€hemalt.. Muutujad secrets.SONATYPE_USERNAME ja secrets.SONATYPE_PASSWORD need on salajane, mille me varem mÀÀrasime.

Kogumise tulemused kajastuvad vahekaardil Actions:

Kasvame Gradle ja Github Actions abil Java projekti avaldamiseks Sonatype Maven Central Repository'sse

Autodeploy uue vÀljaande avaldamisel

Autodeploy jaoks loome eraldi töövoo faili 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}}

Fail on praktiliselt identne eelneva failiga, vĂ€lja arvatud sĂŒndmus, mil see aktiveerub. Antud juhul on see sĂŒndmus sildi loomine nimega, mis algab tĂ€hega v.

Enne deployimist peame PGP vĂ”tme saladustest vĂ€lja tĂ”mbama ja paigutama selle projekti juurka, samuti dekrĂŒpteerima selle. Edasi peame seadma spetsiaalse keskkonnamuutuja RELEASE_VERSION , millele viitame gradle.build failis. KĂ”ik see on tehtud osas Prepare to publish. Saame meie vĂ”tme muutuja GPG_KEY_CONTENTS kaudu, konverteerime selle gpg failiks, seejĂ€rel dekrĂŒpteerime, paigutades faili secret.gpg.

SeejÀrel viitame spetsiaalsele muutujale GITHUB_REF, millest saame vÀlja vÔtta versiooni, mille oleme mÀÀranud sildi loomisel. Antud muutuja vÀÀrtus on refs/tags/v0.0.2 , millest kÀrpime esimesed 11 tÀhte, et saada just versioon. Edasi kasutame standardseid Gradle kÀske avaldamiseks: test publish

Kontrollige avaldamise tulemusi Sonatype'i hoidlas

PÀrast vÀljaande loomist peaks algama töövoog, mis on kirjeldatud eelnevas osas. Selleks loome vÀljaande:

Kasvame Gradle ja Github Actions abil Java projekti avaldamiseks Sonatype Maven Central Repository'sse

, kusjuures sildi nimi peab algama tÀhega v. Kui pÀrast Publish release'i klikkimist töövoog töötab, saame minna Sonatype Nexus , et veenduda selles:

Kasvame Gradle ja Github Actions abil Java projekti avaldamiseks Sonatype Maven Central Repository'sse

Artefakt ilmus Staging hoidlas. Alguses on see olekus Open, mille jÀrel tuleb see kÀsitsi sulgeda, vajutades vastavale nupule. PÀrast kÔigi nÔuete tÀitmise kontrollimist liigub artefakt olekusse Close ja ei ole enam muudetav. Sellisel kujul jÔuab see MavenCentralisse. Kui kÔik on korras, saab vajutada nuppu Release, sellega satub artefakt Sonatype hoidlasse.

Kuna artefakt jĂ”uaks MavenCentralisse, tuleb seda paluda ĂŒlesandes, mille me alguses lĂ”ime. Seda tuleb teha ainult ĂŒks kord, kuna avaldame esmakordselt. Edaspidi ei ole seda vajalik, kĂ”ik sĂŒnkroniseeritakse automaatselt. Minu sĂŒnkroniseerimine lĂŒlitati kiiresti sisse, kuid et artefakt muutuks saadavaks MavenCentralis, kulus umbes 5 pĂ€eva.

Sellega ongi kÔik, oleme avaldanud oma artefakti MavenCentralis.

Kasulikud lingid

  • Sarnane artikkel, ainult avaldamine lĂ€bi maven
  • Staging hoidla Sonatype
  • Jira Sonatype, kus tuleb ĂŒlesanne luua
  • NĂ€ide hoidlas, kus see kĂ”ik on seadistatud

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster