Isticmaalka Gradle iyo Github Actions si loo daabaco Mashruuca Java ilaa Sonatype Maven Central Repository

Maqaalkan, waxaan rabaa inaan si faahfaahsan u eego habka daabacaadda farshaxanka Java laga soo bilaabo xoqan iyada oo loo marayo Github Actions ilaa Sonatype Maven Central Repository isticmaalaya dhisaha Gradle.

Waxaan go'aansaday inaan maqaalkan qoro sababtoo ah la'aanta casharrada caadiga ah ee hal meel ah. Dhammaan macluumaadka waxay ahayd in gabal gabal laga soo ururiyo ilo kala duwan, weliba, aan gebi ahaanba cusub ahayn. Yaa dan leh, ku soo dhawoow bisad hoosteeda.

Abuuritaanka kaydka Sonatype

Tallaabada ugu horreysa waa in la abuuro meel kayd ah Sonatype Maven Central. Tan waanu u soconnaa halkan, diwaangeli oo abuur hawl cusub, ina waydiinaysa in aanu abuurno kayd. Inagu waynu wadnaa GroupId mashruuc, URL mashruuca isku xirka mashruuca iyo SCM url isku xirka nidaamka xakamaynta version kaas oo mashruucu ku yaal. GroupId halkan waa inay ahaataa foomka com.example, com.example.domain, com.example.testsupport, iyo sidoo kale waxay noqon kartaa qaab isku xidhka githubkaaga: github.com/yourusername -> io.github.magacaaga. Si kastaba ha ahaatee, waxaad u baahan doontaa inaad xaqiijiso lahaanshaha boggan ama astaanta guud. Haddii aad qeexday astaanta github, waxaa lagu waydiin doonaa inaad samaysato kayd dadweyne oo leh magaca la rabo.

Muddo ka dib xaqiijinta, GroupId kaaga ayaa la abuuri doonaa waxaanan u gudbi karnaa talaabada xigta, qaabaynta Gradle.

Dejinta Gradle

Waqtigii qoritaanka, ma helin Gradle plugins oo ka caawin kara daabacaadda artifact. this plugin kaliya in aan helay, si kastaba ha ahaatee, qoraaga diiday in ay sii taageeraan. Sidaa darteed, waxaan go'aansaday inaan wax walba sameeyo naftayda, maadaama aysan ahayn mid aad u adag in tan la sameeyo.

Waxa ugu horreeya ee la ogaanayo waa shuruudaha Sonatype ee daabacaadda. Waxayna kala yihiin:

  • Helitaanka koodhadhka isha iyo JavaDoc, ie. waa in ay ka soo qayb galaan -sources.jar и-javadoc.jar faylasha. Sida lagu sheegay dukumeentiga, haddii aysan suurtagal ahayn in la bixiyo koodhadhka isha ama dukumentiyada, waxaad samayn kartaa dhumuc weyn -sources.jar ama -javadoc.jar oo leh README fudud oo gudaha ah si aad ugu gudubto imtixaanka.
  • Dhammaan faylasha waa in lagu saxiixo GPG/PGPiyo .asc faylka uu ku jiro saxiixa waa in lagu daraa fayl kasta.
  • helitaanka pom fayl
  • Qiimaha saxda ah groupId, artifactId и version. Noocku wuxuu noqon karaa xadhig gardarro ah oo kuma dhammaan karo -SNAPSHOT
  • Joogitaanka ayaa loo baahan yahay name, description и url
  • Joogitaanka macluumaadka ku saabsan shatiga, horumarinta iyo nidaamka xakamaynta version

Kuwani waa xeerarka aasaasiga ah ee ay tahay in la raaco marka la daabacayo. Macluumaad buuxa ayaa la heli karaa halkan.

Shuruudahaan waxaan ku fulineynaa build.gradle fayl. Marka hore, aan ku darno dhammaan macluumaadka lagama maarmaanka ah ee ku saabsan horumarinta, shatiyada, nidaamka xakamaynta version, iyo sidoo kale dejiyo url, magaca iyo sharaxaadda mashruuca. Aan u qorno hab fudud tan:

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

Marka xigta, waxaad u baahan tahay inaad sheegto inta lagu jiro kulanka la sameeyay -sources.jar и-javadoc.jar faylasha. Qaybtan java waxaad u baahan tahay inaad ku darto waxyaabaha soo socda:

java {
    withJavadocJar()
    withSourcesJar()
}

Aan u gudubno shardiga u dambeeya, anagoo samaynayna saxeex GPG/PGP. Si tan loo sameeyo, ku xidh plugin signing:

plugins {
    id 'signing'
}

Oo ku dar qayb:

signing {
    sign publishing.publications
}

Ugu dambeyntii, aan ku darno qayb 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
            }
        }
    }
}

waa sonatype Username и sonatypePassword doorsoomayaasha ka kooban login iyo erayga sirta ah ee la abuuray inta lagu guda jiro diiwaangelinta on sonatype.org.

Sidaas finalka build.gradle waxay u ekaan doontaa sidan:

Buuxda koodka dhismaha

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

Waxaan rabaa in aan ogaado in aan ka helno nooca doorsoomiyaha deegaanka: System.getenv('RELEASE_VERSION'). Waxaan soo bandhigi doonaa inta lagu jiro kulanka waxaanan ka soo qaadan doonaa magaca tag.

Jiilka muhiimka ah ee PGP

Mid ka mid ah shuruudaha Sonatype waa in dhammaan faylasha lagu saxiixo furaha GPG/PGP. Tan waanu u soconnaa halkan oo soo deji utility GnuPG ee nidaamkaaga hawlgalka.

  • Waxaan abuurnaa lamaane muhim ah: gpg --gen-key, geli username, e-mail, oo sidoo kale deji furaha sirta ah.
  • Waxaan ogaanay id furahayaga leh amarka: gpg --list-secret-keys --keyid-format short. Id ayaa la cayimi doonaa jeexjeexa ka dib, tusaale ahaan: rsa2048/9B695056
  • Daabacaadda furaha dadweynaha ee server-ka https://keys.openpgp.org amar: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Waxaan u dhoofineynaa furaha sirta ah meel aan sharci ahayn, waxaan u baahan doonaa mustaqbalka: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Dejinta Hawlaha Github

Aan u gudubno heerka ugu dambeeya, dejinno dhismaha oo si toos ah u daabac annagoo adeegsanayna Github Actions.
Github Actions waa muuqaal kuu ogolaanaya inaad otomaatig u sameyso socodka shaqada adoo fulinaya wareeg buuxa oo CI / CD ah. Dhisidda, tijaabin, iyo hawlgelinta waxa kicin kara dhacdooyin kala duwan: kood riix, abuurista, ama arrimo. Shaqadani gabi ahaanba waa u bilaash bakhaarada dad waynaha.

Qaybtan, waxaan ku tusi doonaa sida loo sameeyo dhismaha iyo riixitaanka koodka oo la geeyo kaydka Sonatype ee sii deynta, iyo sidoo kale dejinta siraha.

Waxaan dhignay siraha

Isku-dubarid otomaatig ah iyo diritaan, waxaan u baahanahay tiro qiimeyaal sir ah, sida aqoonsiga furaha, furaha sirta ah ee aan galnay markaan furaha soo saarnay, furaha PGP laftiisa, iyo Sonatype login/password. Waxaad u dejin kartaa qayb gaar ah oo ku taal goobaha kaydka:

Isticmaalka Gradle iyo Github Actions si loo daabaco Mashruuca Java ilaa Sonatype Maven Central Repository

Waxaan dejinay doorsoomayaasha soo socda:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - gal / erayga sirta ah ee aanu galnay markii aanu ku diiwaan galinaynay Sonatype
  • SIGNING_KEYID/SIGNING_PASSWORD - PGP aqoonsiga furaha iyo erayga sirta ah ee la dejiyay inta lagu jiro jiilka.

Waxaan rabaa inaan si faahfaahsan ugu dul istaago doorsoomiyaha GPG_KEY_CONTENTS Xaqiiqdu waxay tahay in daabacaadda aan u baahanahay fure PGP gaar ah. Si aan ugu dhejiyo siraha, waxaan isticmaalay tilmaamaha oo intaa dheer waxay sameeyeen dhawr fal.

  • Aynu ku sirno furahayaga gpg: gpg --symmetric --cipher-algo AES256 9B695056.gpgadiga oo gelaya furaha sirta ah. Waa in lagu meeleeyaa doorsoome: SECRET_PASSPRASE
  • Aan u tarjunno furaha la helay qaab qoraal ah anagoo adeegsanayna base64: base64 9B695056.gpg.gpg > 9B695056.txt. Waxa ku jira waxa lagu meelayn doonaa doorsoomaha: GPG_KEY_CONTENTS.

Dhis habaynta markaad riixayso koodka oo aad abuurayso PR

Marka hore waxaad u baahan tahay inaad abuurto galka xididka mashruucaaga: .github/workflows.

Dhexdeeda, ku calaamadee faylka, tusaale ahaan, gradle-ci-build.yml oo leh nuxurka soo socda:

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

Socodkan shaqada waxa la fulin doonaa marka la riixayo laamo master, dev и testing, sidoo kale marka la abuurayo codsiyada jiid.

Qaybta shaqadu waxay ka kooban tahay tillaabooyinka lagu fulinayo dhacdooyinka la cayimay. Xaaladdan oo kale, waxaan ku dhisi doonaa nooca ugu dambeeyay ee ubuntu, isticmaal Java 8, sidoo kale waxaan u isticmaali doonaa plugin ee Gradle eskatos/gradle-command-action@v1Kaas oo isticmaalaya noocii ugu dambeeyay ee wax-dhisaha, ayaa socodsiin doona amarrada lagu sheegay arguments. Kala duwanaansho secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD waa kuwan siraha aan hore u weydiinnay.

Natiijooyinka dhismuhu waxay ka muuqan doonaan tab waxqabadyada:

Isticmaalka Gradle iyo Github Actions si loo daabaco Mashruuca Java ilaa Sonatype Maven Central Repository

Si otomaatig ah u geyso marka la sii daayo cusub

Aan u abuurno fayl shaqo oo gooni ah oo loogu talagalay 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}}

Faylku wuxuu ku dhow yahay inuu la mid yahay kii hore, marka laga reebo dhacdada uu kicin doono. Xaaladdan oo kale, tani waa dhacdada abuurista sumad leh magac ka bilaabmaya v.

Kahor inta aan la dirin, waxaan u baahanahay inaan furaha PGP ka soo saarno siraha oo aan dhigno xididka mashruuca, iyo sidoo kale inaan furno. Marka xigta, waxaan u baahanahay inaan dejino doorsoome deegaan gaar ah RELEASE_VERSION oo aan tixraacno gradle.build fayl. Waxaas oo dhan waxaa lagu sameeyaa qaybta Prepare to publish. Waxaan ka helnaa furahayaga doorsoomaha GPG_KEY_CONTENTS, u tarjun faylka gpg, ka dib furaha fur adiga oo gelinaya faylka secret.gpg.

Marka xigta, waxaan u jeednaa doorsoome gaar ah GITHUB_REF, kaas oo aan ka heli karno nooca aan dejineyno marka la abuurayo tag. Doorsoomayaashan ayaa khuseeya kiiskan. refs/tags/v0.0.2 kaas oo aan ka jarnay 11 xaraf ee ugu horreeya si aan u helno nooc gaar ah. Marka xigta, waxaan u isticmaalnaa amarada Gradle caadiga ah daabacaadda: test publish

Hubinta natiijooyinka geynta ee kaydka Sonatype

Ka dib marka la sii daayo la abuuro, socodka shaqada ee lagu sharraxay qaybta hore waa inuu bilaabmaa. Si tan loo sameeyo, samee sii dayn:

Isticmaalka Gradle iyo Github Actions si loo daabaco Mashruuca Java ilaa Sonatype Maven Central Repository

Magaca sumadu waa inuu ka bilowdaa v. Haddii, ka dib markaad gujiso daabacaadda, socodka shaqadu si guul leh u dhammaysto, waan aadi karnaa Sonatype Nexus si loo hubiyo:

Isticmaalka Gradle iyo Github Actions si loo daabaco Mashruuca Java ilaa Sonatype Maven Central Repository

Farshaxanku wuxuu ka soo muuqday kaydka Staging. Isla markiiba waxay u muuqataa xaalad furan, ka dibna waa in gacanta lagu wareejiyo heerka Close adigoo riixaya badhanka ku habboon. Ka dib markii la hubiyo in dhammaan shuruudaha la buuxiyey, artifact wuxuu galayaa heerka dhow oo hadda lama heli karo in wax laga beddelo. Foomkan, wuxuu ku dhamaan doonaa MavenCentral. Haddii wax walba ay wanaagsan yihiin, waxaad riixi kartaa badhanka Release, oo farshaxanku wuxuu ku dhamaan doonaa kaydka Sonatype.

Si farshaxanku u galo MavenCentral, waxaad u baahan tahay inaad waydiiso hawsha aanu bilawnay bilawgii. Waxaad u baahan tahay inaad tan sameyso hal mar, si aan u daabacno markii ugu horeysay. Waqtiyada soo socda, tan looma baahna, wax walba si toos ah ayaa loo waafajin doonaa. Si degdeg ah ayay ii daareen wada shaqaynta, laakiin waxay qaadatay ilaa 5 maalmood in farshaxanku uu ka noqdo MavenCentral.

Taasi waa intaas, waxaan ku daabacnay agabkayaga MavenCentral.

Xiriiro faa'iido leh

  • La mid ah maqaal, kaliya ku daabac maven
  • Diyaarinta kayd Sonatype
  • Jira Sonatype kaas oo lagu abuurayo hawsha
  • Tusaale: kaydka halkaas oo ay ku dhan yihiin

Source: www.habr.com