Nggunakake Tindakan Gradle lan Github kanggo Nerbitake Proyek Jawa menyang Sonatype Maven Central Repository

Ing artikel iki, aku pengin ndeleng rinci babagan proses nerbitake artefak Jawa saka awal liwat Github Actions menyang Sonatype Maven Central Repository nggunakake pembangun Gradle.

Aku mutusaké kanggo nulis artikel iki amarga lack saka tutorial normal ing sak panggonan. Kabeh informasi kudu dikumpulake kanthi potongan saka macem-macem sumber, luwih-luwih, ora sakabehe seger. Sing peduli, welcome under cat.

Nggawe repositori ing Sonatype

Langkah pisanan yaiku nggawe repositori ing Sonatype Maven Central. Kanggo iki kita lunga kene, ndhaftar lan nggawe tugas anyar, takon kita nggawe repositori. We drive ing kita GroupId proyek, URL proyek link project lan URL SCM link menyang sistem kontrol versi kang project dumunung. GroupId ing kene kudu dadi wangun com.example, com.example.domain, com.example.testsupport, lan uga bisa dadi link menyang github sampeyan: github.com/yurusername -> io.github.yourusername. Ing kasus apa wae, sampeyan kudu verifikasi kepemilikan domain utawa profil iki. Yen sampeyan nemtokake profil github, sampeyan bakal dijaluk nggawe repositori umum kanthi jeneng sing dikarepake.

Sawetara wektu sawise konfirmasi, GroupId sampeyan bakal digawe lan kita bisa nerusake menyang langkah sabanjure, konfigurasi Gradle.

Konfigurasi Gradle

Nalika nulis, aku ora nemokake plugin Gradle sing bisa mbantu nerbitake artefak kasebut. iki mung plugin sing aku ketemu, Nanging, penulis ora gelem ndhukung luwih. Mulane, aku mutusake kanggo nindakake kabeh dhewe, amarga ora angel banget kanggo nindakake iki.

Wangsulan: Bab ingkang pisanan kanggo tokoh metu iku syarat Sonatype kanggo nerbitake. Padha ing ngisor iki:

  • Kasedhiyan kode sumber lan JavaDoc, yaiku. kudu melu -sources.jar и-javadoc.jar berkas. Kaya sing kasebut ing dokumentasi, yen ora bisa menehi kode sumber utawa dokumentasi, sampeyan bisa nggawe goblok. -sources.jar utawa -javadoc.jar karo README prasaja nang kanggo pass test.
  • Kabeh file kudu mlebu karo GPG/PGPlan .asc file sing ngemot teken kudu kalebu kanggo saben file.
  • kasedhiyan pom ngajukake
  • Nilai sing bener groupId, artifactId и version. Versi kasebut bisa dadi senar sewenang-wenang lan ora bisa dipungkasi -SNAPSHOT
  • Presensi dibutuhake name, description и url
  • Anane informasi babagan lisensi, pangembang lan sistem kontrol versi

Iki minangka aturan dhasar sing kudu ditindakake nalika nerbitake. Informasi lengkap kasedhiya kene.

We ngleksanakake syarat kasebut ing build.gradle berkas. Pisanan, ayo nambahake kabeh informasi sing dibutuhake babagan pangembang, lisensi, sistem kontrol versi, lan uga nyetel url, jeneng lan deskripsi proyek kasebut. Ayo nulis cara prasaja kanggo iki:

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

Sabanjure, sampeyan kudu nemtokake sing sak Déwan kui -sources.jar и-javadoc.jar berkas. Kanggo bagean iki java sampeyan kudu nambah ing ngisor iki:

java {
    withJavadocJar()
    withSourcesJar()
}

Ayo pindhah menyang syarat pungkasan, nyetel tandha GPG/PGP. Kanggo nindakake iki, sambungake plugin kasebut signing:

plugins {
    id 'signing'
}

Lan nambah bagean:

signing {
    sign publishing.publications
}

Pungkasan, ayo nambah bagean 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
            }
        }
    }
}

iku sonatypeUsername и sonatypePassword variabel sing ngemot login lan sandhi digawe nalika registrasi ing sonatype.org.

Mangkono final build.gradle bakal katon kaya iki:

Kode build.gradle lengkap

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

Aku pengin dicathet yen kita entuk versi saka variabel lingkungan: System.getenv('RELEASE_VERSION'). Kita bakal mbabarake sajrone perakitan lan njupuk saka jeneng tag.

Generasi kunci PGP

Salah sawijining syarat Sonatype yaiku kabeh file ditandatangani nganggo kunci GPG/PGP. Kanggo iki kita lunga kene lan download sarana GnuPG kanggo sistem operasi sampeyan.

  • Kita nggawe pasangan kunci: gpg --gen-key, ketik jeneng pangguna, e-mail, lan uga nyetel sandhi.
  • Kita ngerteni id kunci kita kanthi printah: gpg --list-secret-keys --keyid-format short. Id bakal ditemtokake sawise garis miring, contone: rsa2048/9B695056
  • Nerbitake kunci publik menyang server https://keys.openpgp.org dhawuh: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Kita ngekspor kunci rahasia menyang papan sing sewenang-wenang, kita bakal mbutuhake ing mangsa ngarep: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Nyetel Tindakan Github

Ayo pindhah menyang tahap pungkasan, nyiyapake mbangun lan nerbitake otomatis nggunakake Tindakan Github.
Tindakan Github minangka fitur sing ngidini sampeyan ngotomatisasi alur kerja kanthi ngetrapake siklus CI / CD lengkap. Mbangun, nguji, lan nyebarake bisa dipicu dening macem-macem acara: push kode, nggawe release, utawa masalah. Fungsi iki pancen gratis kanggo repositori umum.

Ing bagean iki, aku bakal nuduhake sampeyan carane nyiyapake mbangun lan push kode lan nyebarke menyang repositori Sonatype nalika diluncurake, uga nyetel rahasia.

We nyetel rahasia

Kanggo perakitan lan penyebaran otomatis, kita butuh sawetara nilai rahasia, kayata id kunci, sandhi sing diketik nalika nggawe kunci, kunci PGP dhewe, lan login / sandhi Sonatype. Sampeyan bisa nyetel ing bagean khusus ing setelan repositori:

Nggunakake Tindakan Gradle lan Github kanggo Nerbitake Proyek Jawa menyang Sonatype Maven Central Repository

Kita nyetel variabel ing ngisor iki:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - login / sandhi sing kita lebokake nalika ndhaptar nganggo Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD - ID kunci PGP lan tembung sandhi disetel nalika nggawe.

Aku pengin manggon ing variabel GPG_KEY_CONTENTS luwih rinci. Kasunyatane yaiku kanggo publikasi kita butuh kunci PGP pribadi. Kanggo ngirim ing Rahasia, Aku digunakake pandhuan lan tambahan digawe sawetara tumindak.

  • Ayo enkripsi kunci kita nganggo gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgkanthi ngetik sandhi. Sampeyan kudu diselehake ing variabel: SECRET_PASSPHRASE
  • Ayo terjemahake kunci sing dienkripsi menyang formulir teks nggunakake base64: base64 9B695056.gpg.gpg > 9B695056.txt. Isi bakal diselehake ing variabel: GPG_KEY_CONTENTS.

Mbangun persiyapan nalika push kode lan nggawe PR

Pisanan sampeyan kudu nggawe folder ing ROOT proyek sampeyan: .github/workflows.

Ing kono, tandhani file kasebut, contone, gradle-ci-build.yml kanthi isi ing ngisor iki:

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 iki bakal dileksanakake nalika push menyang cabang master, dev и testing, uga nalika nggawe panjalukan narik.

Bagean proyek nemtokake langkah-langkah sing bakal ditindakake ing acara kasebut. Ing kasus iki, kita bakal mbangun versi paling anyar saka ubuntu, nggunakake Java 8, lan uga nggunakake plugin kanggo Gradle. eskatos/gradle-command-action@v1, sing, nggunakake versi paling anyar saka kolektor, bakal mbukak printah kasebut ing arguments. Variabel secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD iki Rahasia kita takon sadurungé.

Asil mbangun bakal dibayangke ing tab Tindakan:

Nggunakake Tindakan Gradle lan Github kanggo Nerbitake Proyek Jawa menyang Sonatype Maven Central Repository

Nyebarake otomatis nalika rilis anyar dirilis

Ayo nggawe file alur kerja sing kapisah kanggo penyebaran otomatis 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}}

Berkas kasebut meh padha karo sing sadurunge, kajaba acara sing bakal dipicu. Ing kasus iki, iki minangka acara nggawe tag kanthi jeneng sing diwiwiti karo v.

Sadurunge panyebaran, kita kudu ngekstrak kunci PGP saka rahasia lan nyelehake ing oyod proyek kasebut, uga dekripsi. Sabanjure, kita kudu nyetel variabel lingkungan khusus RELEASE_VERSION kang kita rujuk gradle.build berkas. Kabeh iki rampung ing bagean Prepare to publish. Kita entuk kunci saka variabel GPG_KEY_CONTENTS, terjemahake menyang file gpg, banjur dekripsi kanthi dilebokake ing file kasebut. secret.gpg.

Sabanjure, kita nguripake menyang variabel khusus GITHUB_REF, saka ngendi kita bisa entuk versi sing disetel nalika nggawe tag. Variabel iki relevan ing kasus iki. refs/tags/v0.0.2 saka kang kita Cut mati pisanan 11 karakter kanggo njaluk versi tartamtu. Sabanjure, kita nggunakake printah Gradle standar kanggo nerbitake: test publish

Priksa asil panyebaran ing repositori Sonatype

Sawise rilis digawe, alur kerja sing diterangake ing bagean sadurunge kudu diwiwiti. Kanggo nindakake iki, nggawe release:

Nggunakake Tindakan Gradle lan Github kanggo Nerbitake Proyek Jawa menyang Sonatype Maven Central Repository

jeneng tag kudu diwiwiti karo v. Yen, sawise ngeklik Terbitake rilis, alur kerja wis rampung, kita bisa pindhah menyang Sonatype Nexus kanggo mesthekake:

Nggunakake Tindakan Gradle lan Github kanggo Nerbitake Proyek Jawa menyang Sonatype Maven Central Repository

Artefak kasebut katon ing gudang Pementasan. Langsung katon ing status Bukak, banjur kudu ditransfer kanthi manual menyang status Tutup kanthi mencet tombol sing cocog. Sawise mriksa yen kabeh syarat wis ketemu, artefak dadi status Close lan ora kasedhiya kanggo modifikasi. Ing wangun iki, iku bakal mungkasi munggah ing MavenCentral. Yen kabeh apik, sampeyan bisa menet tombol kasebut release, lan artefak bakal rampung ing repositori Sonatype.

Supaya artefak kasebut mlebu ing MavenCentral, sampeyan kudu njaluk ing tugas sing digawe ing wiwitan. Sampeyan mung perlu kanggo nindakake iki sapisan, supaya kita nerbitaké pisanan. Ing wektu sabanjure, iki ora dibutuhake, kabeh bakal disinkronake kanthi otomatis. Padha nguripake sinkronisasi kanggo kula cepet, nanging njupuk bab 5 dina kanggo artefak kasedhiya ing MavenCentral.

Iku kabeh, kita wis nerbitaké artefak kita ing MavenCentral.

link migunani

  • Serupa artikel, mung nerbitake liwat maven
  • Staging gudang Sonatype
  • Jira Sonatype kanggo nggawe tugas
  • Conto: gudang ing ngendi kabeh wis disetel

Source: www.habr.com