Ke hoʻohana nei i nā hana Gradle a me Github e hoʻolaha i ka papahana Java i ka Sonatype Maven Central Repository

Ma kēia ʻatikala, makemake wau e nānā pono i ke kaʻina hana o ka hoʻopuka ʻana i kahi artifact Java mai ka ʻohi ʻana ma o Github Actions i ka Sonatype Maven Central Repository me ka hoʻohana ʻana i ka mea hana Gradle.

Ua hoʻoholo wau e kākau i kēia ʻatikala ma muli o ka nele o kahi aʻo maʻamau ma kahi hoʻokahi. Pono e hōʻiliʻili ʻia nā ʻike a pau mai nā kumu like ʻole, ʻaʻole hou loa. ʻO wai ka manaʻo, hoʻokipa ma lalo o ka pōpoki.

Ke hana nei i kahi waihona ma Sonatype

ʻO ka hana mua e hana i kahi waihona ma Sonatype Maven Central. No keia hele makou maanei, hoʻopaʻa inoa a hana i kahi hana hou, e noi ana iā mākou e hana i kahi waihona. Hoʻokele mākou i kā mākou GroupId papahana, Papahana URL loulou papahana a SCM URL he loulou i ka ʻōnaehana mana mana kahi i loaʻa ai ka papahana. GroupId eia ke ʻano com.example, com.example.domain, com.example.testsupport, a hiki ke loaʻa ma ke ʻano o kahi loulou i kāu github: github.com/yourusername -> io.github.yourusername. I kēlā me kēia hihia, pono ʻoe e hōʻoia i ka mea nona kēia kahua a i ʻole ka moʻolelo. Inā ʻoe i kuhikuhi i kahi profile github, e noi ʻia ʻoe e hana i kahi waihona lehulehu me ka inoa i makemake ʻia.

I kekahi manawa ma hope o ka hōʻoia ʻana, e hana ʻia kāu GroupId a hiki iā mākou ke neʻe i ka pae aʻe, ka hoʻonohonoho Gradle.

Ke hoʻonohonoho nei iā Gradle

I ka wā kākau, ʻaʻole i loaʻa iaʻu nā plugins Gradle e hiki ke kōkua i ka hoʻopuka ʻana i ka artifact. keia ʻO ka plugin wale nō i loaʻa iaʻu, akā naʻe, hōʻole ka mea kākau e kākoʻo hou iā ia. No laila, ua hoʻoholo wau e hana i nā mea āpau iaʻu iho, no ka mea ʻaʻole paʻakikī ke hana i kēia.

ʻO ka mea mua e noʻonoʻo ai ʻo ia nā koi o Sonatype no ka paʻi ʻana. ʻO lākou kēia:

  • Loaʻa nā code kumu a me JavaDoc, ʻo ia hoʻi. pono e hele -sources.jar и-javadoc.jar waihona. E like me ka mea i ʻōlelo ʻia ma ka palapala, inā ʻaʻole hiki ke hāʻawi i nā code kumu a i ʻole palapala, hiki iā ʻoe ke hana i kahi dummy. -sources.jar ai ole ia, -javadoc.jar me kahi README maʻalahi i loko e hele i ka hōʻike.
  • Pono e pūlima ʻia nā faila a pau GPG/PGPa .asc pono e hoʻokomo ʻia ka faila me ka pūlima no kēlā me kēia faila.
  • loaʻa nui pom faila
  • Nā waiwai kūpono groupId, artifactId и version. Hiki ke hoʻololi i ka mana a ʻaʻole hiki ke hoʻopau ʻia -SNAPSHOT
  • Pono ke alo name, description и url
  • ʻO ka loaʻa ʻana o ka ʻike e pili ana i ka laikini, nā mea hoʻomohala a me ka ʻōnaehana mana mana

ʻO kēia nā lula kumu e pono e hahai i ka wā e paʻi ana. Loaʻa ka ʻike piha maanei.

Hoʻokō mākou i kēia mau koi ma build.gradle waihona. ʻO ka mea mua, e hoʻohui i nā ʻike pono āpau e pili ana i nā mea hoʻomohala, nā laikini, ka ʻōnaehana mana mana, a hoʻonohonoho pū i ka url, inoa a me ka wehewehe ʻana o ka papahana. E kākau mākou i kahi ala maʻalahi no kēia:

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

A laila, pono ʻoe e wehewehe i ka wā o ka hui i hana ʻia -sources.jar и-javadoc.jar waihona. No keia pauku java pono ʻoe e hoʻohui i kēia mau mea:

java {
    withJavadocJar()
    withSourcesJar()
}

E neʻe kāua i ke koi hope, e hoʻonohonoho i kahi pūlima GPG/PGP. No ka hana ʻana i kēia, hoʻohui i ka plugin signing:

plugins {
    id 'signing'
}

A hoʻohui i kahi ʻāpana:

signing {
    sign publishing.publications
}

ʻO ka hope, e hoʻohui kākou i ʻāpana 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
            }
        }
    }
}

he mea sonatypeUsername и sonatypePassword nā mea hoʻololi i loaʻa ka inoa inoa a me ka ʻōlelo huna i hana ʻia i ka wā hoʻopaʻa inoa ma sonatype.org.

Pela ka hope build.gradle e like me kēia:

Code build.gradle piha

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

Makemake au e hoʻomaopopo e loaʻa iā mākou ka mana mai ka hoʻololi kaiapuni: System.getenv('RELEASE_VERSION'). E hōʻike mākou iā ia i ka wā o ka hui a lawe ʻia mai ka inoa inoa.

PGP hana kī

ʻO kekahi o nā koi a Sonatype e kau inoa ʻia nā faila āpau me kahi kī GPG/PGP. No keia hele makou maanei a hoʻoiho i ka pono GnuPG no kāu ʻōnaehana hana.

  • Hoʻokumu mākou i kahi hui kī: gpg --gen-key, hoʻokomo i kahi inoa inoa, leka uila, a hoʻonohonoho pū i kahi ʻōlelo huna.
  • ʻIke mākou id kā mākou kī me ke kauoha: gpg --list-secret-keys --keyid-format short. E kuhikuhi ʻia ka ID ma hope o ka slash, no ka laʻana: rsa2048/9B695056
  • Ke paʻi ʻana i ke kī lehulehu i ke kikowaena https://keys.openpgp.org kauoha: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Hoʻokuʻu aku mākou i ke kī huna i kahi wahi ʻole, pono mākou i ka wā e hiki mai ana: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Hoʻonohonoho i nā hana Github

E neʻe kāua i ka pae hope, hoʻonohonoho i ke kūkulu ʻana a hoʻopuka ʻokoʻa me ka hoʻohana ʻana iā Github Actions.
ʻO Github Actions kahi hiʻohiʻona e hiki ai iā ʻoe ke hoʻokaʻawale i ke kahe hana ma o ka hoʻokō ʻana i kahi pōʻai CI / CD piha. Hiki ke hoʻoulu ʻia ke kūkulu ʻana, hoʻāʻo, a me ka hoʻolaha ʻana e nā hanana like ʻole: code push, hoʻokuʻu ʻana, a i ʻole nā ​​​​pilikia. He manuahi kēia hana no nā waihona lehulehu.

Ma kēia ʻāpana, e hōʻike wau iā ʻoe pehea e hoʻonohonoho ai i ke kūkulu ʻana a me ke kaomi ʻana i ke code a kau i ka waihona Sonatype i ka hoʻokuʻu ʻana, a me ka hoʻonohonoho ʻana i nā mea huna.

Hoʻonoho mākou i nā mea huna

No ka hui ʻana a me ka hoʻolaha ʻana, pono mākou i nā helu huna, e like me ke kī id, ka ʻōlelo huna a mākou i hoʻokomo ai i ka wā e hana ai i ke kī, ke kī PGP ponoʻī, a me ka Sonatype login / password. Hiki iā ʻoe ke hoʻonohonoho iā lākou i kahi ʻāpana kūikawā i nā hoʻonohonoho waihona:

Ke hoʻohana nei i nā hana Gradle a me Github e hoʻolaha i ka papahana Java i ka Sonatype Maven Central Repository

Hoʻonoho mākou i nā ʻano like ʻole:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - kāinoa / ʻōlelo huna a mākou i komo ai i ke kau inoa ʻana me Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP kī id a me ka ʻōlelo huna i hoʻonohonoho ʻia i ka wā hana.

Makemake au e no'ono'o i ka ho'ololi GPG_KEY_CONTENTS i nā kiko'ī hou aku. ʻO ka ʻoiaʻiʻo no ka hoʻolaha ʻana pono mākou i kahi kī PGP pilikino. I mea e kau ai i loko o nā mea huna, ua hoʻohana au kauoha a ua hana hou i kekahi mau hana.

  • E hoʻopili i kā mākou kī me gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgma ke komo ʻana i ka ʻōlelo huna. Pono e hoʻokomo i loko o kahi hoʻololi: SECRET_PASSPHRASE
  • E unuhi kāua i ke kī i hoʻopili ʻia i loko o kahi palapala me ka base64: base64 9B695056.gpg.gpg > 9B695056.txt. E hoʻokomo ʻia ka ʻike ma ka hoʻololi: GPG_KEY_CONTENTS.

E kūkulu i ka hoʻonohonoho i ka wā e hoʻokau ai i ke code a me ka hana ʻana i PR

Pono mua ʻoe e hana i kahi waihona ma ke kumu o kāu papahana: .github/workflows.

I loko o ia mea, e hōʻailona i ka faila, no ka laʻana, gradle-ci-build.yml me keia mau mea:

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

E hoʻokō ʻia kēia kaʻina hana i ka wā e pahu ai i nā lālā master, dev и testing, i ka wā e hana ana i nā noi huki.

Hōʻike ka ʻāpana hana i nā ʻanuʻu e hoʻokō ʻia ma nā hanana i kuhikuhi ʻia. I kēia hihia, e kūkulu mākou i ka mana hou o ubuntu, e hoʻohana iā Java 8, a e hoʻohana pū i ka plugin no Gradle. eskatos/gradle-command-action@v1ʻo ia, me ka hoʻohana ʻana i ka mana hou o ka mea kūkulu hale, e holo i nā kauoha i kuhikuhi ʻia ma arguments. Nā mea hoʻololi secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD ʻo ia nā mea huna a mākou i nīnau mua ai.

E hōʻike ʻia nā hopena kūkulu ma ka pā Hana:

Ke hoʻohana nei i nā hana Gradle a me Github e hoʻolaha i ka papahana Java i ka Sonatype Maven Central Repository

Hoʻomoe ʻakomi ke hoʻokuʻu ʻia kahi hoʻokuʻu hou

E hana kākou i faila kaʻawale no ka 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}}

Aneane like ka waihona me ka mea ma mua, koe wale no ka hanana kahi e hoʻomaka ai. I kēia hihia, ʻo kēia ka hanana o ka hana ʻana i kahi hōʻailona me kahi inoa e hoʻomaka ana me v.

Ma mua o ka hoʻolaha ʻana, pono mākou e unuhi i ke kī PGP mai nā mea huna a waiho i ke kumu o ka papahana, a me ka decrypt. A laila, pono mākou e hoʻonohonoho i kahi ʻano hoʻololi kaiapuni kūikawā RELEASE_VERSION a makou e kuhikuhi nei gradle.build waihona. Hanaʻia kēia mau mea a pau ma ka māhele Prepare to publish. Loaʻa iā mākou kā mākou kī mai ka hoʻololi GPG_KEY_CONTENTS, unuhi iā ia i kahi faila gpg, a laila hoʻokaʻawale iā ia ma ka waiho ʻana i loko o ka faila. secret.gpg.

A laila, huli mākou i kahi loli kūikawā GITHUB_REF, kahi e hiki ai iā mākou ke kiʻi i ka mana a mākou i hoʻonohonoho ai i ka wā e hana ai i ka hōʻailona. Pili kēia ʻano hoʻololi i kēia hihia. refs/tags/v0.0.2 kahi a mākou i ʻoki ai i nā huaʻōlelo 11 mua e loaʻa i kahi mana kikoʻī. A laila, hoʻohana mākou i nā kauoha Gradle maʻamau no ka paʻi ʻana: test publish

Ke nānā nei i nā hopena hoʻolālā ma ka waihona Sonatype

Ma hope o ka hoʻokuʻu ʻia ʻana, pono e hoʻomaka ke kaʻina hana i wehewehe ʻia ma ka ʻāpana mua. No ka hana ʻana i kēia, hana i kahi hoʻokuʻu:

Ke hoʻohana nei i nā hana Gradle a me Github e hoʻolaha i ka papahana Java i ka Sonatype Maven Central Repository

e hoʻomaka ka inoa inoa me ka v. Inā, ma hope o ke kaomi ʻana i ka hoʻopuka hoʻokuʻu, hoʻopau maikaʻi ke kaʻina hana, hiki iā mākou ke hele i Sonatype Nexus e hōʻoia:

Ke hoʻohana nei i nā hana Gradle a me Github e hoʻolaha i ka papahana Java i ka Sonatype Maven Central Repository

Ua ʻike ʻia ka mea hana i loko o ka waihona Staging. Hōʻike koke ia ma ke kūlana Open, a laila pono e hoʻololi lima ʻia i ke kūlana Close ma ke kaomi ʻana i ke pihi kūpono. Ma hope o ka nānā ʻana ua hoʻokō ʻia nā koi āpau, hele ka artifact i ke kūlana Close a ʻaʻole i loaʻa hou no ka hoʻololi ʻana. Ma kēia ʻano, e pau ia ma MavenCentral. Inā maikaʻi nā mea a pau, hiki iā ʻoe ke kaomi i ke pihi Release, a e pau ka artifact i ka waihona Sonatype.

I mea e komo ai ka artifact i loko o MavenCentral, pono ʻoe e noi iā ia ma ka hana a mākou i hana ai i ka hoʻomaka. Pono ʻoe e hana i kēia, no laila, hoʻolaha mākou no ka manawa mua. I nā manawa aʻe, ʻaʻole koi ʻia kēia, e hoʻonohonoho ʻia nā mea āpau. Ua hoʻohuli koke lākou i ka synchronization noʻu, akā ua lawe ʻia ma kahi o 5 mau lā no ka loaʻa ʻana o ka artifact ma MavenCentral.

ʻO ia wale nō, ua paʻi mākou i kā mākou mea hana ma MavenCentral.

nā loulou pono

Source: www.habr.com