Ag baint úsáide as Gníomhartha Gradle agus Github chun Tionscadal Java a Fhoilsiú chuig Stór Lárnach Sonatype Maven

San Airteagal seo, ba mhaith liom breathnú níos géire ar an bpróiseas chun déantúsán Java a fhoilsiú ón tús trí Github Actions i Stór Lárnach Sonatype Maven ag baint úsáide as an bailitheoir Gradle.

Chinn mé an t-alt seo a scríobh mar gheall ar an easpa gnáth-theagasc in aon áit amháin. B'éigean an t-eolas ar fad a bhailiú píosa ar phíosa ó fhoinsí éagsúla, seachas foinsí úrnua go hiomlán. Aon duine a bhfuil suim acu, fáilte romhat chuig cat.

Ag cruthú stór i Sonatype

Is é an chéad chéim stór a chruthú i Sonatype Maven Central. Chun seo a théann muid anseo, cláraigh agus cruthaigh tasc nua le hiarratas chun stór a chruthú dúinn. Táimid ag tiomáint inár gceann GroupId tionscadal, URL an tionscadail nasc leis an tionscadal agus SCM url nasc chuig an gcóras rialaithe leagan ina bhfuil an tionscadal suite. GroupId Ba chóir go mbeadh anseo cosúil le com.example, com.example.domain, com.example.testsupport, agus is féidir é a bheith i bhfoirm naisc chuig do github freisin: github.com/yourusername -> io.github.yourusername. Ar aon chuma, beidh ort úinéireacht an fhearainn nó na próifíle a fhíorú. Má shonraigh tú próifíl Github, iarrfar ort stór poiblí a chruthú leis an ainm atá uait.

Tamall tar éis an deimhnithe, cruthófar do GroupId agus is féidir linn bogadh ar aghaidh go dtí an chéad chéim eile, cumraíocht Gradle.

Gradle a chumrú

Agus é seo á scríobh, níor aimsigh mé forlíontán ar bith do Gradle a d'fhéadfadh cabhrú le déantúsán a fhoilsiú. Tá sé an breiseán amháin a d'aimsigh mé, ach dhiúltaigh an t-údar tacaíocht bhreise a thabhairt dó. Dá bhrí sin, chinn mé gach rud a dhéanamh mé féin, go fortunately níl sé ró-deacair.

Is é an chéad rud atá le fáil amach ná ceanglais foilsitheoireachta Sonatype. Tá siad mar seo a leanas:

  • Infhaighteacht na gcód foinse agus JavaDoc, i.e. Ní mór a bheith i láthair -sources.jar и-javadoc.jar comhaid. Mar a dúradh sa doiciméadú, murar féidir cóid foinse nó doiciméadú a sholáthar, is féidir leat Caochadán a dhéanamh -sources.jar-javadoc.jar le README simplí taobh istigh chun pas a fhíorú.
  • Ní mór gach comhad a shíniú leis GPG/PGPAgus .asc ní mór an comhad ina bhfuil an síniú a chur san áireamh do gach comhad.
  • infhaighteacht pom comhad
  • Luachanna cearta groupId, artifactId и version. Is féidir le leagan a bheith ina theaghrán treallach agus ní féidir leis críochnú -SNAPSHOT
  • Láithreacht ag teastáil name, description и url
  • Láithreacht faisnéise faoin gceadúnas, forbróirí agus córas rialaithe leagan

Is iad seo na bunrialacha nach mór a leanúint agus tú ag foilsiú. Eolas iomlán ar fáil anseo.

Cuirfimid na ceanglais seo i bhfeidhm i build.gradle comhad. Gcéad dul síos, a ligean ar cuir an fhaisnéis go léir is gá faoi na forbróirí, ceadúnas, córas rialaithe leagan, agus freisin a leagtar ar an url, ainm agus cur síos ar an tionscadal. Chun seo a dhéanamh, scríobhaimis modh simplí:

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

Ansin ní mór duit a shonrú gur le linn tionóil a ghinfidh siad -sources.jar и-javadoc.jar comhaid. Chun seo a dhéanamh, téigh go dtí an rannóg java ní mór duit an méid seo a leanas a chur leis:

java {
    withJavadocJar()
    withSourcesJar()
}

Bogaimis ar aghaidh go dtí an riachtanas deireanach, síniú GPG/PGP a bhunú. Chun seo a dhéanamh, déanaimis an breiseán a nascadh signing:

plugins {
    id 'signing'
}

Agus cuir alt leis:

signing {
    sign publishing.publications
}

Ar deireadh, cuirimis alt leis 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
            }
        }
    }
}

Anseo sonatype Ainm úsáideora и SonatypePasfhocal athróga ina bhfuil an logáil isteach agus an pasfhocal a cruthaíodh le linn clárúcháin ar sonatype.org.

Mar sin an deiridh build.gradle beidh cuma mar seo:

Cód iomlá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]'
                }
            }
        }
    }
}

Ba mhaith liom a thabhairt faoi deara go bhfaighimid an leagan ón athróg timpeallachta: System.getenv('RELEASE_VERSION'). Socróimid é le linn tionóil agus tógfaimid é ón ainm chlib.

Giniúint eochair PGP

Ar cheann de riachtanais Sonatype tá gach comhad a shíniú ag baint úsáide as eochair GPG/PGP. Chun seo a théann muid anseo agus íoslódáil an fóntais GnuPG do do chóras oibriúcháin.

  • Péire eochracha á nginiúint: gpg --gen-key, cuir isteach d'ainm úsáideora, r-phost, agus socraigh pasfhocal freisin.
  • A ligean ar a fháil amach id ár n-eochair leis an ordú: gpg --list-secret-keys --keyid-format short. Léireofar an t-aitheantas tar éis an tslais, mar shampla: rsa2048/9B695056
  • Foilsigh an eochair phoiblí don fhreastalaí https://keys.openpgp.org le hordú: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Easpórtálaimid an eochair rúnda chuig suíomh treallach; beidh sé ag teastáil uainn níos déanaí: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Gníomhartha Github a chur ar bun

Bogfaimid ar aghaidh go dtí an chéim dheireanach, ag bunú an fhoilsithe tógála agus uathoibríoch ag baint úsáide as Gníomhartha Github.
Feidhmiúlacht is ea Github Actions a ligeann duit an sreabhadh oibre a uathoibriú trí thimthriall iomlán CI/CD a chur i bhfeidhm. Is féidir tógáil, tástáil agus imscaradh a spreagadh le himeachtaí éagsúla: cód a bhrú, scaoileadh a chruthú nó eisiúintí. Tá an fheidhmiúlacht seo go hiomlán saor in aisce do stórtha poiblí.

Sa chuid seo, taispeánfaidh mé duit conas tógáil agus brú cód agus imscaradh a chur ar bun chuig an stór Sonatype nuair a bhíonn scaoileadh á scaoileadh, chomh maith le rúin a shocrú.

Rúin a shocrú

Le haghaidh cóimeála agus imscaradh uathoibríoch, beidh roinnt luachanna rúnda ag teastáil uainn, mar shampla an eochair-aitheantas, an focal faire a chuireamar isteach nuair a bhí an eochair á giniúint againn, an eochair PGP féin, chomh maith leis an logáil isteach/focal faire le haghaidh Sonatype. Is féidir leat iad a shocrú i rannán speisialta sna socruithe stór:

Ag baint úsáide as Gníomhartha Gradle agus Github chun Tionscadal Java a Fhoilsiú chuig Stór Lárnach Sonatype Maven

Shocraigh muid na hathróga seo a leanas:

  • SONATYPE_USERNAME/SONATYPE_PASSWORD - logáil isteach/focal faire a chuireamar isteach agus muid ag clárú le Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD — Aitheantas eochair PGP agus pasfhocal socraithe le linn giniúna.

Ba mhaith liom fanacht níos mine ar an athróg GPG_KEY_CONTENTS. Is é fírinne an scéil go bhfuil eochair phríobháideach PGP de dhíth orainn le foilsiú. D'fhonn é a chur i rúin, d'úsáid mé teagasc agus rinne roinnt gníomhartha freisin.

  • Déanaimis ár n-eochair a chriptiú ag baint úsáide as gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgag dul isteach an focal faire. Ba cheart é a chur in athróg: SECRET_PASSPHRASE
  • Déanaimis an eochair chriptithe a thiontú go téacs i bhfoirm téacs ag úsáid base64: base64 9B695056.gpg.gpg > 9B695056.txt. Cuirfimid an t-ábhar san athróg: GPG_KEY_CONTENTS.

Tógáil a bhunú agus cód á bhrú agus PR á chruthú

Ar dtús ní mór duit fillteán a chruthú i bhfréamh do thionscadal: .github/workflows.

Marcáil an comhad ann, mar shampla, gradle-ci-build.yml leis an ábhar seo 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}}

Déanfar an sreabhadh oibre seo a fhorghníomhú agus é ag brú ar bhrainsí master, dev и testing, freisin nuair a bhíonn iarratais tarraingthe á gcruthú.

Sonraíonn an rannóg post na céimeanna nach mór a fhorghníomhú bunaithe ar na himeachtaí sonraithe. Sa chás seo, cuirfimid leis an leagan is déanaí de ubuntu, bain úsáid as Java 8, agus úsáidfimid breiseán do Gradle freisin eskatos/gradle-command-action@v1, a reáchtálfaidh, ag baint úsáide as an leagan is déanaí den bhailitheoir, na horduithe a shonraítear i arguments. Athróga secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD Seo iad na rúin a d'iarr muid níos luaithe.

Léireofar na torthaí tógála sa chluaisín Gníomhartha:

Ag baint úsáide as Gníomhartha Gradle agus Github chun Tionscadal Java a Fhoilsiú chuig Stór Lárnach Sonatype Maven

Autodeploy agus scaoileadh nua á scaoileadh

Le haghaidh uath-imscaradh, cruthóimid comhad sreafa oibre ar leith 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}}

Tá an comhad beagnach mar a chéile leis an gceann roimhe seo ach amháin i gcás an imeachta ag a spreagfar é. Sa chás seo, is é seo an ócáid ​​​​a chruthú clib le hainm ag tosú le v.

Roimh imscaradh, ní mór dúinn an eochair PGP a bhaint as na rúin agus é a chur i bhfréamh an tionscadail, chomh maith le díchriptiú. Ansin caithfimid athróg timpeallachta speisialta a shocrú RELEASE_VERSION dá dtagraíonn muid i gradle.build comhad. Déantar é seo go léir sa rannóg Prepare to publish. Faighimid ár n-eochair ón athróg GPG_KEY_CONTENTS, aistrigh isteach i gcomhad gpg í, ansin díchriptigh é trína chur sa chomhad secret.gpg.

Ansin rochtain againn ar an athróg speisialta GITHUB_REF, ónar féidir linn an leagan a shonraigh muid a fháil agus an chlib á chruthú. Tá an luach ag an athróg seo sa chás seo refs/tags/v0.0.2 as ar ghearramar na chéad 11 charachtar chun an leagan sonrach a fháil. Ansin, úsáidimid na horduithe caighdeánacha Gradle chun iad a fhoilsiú: test publish

Seiceáil torthaí imlonnaithe sa stór Sonatype

Tar éis an scaoileadh a chruthú, ba cheart tús a chur leis an sreabhadh oibre a thuairiscítear san alt roimhe seo. Chun seo a dhéanamh, cruthaímid scaoileadh:

Ag baint úsáide as Gníomhartha Gradle agus Github chun Tionscadal Java a Fhoilsiú chuig Stór Lárnach Sonatype Maven

sa chás seo, caithfidh an t-ainm clibe tosú le v. Más rud é, tar éis cliceáil Foilsigh scaoileadh, ritheann an sreabhadh oibre go rathúil, is féidir linn dul go dtí Sonatype Nexus a chinntiú:

Ag baint úsáide as Gníomhartha Gradle agus Github chun Tionscadal Java a Fhoilsiú chuig Stór Lárnach Sonatype Maven

Bhí an déantúsán le feiceáil sa stór Staging. Dealraíonn sé láithreach sa stádas Oscailte, ansin ní mór é a aistriú de láimh chuig an stádas Dún trí chliceáil ar an gcnaipe comhfhreagrach. Tar éis a sheiceáil go gcomhlíontar na ceanglais go léir, bogann an Déantán go stádas Dún agus níl sé ar fáil a thuilleadh le haghaidh modhnú. San fhoirm seo rachaidh sé go MavenCentral. Má tá gach rud ceart go leor, is féidir leat brúigh an cnaipe Scaoileadh, agus rachaidh an déantán chuig stór Sonatype.

Chun an déantán a chur san áireamh i MavenCentral, ní mór duit é a iarraidh sa tasc a chruthaigh muid ag an tús. Ní gá duit é seo a dhéanamh ach uair amháin, mar sin foilsímid é den chéad uair. Ní gá é seo a dhéanamh an chéad uair eile, déanfar gach rud a shioncrónú go huathoibríoch. Chuir siad sioncrónú ar siúl dom go tapa, ach thóg sé thart ar 5 lá chun an déantán a bheith ar fáil i MavenCentral.

Sin uile, d'fhoilsíomar ár ndéantán i MavenCentral.

naisc úsáideacha

  • Cosúil airteagal, a fhoilsiú ach amháin trí maven
  • Staging stór Sonatype
  • Jira Sonatype ina gcaithfidh tú tasc a chruthú
  • Sampla stór ina bhfuil sé uile cumraithe

Foinse: will.com