Java долбоорун Sonatype Maven борбордук репозиторийине жарыялоо үчүн Gradle жана Github аракеттерин колдонуу

Бул макалада мен Java артефактын нөлдөн баштап Github аракеттери аркылуу Sonatype Maven борбордук репозиторийине Gradle куруучусун колдонуу менен жарыялоо процессин кеңири карап чыккым келет.

Мен бул макаланы жазууну чечтим, анткени бир жерде кадимки окуу куралы жок. Бардык маалымат ар кандай булактардан бөлүк-бөлүк чогултулушу керек болчу, анын үстүнө, толугу менен жаңы эмес. Ким ойлойт, мышыктын астына кош келиңиз.

Sonatypeде репозиторий түзүү

Биринчи кадам - ​​Sonatype Maven Centralда репозиторий түзүү. Бул үчүн биз барабыз бул жерде, репозиторийди түзүүнү суранып, катталып, жаңы тапшырма түзүңүз. Биз өзүбүздө айдайбыз GroupId долбоор, Долбоордун URL долбоор шилтемеси жана SCM url долбоор жайгашкан версияны башкаруу системасына шилтеме. GroupId бул жерде com.example, com.example.domain, com.example.testsupport формасында болушу керек, ошондой эле github'уңузга шилтеме түрүндө болушу мүмкүн: github.com/yurusername -> io.github.yurusername. Кандай болгон күндө да, бул доменге же профилге ээлик кылууну ырасташыңыз керек болот. Эгер сиз github профилин көрсөтсөңүз, сизден каалаган ат менен коомдук репозиторий түзүү суралат.

Ырастоодон бир нече убакыт өткөндөн кийин, GroupId түзүлөт жана биз кийинки кадамга, Gradle конфигурациясына өтө алабыз.

Gradle конфигурацияланууда

Жазып жаткан учурда мен артефактты жарыялоого жардам бере турган Gradle плагиндерин тапкан жокмун. бул мен тапкан жалгыз плагин, бирок автор аны андан ары колдоодон баш тартты. Ошондуктан, мен баарын өзүм жасоону чечтим, анткени муну жасоо кыйын эмес.

Биринчиден, бул Sonatypeтин басып чыгарууга болгон талаптары. Алар төмөндөгүлөр:

  • Булак коддору жана JavaDoc болушу, б.а. катышуу керек -sources.jar и-javadoc.jar файлдар. Документте айтылгандай, эгерде булак коддорун же документтерди берүү мүмкүн болбосо, сиз муляж жасай аласыз. -sources.jar же -javadoc.jar тесттен өтүү үчүн жөнөкөй README менен.
  • Бардык файлдар менен кол коюлушу керек GPG/PGPжана .asc кол тамгасы бар файл ар бир файл үчүн камтылууга тийиш.
  • болушу pom файл
  • Туура баалуулуктар groupId, artifactId и version. Версия ыктыярдуу сап болушу мүмкүн жана аны менен бүтүшү мүмкүн эмес -SNAPSHOT
  • Болушу керек name, description и url
  • Лицензия, иштеп чыгуучулар жана версияларды башкаруу системасы жөнүндө маалыматтын болушу

Бул жарыялоодо карманууга тийиш болгон негизги эрежелер. Толук маалымат жеткиликтүү бул жерде.

Биз бул талаптарды ишке ашырабыз build.gradle файл. Биринчиден, иштеп чыгуучулар, лицензиялар, версияларды башкаруу системасы жөнүндө бардык керектүү маалыматты кошуп, долбоордун url дарегин, аталышын жана сыпаттамасын орнотобуз. Бул үчүн жөнөкөй ыкманы жазалы:

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

Андан кийин, сиз түзүлгөн жыйын учурунда көрсөтүү керек -sources.jar и-javadoc.jar файлдар. Бул бөлүм үчүн java сиз төмөнкүлөрдү кошуу керек:

java {
    withJavadocJar()
    withSourcesJar()
}

Келгиле, GPG/PGP кол тамгасын орнотуп, акыркы талапка өтөлү. Бул үчүн, плагинди туташтырыңыз signing:

plugins {
    id 'signing'
}

Жана бөлүм кошуу:

signing {
    sign publishing.publications
}

Акырында бир бөлүмдү кошолу 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
            }
        }
    }
}

бул sonatypeUsername и sonatypePassword каттоо учурунда түзүлгөн логин жана паролду камтыган өзгөрмөлөр sonatype.org.

Ошентип финал build.gradle мындай болот:

Толук 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]'
                }
            }
        }
    }
}

Мен версияны чөйрө өзгөрмөсүнөн алганыбызды белгилегим келет: System.getenv('RELEASE_VERSION'). Биз аны чогултуу учурунда ачыкка чыгарабыз жана тегдин атынан алабыз.

PGP ачкычын түзүү

Sonatype талаптарынын бири бардык файлдар GPG/PGP ачкычы менен кол коюлушу керек. Бул үчүн биз барабыз бул жерде жана иштөө тутумуңуз үчүн GnuPG утилитасын жүктөп алыңыз.

  • Биз ачкыч жупту жаратабыз: gpg --gen-key, колдонуучу атын, электрондук почтаны киргизиңиз, ошондой эле сырсөздү коюңуз.
  • табуу id команда менен биздин ачкыч: gpg --list-secret-keys --keyid-format short. Идентификатор сызыктан кийин көрсөтүлөт, мисалы: rsa2048/9B695056
  • Серверге ачык ачкыч жарыялоо https://keys.openpgp.org буйругу менен: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Биз жашыруун ачкычты каалаган жерге экспорттойбуз, келечекте ал бизге керек болот: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Github аракеттерин орнотуу

Келгиле, акыркы этапка өтүп, Github Actions аркылуу курууну жана автоматтык түрдө жарыялоону орнотобуз.
Github Actions - бул толук CI / CD циклин ишке ашыруу менен иш процессин автоматташтырууга мүмкүндүк берген функция. Куруу, сыноо жана жайылтуу ар кандай окуялардан улам пайда болушу мүмкүн: кодду түртүү, чыгарууну түзүү же маселелер. Бул функция коомдук репозиторийлер үчүн таптакыр бекер.

Бул бөлүмдө мен сизге куруу жана түртүү кодду кантип орнотууну жана чыгарылганда Sonatype репозиторийине жайгаштырууну, ошондой эле сырларды орнотууну көрсөтөм.

Биз сырларды койдук

Автоматтык түрдө чогултуу жана жайгаштыруу үчүн бизге ачкыч идентификатору, ачкычты түзүүдө биз киргизген сырсөз, PGP ачкычынын өзү жана Sonatype логин/сырсөзү сыяктуу бир катар жашыруун маанилер керек. Сиз аларды репозиторий орнотууларындагы атайын бөлүмгө орното аласыз:

Java долбоорун Sonatype Maven борбордук репозиторийине жарыялоо үчүн Gradle жана Github аракеттерин колдонуу

Биз төмөнкү өзгөрмөлөрдү орнотобуз:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - Sonatype менен катталып жатканда биз киргизген логин / сырсөз
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP ачкыч идентификатору жана сырсөз генерация учурунда коюлган.

Мен GPG_KEY_CONTENTS өзгөрмөсүнө кененирээк токтолгум келет. Чындыгында, жарыялоо үчүн бизге жеке PGP ачкычы керек. Аны сырларга жарыялоо үчүн мен колдондум көрсөтмөлөрү жана кошумча түрдө бир катар аракеттерди жасады.

  • Келгиле, ачкычыбызды gpg менен шифрлейли: gpg --symmetric --cipher-algo AES256 9B695056.gpgсырсөздү киргизүү менен. Ал өзгөрмөгө жайгаштырылышы керек: SECRET_PASSPHRASE
  • Келгиле, кабыл алынган шифрленген ачкычты base64 аркылуу текст формасына которолу: base64 9B695056.gpg.gpg > 9B695056.txt. Мазмун өзгөрмөгө жайгаштырылат: GPG_KEY_CONTENTS.

Кодду түртүп, PR түзүүдө орнотууну түзүңүз

Биринчиден, сиз долбоордун түпкү папкасын түзүү керек: .github/workflows.

Анда файлды белгилеңиз, мисалы, gradle-ci-build.yml төмөнкү мазмун менен:

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

Бул иш процесси бутактарга түртүп жатканда аткарылат master, dev и testing, ошондой эле тартуу сурамдарын түзүүдө.

Жумуштар бөлүмү көрсөтүлгөн окуялар боюнча аткарыла турган кадамдарды көрсөтөт. Бул учурда биз Ubuntuнун эң акыркы версиясын курабыз, Java 8ди колдонобуз, ошондой эле Gradle үчүн плагинди колдонобуз eskatos/gradle-command-action@v1куруучунун акыркы версиясын колдонуп, көрсөтүлгөн буйруктарды аткарат arguments. Өзгөрмөлөр secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD бул биз мурда сураган сырлар.

Куруу натыйжалары "Аракеттер" өтмөгүндө чагылдырылат:

Java долбоорун Sonatype Maven борбордук репозиторийине жарыялоо үчүн Gradle жана Github аракеттерин колдонуу

Жаңы релиз чыкканда автоматтык түрдө жайгаштыруу

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

Файл мурункуга дээрлик окшош, ал ишке киргизиле турган окуядан башкасы. Бул учурда, бул v менен башталган ат менен тег түзүү окуясы.

Жайгаштыруудан мурун, биз сырлардан PGP ачкычын чыгарып, аны долбоордун тамырына жайгаштырышыбыз керек, ошондой эле анын шифрин чечишибиз керек. Андан кийин, биз атайын чөйрө өзгөрмө орнотуу керек RELEASE_VERSION биз кайрылабыз gradle.build файл. Мунун баары бөлүмдө жүргүзүлөт Prepare to publish. Биз ачкычыбызды GPG_KEY_CONTENTS өзгөрмөсүнөн алабыз, аны gpg файлына которуп, анан аны файлга салып шифрден чыгарабыз secret.gpg.

Андан кийин, биз өзгөчө өзгөрмө бурабыз GITHUB_REF, андан биз тегди түзүп жатканда орноткон версияны ала алабыз. Бул өзгөрмө бул учурда тиешелүү. refs/tags/v0.0.2 анын ичинен биз белгилүү бир версияны алуу үчүн биринчи 11 белгини кесип. Андан кийин биз жарыялоо үчүн стандарттуу Gradle буйруктарын колдонобуз: test publish

Sonatype репозиторийинде жайгаштыруу натыйжаларын текшерүү

Чыгаруу түзүлгөндөн кийин, мурунку бөлүмдө сүрөттөлгөн иш процесси башталышы керек. Бул үчүн, релиз түзүңүз:

Java долбоорун Sonatype Maven борбордук репозиторийине жарыялоо үчүн Gradle жана Github аракеттерин колдонуу

тег аты v менен башталышы керек. Эгерде, Жарыялоону басканда, иш процесси ийгиликтүү аяктаса, биз барсак болот Nexus Sonatype ынануу үчүн:

Java долбоорун Sonatype Maven борбордук репозиторийине жарыялоо үчүн Gradle жана Github аракеттерин колдонуу

Артефакт Staging репозиторийинде пайда болду. Ал дароо Ачык абалында пайда болот, андан кийин тиешелүү баскычты басуу менен аны кол менен Жабуу абалына өткөрүү керек. Бардык талаптар аткарылганын текшергенден кийин, артефакт Жабуу абалына өтөт жана мындан ары өзгөртүү үчүн жеткиликтүү эмес. Бул формада ал MavenCentral менен аяктайт. Эгер баары жакшы болсо, баскычты бассаңыз болот чыгаруу, жана артефакт Sonatype репозиторийинде аяктайт.

Артефакт MavenCentralга кирүү үчүн, сиз аны башында биз түзгөн тапшырмада сурашыңыз керек. Муну бир гана жолу жасашыңыз керек, андыктан биз биринчи жолу жарыялап жатабыз. Кийинки убакта бул талап кылынбайт, баары автоматтык түрдө синхрондолот. Алар мен үчүн синхрондоштурууну тез күйгүзүштү, бирок артефакт MavenCentral'да жеткиликтүү болушу үчүн 5 күн керек болду.

Болгону, биз артефактыбызды MavenCentralда жарыяладык.

Пайдалуу шилтемелер

  • Окшош макала, maven аркылуу гана жарыялоо
  • коюлган репозиторий Сонатип
  • Jira Тапшырма түзүлө турган сонатип
  • мисал баары орнотулган репозиторий

Source: www.habr.com