Nganggo Gradle sareng Github Actions pikeun nyebarkeun Proyék Java ka Sonatype Maven Central Repository

Dina artikel ieu, abdi hoyong nyandak katingal ngadeukeutan dina prosés medarkeun hiji artefak Java ti scratch ngaliwatan Github Aksi ka Sonatype Maven Central Repository ngagunakeun pembina Gradle.

Kuring mutuskeun nulis artikel ieu alatan kurangna tutorial normal di hiji tempat. Sadaya inpormasi kedah dikumpulkeun sapotong-sapotong tina sababaraha sumber, komo deui, henteu sadayana seger. Anu paduli, wilujeng sumping handapeun ucing.

Nyiptakeun gudang di Sonatype

Hambalan munggaran nyaéta nyieun gudang di Sonatype Maven Tengah. Pikeun ieu urang balik di dieu, ngadaptar sarta nyieun tugas anyar, nanyakeun kami nyieun gudang. Urang ngajalankeun di urang GroupId proyék, URL proyék link proyék jeung URL SCM link ka sistem kontrol versi nu lokasina proyék. GroupId Ieu kedah janten bentuk com.example, com.example.domain, com.example.testsupport, sareng tiasa ogé dina bentuk tautan ka github anjeun: github.com/yurusername -> io.github.yourusername. Dina naon waé, anjeun kedah pariksa kapamilikan domain atanapi profil ieu. Upami anjeun netepkeun profil github, anjeun bakal dipenta pikeun nyiptakeun gudang umum kalayan nami anu dipikahoyong.

Sababaraha waktu sanggeus konfirmasi, GroupId anjeun bakal dijieun tur urang bisa ngaléngkah ka lengkah saterusna, konfigurasi Gradle.

Ngonpigurasikeun Gradle

Dina waktos nyerat, kuring henteu mendakan plugin Gradle anu tiasa ngabantosan nyebarkeun artefak. ieu hijina plugin nu kuring kapanggih, kumaha oge, pangarang nampik salajengna ngarojong eta. Ku alatan éta, kuring mutuskeun pikeun ngalakukeun sagalana sorangan, sabab teu teuing hésé ngalakukeun ieu.

Hal kahiji anu kedah terang nyaéta syarat Sonatype pikeun nyebarkeun. Aranjeunna di handap ieu:

  • Kasadiaan kode sumber sareng JavaDoc, nyaéta. kudu hadir -sources.jar и-javadoc.jar file. Sakumaha anu dinyatakeun dina dokuméntasi, upami teu mungkin nyayogikeun kode sumber atanapi dokuméntasi, anjeun tiasa ngadamel dummy. -sources.jar atawa -javadoc.jar kalawan README basajan jero pikeun lulus ujian.
  • Sadaya file kedah ditandatanganan GPG/PGPjeung .asc file nu ngandung signature kudu kaasup pikeun tiap file.
  • kasadiaan pom file
  • Niléy anu leres groupId, artifactId и version. Versina tiasa janten senar sawenang sareng teu tiasa ditungtungan -SNAPSHOT
  • Ayana diperlukeun name, description и url
  • Ayana inpormasi ngeunaan lisénsi, pamekar sareng sistem kontrol versi

Ieu mangrupikeun aturan dasar anu kedah dituturkeun nalika nyebarkeun. Inpormasi lengkep sayogi di dieu.

Urang ngalaksanakeun sarat ieu dina build.gradle berkas. Mimiti, hayu urang tambahkeun sadaya inpormasi anu dipikabutuh ngeunaan pamekar, lisénsi, sistem kontrol versi, sareng ogé nyetél url, nami sareng pedaran proyék. Hayu urang nulis metoda basajan pikeun ieu:

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

Salajengna, Anjeun kudu nangtukeun yén salila assembly dihasilkeun -sources.jar и-javadoc.jar file. Pikeun bagian ieu java anjeun kedah nambihan ieu:

java {
    withJavadocJar()
    withSourcesJar()
}

Hayu urang ngaléngkah ka sarat anu terakhir, nyetél tanda tangan GPG/PGP. Jang ngalampahkeun ieu, sambungkeun plugin signing:

plugins {
    id 'signing'
}

Sareng tambahkeun bagian:

signing {
    sign publishing.publications
}

Tungtungna, hayu urang tambahkeun bagian 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
            }
        }
    }
}

Ieu téh sonatypeUsername и sonatypePassword variabel ngandung login sarta sandi dijieun salila pendaptaran on sonatype.org.

Kituna final build.gradle bakal kasampak kawas kieu:

Kode build.gradle pinuh

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

Abdi hoyong dicatet yén urang nampi versi tina variabel lingkungan: System.getenv('RELEASE_VERSION'). Urang bakal ngalaan eta salila assembly sarta nyokot tina ngaran tag.

Generasi konci PGP

Salah sahiji sarat Sonatype nyaéta yén sadaya file ditandatanganan ku konci GPG/PGP. Pikeun ieu urang balik di dieu tur ngundeur utilitas GnuPG pikeun sistem operasi Anjeun.

  • Urang ngahasilkeun pasangan konci: gpg --gen-key, asupkeun ngaran pamaké, e-mail, sarta ogé nyetel kecap akses.
  • Urang manggihan id konci kami kalayan paréntah: gpg --list-secret-keys --keyid-format short. Id bakal dieusian saatos garis miring, contona: rsa2048/9B695056
  • Nyebarkeun konci umum ka server https://keys.openpgp.org paréntah: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Urang ngekspor konci rusiah ka tempat anu sawenang-wenang, urang bakal butuh ka hareup: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Nyetél Aksi Github

Hayu urang ngaléngkah ka tahap ahir, nyetél ngawangun sareng nyebarkeun otomatis nganggo Github Actions.
Github Actions mangrupikeun fitur anu ngamungkinkeun anjeun pikeun ngajadikeun otomatis alur kerja ku ngalaksanakeun siklus CI / CD lengkep. Ngawangun, nguji, sareng nyebarkeun tiasa dipicu ku sababaraha kajadian: push kode, nyiptakeun sékrési, atanapi masalah. Fungsionalitas ieu leres pisan gratis pikeun repositori umum.

Dina bagian ieu, kuring bakal nunjukkeun anjeun kumaha nyetél ngawangun sareng nyorong kode sareng nyebarkeun kana gudang Sonatype nalika dileupaskeun, ogé nyetél rusiah.

Urang nyetel rusiah

Pikeun assembly otomatis tur deployment, urang peryogi sababaraha nilai rusiah, kayaning id konci, kecap akses nu urang diasupkeun nalika generating konci, konci PGP sorangan, sarta Sonatype login / sandi. Anjeun tiasa nyetél éta dina bagian khusus dina setélan gudang:

Nganggo Gradle sareng Github Actions pikeun nyebarkeun Proyék Java ka Sonatype Maven Central Repository

Urang nangtukeun variabel handap:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - login / sandi anu kami lebetkeun nalika ngadaptar sareng Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — id konci PGP sareng kecap akses disetel salami generasi.

Abdi hoyong cicing dina variabel GPG_KEY_CONTENTS langkung jéntré. Kanyataanna nyaéta pikeun publikasi urang peryogi konci PGP swasta. Dina raraga posting eta dina Rahasia, kuring dipaké pitunjuk sarta Sajaba dijieun sababaraha lampah.

  • Hayu urang énkripsi konci kami nganggo gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgku cara nuliskeun kecap akses. Eta kudu disimpen dina variabel: SECRET_PASSPHRASE
  • Hayu urang tarjamahkeun konci énkripsi anu ditampi kana bentuk téks nganggo base64: base64 9B695056.gpg.gpg > 9B695056.txt. Eusi bakal disimpen dina variabel: GPG_KEY_CONTENTS.

Ngawangun setelan nalika ngadorong kode sareng nyiptakeun PR

Mimiti anjeun kedah nyiptakeun polder dina akar proyék anjeun: .github/workflows.

Di jerona, cirian file, contona, gradle-ci-build.yml kalawan eusi handap:

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

Alur kerja ieu bakal dieksekusi nalika ngadorong ka dahan master, dev и testing, ogé nalika nyieun requests tarikan.

Bagian padamelan netepkeun léngkah-léngkah anu bakal dilaksanakeun dina acara anu ditangtukeun. Dina hal ieu, urang bakal ngawangun dina versi panganyarna tina ubuntu, ngagunakeun Java 8, sarta ogé ngagunakeun plugin pikeun Gradle. eskatos/gradle-command-action@v1nu, ngagunakeun versi panganyarna tina pembina, bakal ngajalankeun Paréntah dieusian dina arguments. Variabel secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD ieu Rahasia kami naroskeun tadi.

Hasil ngawangun bakal ditingali dina tab Aksi:

Nganggo Gradle sareng Github Actions pikeun nyebarkeun Proyék Java ka Sonatype Maven Central Repository

Nyebarkeun otomatis nalika pelepasan énggal dileupaskeun

Hayu urang nyieun file workflow misah pikeun 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}}

Berkasna ampir sami sareng anu saacanna, iwal ti acara dimana éta bakal dipicu. Dina hal ieu, ieu acara nyieun tag kalawan ngaran dimimitian ku v.

Sateuacan nyebarkeun, urang kedah nimba konci PGP tina Rahasia sareng nempatkeun kana akar proyék, ogé ngadekrip éta. Salajengna, urang kedah nyetél variabel lingkungan khusus RELEASE_VERSION nu urang rujuk gradle.build berkas. Sadaya ieu dilakukeun dina bagian Prepare to publish. Kami kéngingkeun konci tina variabel GPG_KEY_CONTENTS, tarjamahkeun kana file gpg, teras ngadekrip ku cara nempatkeun kana file. secret.gpg.

Salajengna, urang balikkeun ka variabel husus GITHUB_REF, ti mana urang tiasa nampi versi anu urang setel nalika nyiptakeun tag. Variabel ieu relevan dina hal ieu. refs/tags/v0.0.2 ti mana urang neukteuk off kahiji 11 karakter pikeun meunangkeun versi husus. Salajengna, kami nganggo paréntah Gradle standar pikeun nyebarkeun: test publish

Mariksa hasil panyebaran dina gudang Sonatype

Saatos sékrési didamel, alur kerja anu dijelaskeun dina bagian sateuacana kedah ngamimitian. Jang ngalampahkeun ieu, jieun pelepasan:

Nganggo Gradle sareng Github Actions pikeun nyebarkeun Proyék Java ka Sonatype Maven Central Repository

ngaran tag kudu dimimitian ku v. Upami, saatos ngaklik Publikasikeun pelepasan, alur kerja parantos réngsé, urang tiasa angkat ka Sonatype Nexus pikeun mastikeun:

Nganggo Gradle sareng Github Actions pikeun nyebarkeun Proyék Java ka Sonatype Maven Central Repository

Artéfak éta muncul dina gudang Pementasan. Langsung nembongan dina status Buka, teras kedah ditransfer sacara manual ka status Tutup ku mencét tombol anu pas. Saatos mariksa yen sakabeh sarat anu patepung, artefak nu mana kana status Tutup tur euweuh sadia pikeun modifikasi. Dina formulir ieu, éta bakal mungkas nepi di MavenCentral. Upami sadayana leres, anjeun tiasa pencét tombol ngabebaskeun, sarta artefak bakal mungkas nepi di Repository Sonatype.

Pikeun artefak asup ka MavenCentral, anjeun kedah naroskeun éta dina tugas anu urang damel di awal. Anjeun ngan ukur kedah ngalakukeun ieu sakali, janten kami nyebarkeun heula. Dina waktos salajengna, ieu henteu diperyogikeun, sadayana bakal disingkronkeun sacara otomatis. Aranjeunna ngahurungkeun sinkronisasi pikeun kuring gancang, tapi nyandak ngeunaan 5 poé pikeun artefak sadia di MavenCentral.

Éta sadayana, kami parantos nyebarkeun artefak kami di MavenCentral.

link mangpaat

  • Sarupa artikel, ngan nyebarkeun via maven
  • Pementasan gudang Sonatype
  • Jira Sonatype nu nyieun tugas
  • conto gudang dimana eta sadayana diatur

sumber: www.habr.com