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

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

Бір жерде қалыпты оқу құралының жоқтығынан осы мақаланы жазуды жөн көрдім. Барлық ақпаратты әртүрлі көздерден бөлшектеп жинау керек болды, сонымен қатар толығымен жаңа емес. Кім ойлайды, мысықтың астына қош келдіңіз.

Sonatype репозиторийін құру

Бірінші қадам - ​​Sonatype Maven Central жүйесінде репозиторий жасау. Ол үшін барамыз осында, тіркеліп, репозиторий жасауды сұрай отырып, жаңа тапсырма жасаңыз. Біз өзімізде жүреміз GroupId жоба, Жоба URL жоба сілтемесі және SCM url жоба орналасқан нұсқаны басқару жүйесіне сілтеме. GroupId мұнда com.example, com.example.domain, com.example.testsupport пішімінде болуы керек және github-қа сілтеме түрінде де болуы мүмкін: github.com/yurusername -> io.github.сіздің логин. Кез келген жағдайда сізге осы доменнің немесе профильдің иелігін растау қажет болады. Егер сіз 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@dev.ru'
                }
            }
        }
    }
}

Әрі қарай, құрастыру кезінде оны көрсету керек -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
            }
        }
    }
}

Бұл sonatype пайдаланушы аты и 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@dev.ru'
                }
            }
        }
    }
}

Нұсқаны орта айнымалысынан алатынымызды атап өткім келеді: 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 әрекеттері арқылы автоматты түрде жариялаймыз.
Github Actions - бұл толық CI / CD циклін енгізу арқылы жұмыс процесін автоматтандыруға мүмкіндік беретін мүмкіндік. Құрастыру, сынақтан өткізу және орналастыру әртүрлі оқиғалар арқылы іске қосылуы мүмкін: кодты басу, шығаруды жасау немесе мәселелер. Бұл функция жалпыға ортақ репозиторийлер үшін мүлдем тегін.

Бұл бөлімде мен сізге құрастыру мен итермелеу кодын және шығарылған кезде Sonatype репозиторийіне орналастыруды, сондай-ақ құпияларды орнату жолын көрсетемін.

Біз құпияларды орнаттық

Автоматты түрде құрастыру және орналастыру үшін бізге кілт идентификаторы, кілтті жасау кезінде енгізген құпия сөз, PGP кілтінің өзі және Sonatype логин/құпия сөз сияқты бірқатар құпия мәндер қажет. Оларды репозитарий параметрлеріндегі арнайы бөлімде орнатуға болады:

Sonatype Maven орталық репозиторийіне Java жобасын жариялау үшін 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 бұл біз бұрын сұраған құпиялар.

Құрастыру нәтижелері Әрекеттер қойындысында көрсетіледі:

Sonatype Maven орталық репозиторийіне Java жобасын жариялау үшін 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 репозиторийінде орналастыру нәтижелерін тексеру

Шығарылым жасалғаннан кейін алдыңғы бөлімде сипатталған жұмыс процесі басталуы керек. Ол үшін шығарылым жасаңыз:

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

тег атауы v әрпінен басталуы керек. Егер «Жариялау шығарылымы» түймесін басқаннан кейін жұмыс процесі сәтті аяқталса, біз баруға болады Sonatype Nexus көз жеткізу үшін:

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

Артефакт Staging репозиторийінде пайда болды. Ол бірден Ашық күйде пайда болады, содан кейін тиісті түймені басу арқылы оны Жабу күйіне қолмен ауыстыру керек. Барлық талаптардың орындалғанын тексергеннен кейін артефакт Жабу күйіне өтеді және енді өзгерту үшін қолжетімсіз. Бұл пішінде ол MavenCentral-да аяқталады. Егер бәрі жақсы болса, түймені басуға болады босату, және артефакт Sonatype репозиторийінде аяқталады.

Артефакт MavenCentral-ға кіру үшін оны біз ең басында жасаған тапсырмада сұрау керек. Мұны тек бір рет жасау керек, сондықтан біз бірінші рет жариялап отырмыз. Кейінгі уақытта бұл талап етілмейді, бәрі автоматты түрде синхрондалады. Олар мен үшін синхрондауды тез қосты, бірақ артефакт MavenCentral-да қол жетімді болу үшін шамамен 5 күн қажет болды.

Міне, біз MavenCentral-да артефактімізді жарияладық.

Пайдалы сілтемелер

Ақпарат көзі: www.habr.com