A’ cleachdadh Gnìomhan Gradle agus Github gus Pròiseact Java fhoillseachadh gu Stòras Meadhan Sonatype Maven

San artaigil seo, tha mi airson sùil mhionaideach a thoirt air a’ phròiseas a bhith a’ foillseachadh artifact Java bhon fhìor thoiseach tro Github Actions gu Stòras Meadhanach Sonatype Maven a’ cleachdadh an neach-togail Gradle.

Cho-dhùin mi an artaigil seo a sgrìobhadh air sgàth dìth oideachadh àbhaisteach ann an aon àite. Dh'fheumadh am fiosrachadh gu lèir a bhith air a chruinneachadh mean air mhean bho dhiofar thùsan, a bharrachd air sin, gun a bhith gu tur ùr. Cò leis a tha cùram, fàilte fo chat.

A 'cruthachadh stòr ann an Sonatype

Is e a’ chiad cheum stòr a chruthachadh ann an Sonatype Maven Central. Airson seo thèid sinn an seo, clàraich agus cruthaich gnìomh ùr, ag iarraidh oirnn stòr a chruthachadh. Bidh sinn a’ draibheadh ​​nar GroupId pròiseict, URL a 'phròiseict ceangal pròiseict agus SCM url ceangal ris an t-siostam smachd dreach anns a bheil am pròiseact suidhichte. GroupId bu chòir an seo a bhith den fhoirm com.example, com.example.domain, com.example.testsupport, agus faodaidh e cuideachd a bhith ann an cruth ceangail ris an github agad: github.com/yourusername -> io.github.yourusername. Ann an suidheachadh sam bith, feumaidh tu dearbhadh a dhèanamh air sealbh air an àrainn no an ìomhaigh seo. Ma shònraich thu pròifil github, thèid iarraidh ort stòr poblach a chruthachadh leis an ainm a tha thu ag iarraidh.

Beagan ùine às deidh dearbhadh, thèid do GroupId a chruthachadh agus is urrainn dhuinn gluasad air adhart chun ath cheum, rèiteachadh Gradle.

A' rèiteachadh Gradle

Aig àm sgrìobhaidh, cha do lorg mi plugins Gradle a dh’ fhaodadh cuideachadh le bhith a’ foillseachadh an artifact. seo an aon plugan a lorg mi, ge-tà, dhiùlt an t-ùghdar taic a bharrachd a thoirt dha. Mar sin, cho-dhùin mi a h-uile càil a dhèanamh mi fhìn, leis nach eil e ro dhoirbh seo a dhèanamh.

Is e a’ chiad rud ri dhèanamh a-mach na riatanasan aig Sonatype airson foillseachadh. Tha iad mar a leanas:

  • Cothrom air còdan stòr agus JavaDoc, ie. feumaidh frithealadh -sources.jar и-javadoc.jar faidhlichean. Mar a chaidh a ràdh anns na sgrìobhainnean, mura h-eil e comasach còdan stòr no sgrìobhainnean a thoirt seachad, faodaidh tu dummy a dhèanamh -sources.jar no -javadoc.jar le README sìmplidh a-staigh gus a dhol seachad air an deuchainn.
  • Feumaidh gach faidhle a bhith air a shoidhnigeadh leis GPG/PGPagus .asc feumaidh am faidhle anns a bheil an t-ainm-sgrìobhte a bhith air a ghabhail a-steach airson gach faidhle.
  • ri fhaotainn pom faidhle
  • Luachan ceart groupId, artifactId и version. Faodaidh an dreach a bhith na shreang neo-riaghailteach agus chan urrainn dha crìochnachadh le -SNAPSHOT
  • Tha feum air làthaireachd name, description и url
  • An làthair fiosrachadh mun cheadachas, luchd-leasachaidh agus siostam smachd dreach

Is iad seo na riaghailtean bunaiteach a dh'fheumar a leantainn nuair a thathar a 'foillseachadh. Fiosrachadh slàn ri fhaighinn an seo.

Bidh sinn a’ cur an gnìomh nan riatanasan sin ann an build.gradle faidhle. An toiseach, leig dhuinn a h-uile fiosrachadh riatanach a chuir a-steach mun luchd-leasachaidh, ceadan, siostam smachd dreach, agus cuideachd an url, ainm agus tuairisgeul a’ phròiseict a shuidheachadh. Sgrìobhaidh sinn dòigh shìmplidh airson seo:

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

An ath rud, feumaidh tu sin a shònrachadh rè an t-seanaidh a chaidh a chruthachadh -sources.jar и-javadoc.jar faidhlichean. Airson an roinn seo java feumaidh tu na leanas a chur ris:

java {
    withJavadocJar()
    withSourcesJar()
}

Gluaisidh sinn air adhart chun an riatanas mu dheireadh, a’ stèidheachadh ainm-sgrìobhte GPG/PGP. Gus seo a dhèanamh, ceangail am plugan signing:

plugins {
    id 'signing'
}

Agus cuir earrann ris:

signing {
    sign publishing.publications
}

Mu dheireadh, leig dhuinn earrann a chur ris 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
            }
        }
    }
}

tha e sonatype Ainm-cleachdaidh и Sonatype Facal-faire caochladairean anns a bheil an logadh a-steach agus am facal-faire a chaidh a chruthachadh aig àm clàraidh air sonatype.org.

Mar sin a’ chuairt dheireannach build.gradle seallaidh seo:

Còd làn 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 protected]'
                }
            }
        }
    }
}

Tha mi airson a thoirt fa-near gum faigh sinn an dreach bho chaochladair na h-àrainneachd: System.getenv('RELEASE_VERSION'). Bidh sinn ga nochdadh aig àm co-chruinneachadh agus ga thoirt bhon ainm tag.

PGP prìomh ghinealach

Is e aon de na riatanasan aig Sonatype gum bi a h-uile faidhle air a shoidhnigeadh le iuchair GPG / PGP. Airson seo thèid sinn an seo agus luchdaich sìos goireas GnuPG airson an t-siostam obrachaidh agad.

  • Bidh sinn a’ cruthachadh prìomh phaidhir: gpg --gen-key, cuir a-steach ainm-cleachdaidh, post-d, agus cuideachd cuir sìos facal-faire.
  • Faigh a-mach id ar iuchair leis an àithne: gpg --list-secret-keys --keyid-format short. Thèid id a shònrachadh às deidh an t-slais, mar eisimpleir: rsa2048/9B695056
  • Foillsich an iuchair phoblach dhan fhrithealaiche https://keys.openpgp.org òrdugh: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Bidh sinn a’ cur a-mach an iuchair dhìomhair gu àite neo-riaghailteach, bidh feum againn air san àm ri teachd: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

A 'stèidheachadh Gnìomhan Github

Gluaisidh sinn air adhart chun ìre mu dheireadh, cuir air dòigh an togail agus fèin-fhoillseachadh a ’cleachdadh Gnìomhan Github.
Tha Github Actions na fheart a leigeas leat an sruth-obrach a dhèanamh fèin-ghluasadach le bhith a’ buileachadh cearcall CI / CD slàn. Faodar togail, deuchainn agus cleachdadh a bhrosnachadh le diofar thachartasan: putadh còd, cruthachadh fuasglaidh, no cùisean. Tha an gnìomh seo gu tur an-asgaidh airson stòran poblach.

Anns an earrainn seo, seallaidh mi dhut mar a shuidhicheas tu còd togail is putadh agus a chuir gu stòr Sonatype nuair a thèid a leigeil ma sgaoil, a bharrachd air dìomhaireachdan a stèidheachadh.

Shuidhich sinn dìomhaireachdan

Airson co-chruinneachadh agus cleachdadh fèin-ghluasadach, feumaidh sinn grunn luachan dìomhair, leithid am prìomh id, am facal-faire a chuir sinn a-steach nuair a bha sinn a’ gineadh an iuchair, an iuchair PGP fhèin, agus an logadh a-steach / facal-faire Sonatype. Faodaidh tu an suidheachadh ann an roinn shònraichte ann an roghainnean an stòrais:

A’ cleachdadh Gnìomhan Gradle agus Github gus Pròiseact Java fhoillseachadh gu Stòras Meadhan Sonatype Maven

Shuidhich sinn na caochladairean a leanas:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - logadh a-steach / facal-faire a chuir sinn a-steach nuair a bha sinn a’ clàradh le Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD - iuchrach PGP agus facal-faire air a shuidheachadh rè ginealach.

Tha mi airson fuireach air an caochladair GPG_KEY_CONTENTS ann am barrachd mionaideachd. Is e an fhìrinn gu bheil feum againn air iuchair PGP prìobhaideach airson fhoillseachadh. Gus a phostadh anns na dìomhaireachdan, chleachd mi stiùireadh agus a bharrachd air sin rinn e grunn ghnìomhan.

  • Nach crioptaich sinn an iuchair againn le gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgle bhith a’ cur a-steach facal-faire. Bu chòir a chur ann an caochladair: SECRET_PASSPHRASE
  • Eadar-theangaich sinn an iuchair chrioptaichte a fhuair sinn gu cruth teacsa a’ cleachdadh base64: base64 9B695056.gpg.gpg > 9B695056.txt. Thèid an susbaint a chur sa chaochladair: GPG_KEY_CONTENTS.

Tog suidheachadh nuair a phutas tu còd agus cruthaich PR

An toiseach feumaidh tu pasgan a chruthachadh ann am freumh a’ phròiseict agad: .github/workflows.

Ann, comharraich am faidhle, mar eisimpleir, gradle-ci-build.yml leis an t-susbaint a leanas:

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

Thèid an sruth-obrach seo a chuir gu bàs nuair a thèid a phutadh gu geugan master, dev и testing, cuideachd nuair a chruthaicheas tu iarrtasan tarraing.

Tha an earrann obraichean a 'sònrachadh nan ceumannan a thèid a chur gu bàs air na tachartasan ainmichte. Anns a’ chùis seo, togaidh sinn air an tionndadh as ùire de ubuntu, cleachdaidh sinn Java 8, agus cleachdaidh sinn am plugan airson Gradle cuideachd. eskatos/gradle-command-action@v1a ruitheas, a’ cleachdadh an dreach as ùire den neach-togail, na h-òrdughan a chaidh a shònrachadh ann an arguments. Caochlaidhean secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD is iad sin na dìomhaireachdan a dh’ iarr sinn na bu thràithe.

Bidh na toraidhean togail ri fhaicinn anns an taba Gnìomhan:

A’ cleachdadh Gnìomhan Gradle agus Github gus Pròiseact Java fhoillseachadh gu Stòras Meadhan Sonatype Maven

Cuir a-steach gu fèin-ghluasadach nuair a thèid brath ùr fhoillseachadh

Cruthaichidh sinn faidhle sruth-obrach air leth airson fèin-chleachdadh 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}}

Tha am faidhle cha mhòr co-ionann ris an fhear roimhe, ach a-mhàin an tachartas anns an tèid a phiobrachadh. Anns a 'chùis seo, is e seo an tachartas a bhith a' cruthachadh tag le ainm a 'tòiseachadh le v.

Mus tèid a chleachdadh, feumaidh sinn an iuchair PGP a thoirt a-mach às na dìomhaireachdan agus a chuir ann am freumh a’ phròiseict, a bharrachd air a dhì-chrioptachadh. An ath rud, feumaidh sinn caochladair àrainneachd sònraichte a shuidheachadh RELEASE_VERSION air am bheil sinn a' toirt iomradh gradle.build faidhle. Tha seo uile air a dhèanamh anns an earrainn Prepare to publish. Gheibh sinn an iuchair againn bhon chaochladair GPG_KEY_CONTENTS, eadar-theangaich e gu faidhle gpg, an uairsin dì-chrioptachadh le bhith ga chuir san fhaidhle secret.gpg.

An ath rud, bidh sinn a 'tionndadh gu caochladair sònraichte GITHUB_REF, às am faigh sinn an dreach a shuidhich sinn nuair a chruthaicheas sinn an taga. Tha an caochladh seo buntainneach sa chùis seo. refs/tags/v0.0.2 às an do gheàrr sinn dheth a’ chiad 11 caractar gus dreach sònraichte fhaighinn. An ath rud, bidh sinn a’ cleachdadh na h-òrdughan àbhaisteach Gradle airson foillseachadh: test publish

A’ sgrùdadh toraidhean cleachdadh ann an stòr Sonatype

Às deidh an sgaoileadh a chruthachadh, bu chòir an sruth-obrach a chaidh a mhìneachadh san earrann roimhe seo tòiseachadh. Gus seo a dhèanamh, cruthaich foillseachadh:

A’ cleachdadh Gnìomhan Gradle agus Github gus Pròiseact Java fhoillseachadh gu Stòras Meadhan Sonatype Maven

feumaidh an t-ainm taga tòiseachadh le v. Ma tha, às deidh dhut briogadh Foillsich brath, gu bheil an sruth-obrach air a chrìochnachadh gu soirbheachail, faodaidh sinn a dhol gu Sonatype Nexus gus dèanamh cinnteach:

A’ cleachdadh Gnìomhan Gradle agus Github gus Pròiseact Java fhoillseachadh gu Stòras Meadhan Sonatype Maven

Nochd an artifact anns an stòr Staging. Bidh e a’ nochdadh sa bhad san inbhe Fhosgailte, agus an uairsin feumar a ghluasad le làimh chun inbhe Dùin le putadh air a’ phutan iomchaidh. Às deidh dha dèanamh cinnteach gu bheilear a ’coinneachadh ris na riatanasan uile, bidh an artifact a’ dol a-steach don inbhe Dùin agus chan eil e ri fhaighinn tuilleadh airson atharrachadh. Anns an fhoirm seo, thig e gu crìch ann am MavenCentral. Ma tha a h-uile càil gu math, faodaidh tu am putan a bhrùthadh release, agus thig an artifact gu crìch ann an stòr Sonatype.

Gus am faigh an artifact a-steach gu MavenCentral, feumaidh tu iarraidh air anns a’ ghnìomh a chruthaich sinn aig an fhìor thoiseach. Chan fheum thu seo a dhèanamh ach aon turas, agus mar sin bidh sinn a’ foillseachadh airson a’ chiad uair. Anns na h-amannan às deidh sin, chan eil seo riatanach, thèid a h-uile càil a shioncronachadh gu fèin-ghluasadach. Thionndaidh iad air sioncronadh dhòmhsa gu sgiobalta, ach thug e timcheall air 5 latha airson an artifact a bhith ri fhaighinn ann am MavenCentral.

Sin uile, tha sinn air an artifact againn fhoillseachadh ann am MavenCentral.

Ceanglaichean feumail

  • coltach artaigil, foillsich a-mhàin tro maven
  • A ’seasamh tasgaidh Sonatype
  • Jira Sonatype airson an obair a chruthachadh
  • Eisimpleir: ionad-tasgaidh far a bheil e uile air a stèidheachadh

Source: www.habr.com