Java layihəsini Sonatype Maven Mərkəzi Anbarında dərc etmək üçün Gradle və Github əməliyyatlarından istifadə

Bu yazıda mən Gradle qurucusundan istifadə edərək Github Actions vasitəsilə Sonatype Maven Mərkəzi Repozitoriyasına Java artefaktının sıfırdan dərc edilməsi prosesinə daha yaxından baxmaq istəyirəm.

Bir yerdə normal dərslik olmadığı üçün bu yazını yazmağa qərar verdim. Bütün məlumatlar müxtəlif mənbələrdən hissə-hissə toplanmalı idi, üstəlik, tamamilə təzə deyildi. Kimin qayğısına qalır, pişik altında xoş gəlmisiniz.

Sonatype-də repozitoriyanın yaradılması

İlk addım Sonatype Maven Central-da repozitoriya yaratmaqdır. Bunun üçün gedirik burada, qeydiyyatdan keçin və depo yaratmağımızı xahiş edərək yeni tapşırıq yaradın. Biz özümüzdə sürürük GroupId layihə, Layihənin URL layihə bağlantısı və SCM url layihənin yerləşdiyi versiyaya nəzarət sisteminə keçid. GroupId burada com.example, com.example.domain, com.example.testsupport şəklində olmalıdır və həmçinin github-a keçid şəklində də ola bilər: github.com/username -> io.github.user adınız. İstənilən halda, siz bu domenin və ya profilin sahibliyini yoxlamalı olacaqsınız. Əgər siz github profilini göstərmisinizsə, sizdən istədiyiniz adla ictimai repozitoriya yaratmağınız xahiş olunacaq.

Təsdiqdən bir müddət sonra GroupId-iniz yaradılacaq və biz növbəti mərhələyə, Gradle konfiqurasiyasına keçə bilərik.

Gradle konfiqurasiyası

Yazı zamanı mən artefaktı dərc etməyə kömək edə biləcək Gradle plaginlərini tapmadım. O tapdığım yeganə plagin, lakin müəllif onu daha da dəstəkləməkdən imtina etdi. Buna görə də hər şeyi özüm etmək qərarına gəldim, çünki bunu etmək çox da çətin deyil.

Anlamaq lazım olan ilk şey Sonatype-ın nəşr üçün tələbləridir. Onlar aşağıdakılardır:

  • Mənbə kodlarının və JavaDoc-un mövcudluğu, yəni. iştirak etməlidir -sources.jar и-javadoc.jar fayllar. Sənədlərdə qeyd edildiyi kimi, mənbə kodları və ya sənədləri təqdim etmək mümkün deyilsə, siz dummy edə bilərsiniz. -sources.jar və ya -javadoc.jar testdən keçmək üçün içərisində sadə README ilə.
  • Bütün fayllar ilə imzalanmalıdır GPG/PGP.asc imzanı ehtiva edən fayl hər bir fayl üçün daxil edilməlidir.
  • mövcudluğu pom fayl
  • Düzgün dəyərlər groupId, artifactId и version. Versiya ixtiyari sətir ola bilər və bununla bitə bilməz -SNAPSHOT
  • Mövcudluq tələb olunur name, description и url
  • Lisenziya, tərtibatçılar və versiyaya nəzarət sistemi haqqında məlumatın olması

Bunlar nəşr edərkən əməl edilməli olan əsas qaydalardır. Tam məlumat mövcuddur burada.

Biz bu tələbləri həyata keçiririk build.gradle fayl. Əvvəlcə tərtibatçılar, lisenziyalar, versiyaya nəzarət sistemi haqqında bütün lazımi məlumatları əlavə edək, həmçinin layihənin url-ni, adını və təsvirini təyin edək. Bunun üçün sadə bir üsul yazaq:

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

Sonra, yaradılan montaj zamanı müəyyən etməlisiniz -sources.jar и-javadoc.jar fayllar. Bu bölmə üçün java aşağıdakıları əlavə etməlisiniz:

java {
    withJavadocJar()
    withSourcesJar()
}

GPG/PGP imzasını quraraq son tələbə keçək. Bunu etmək üçün plagini birləşdirin signing:

plugins {
    id 'signing'
}

Və bir bölmə əlavə edin:

signing {
    sign publishing.publications
}

Nəhayət, bir bölmə əlavə edək 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
            }
        }
    }
}

Burada sonatypeİstifadəçi adı и sonatypeŞifrə qeydiyyat zamanı yaradılan loqin və şifrəni ehtiva edən dəyişənlər sonatype.org.

Beləliklə final build.gradle belə görünəcək:

Tam build.gradle kodu

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

Qeyd etmək istəyirəm ki, versiyanı mühit dəyişənindən alırıq: System.getenv('RELEASE_VERSION'). Biz onu montaj zamanı ifşa edəcəyik və etiket adından götürəcəyik.

PGP açar generasiyası

Sonatype tələblərindən biri bütün faylların GPG/PGP açarı ilə imzalanmasıdır. Bunun üçün gedirik burada və əməliyyat sisteminiz üçün GnuPG yardım proqramını yükləyin.

  • Bir açar cütü yaradırıq: gpg --gen-key, istifadəçi adı, e-mail daxil edin və həmçinin parol təyin edin.
  • Biz tapırıq id əmrlə açarımız: gpg --list-secret-keys --keyid-format short. İd kəsik işarəsindən sonra müəyyən ediləcək, məsələn: rsa2048/9B695056
  • Açıq açarın serverə dərc edilməsi https://keys.openpgp.org əmri ilə: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Gizli açarı ixtiyari bir yerə ixrac edirik, gələcəkdə ona ehtiyacımız olacaq: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Github Fəaliyyətlərinin qurulması

Gəlin son mərhələyə keçək, quruluşu quraq və Github Actions-dan istifadə edərək avtomatik dərc edək.
Github Actions tam CI / CD dövrü həyata keçirməklə iş axınını avtomatlaşdırmağa imkan verən bir xüsusiyyətdir. Yaratma, sınaqdan keçirmə və yerləşdirmə müxtəlif hadisələrlə baş verə bilər: kod təkan, buraxılış yaradılması və ya problemlər. Bu funksionallıq ictimai depolar üçün tamamilə pulsuzdur.

Bu bölmədə mən sizə kod qurmağı və təkan verməyi və buraxılış zamanı Sonatype repozitoriyasına yerləşdirməyi, həmçinin sirləri necə qurmağı göstərəcəyəm.

Biz sirləri qoyduq

Avtomatik yığma və yerləşdirmə üçün bizə açar identifikatoru, açarı yaradan zaman daxil etdiyimiz parol, PGP açarının özü və Sonatype giriş/parol kimi bir sıra gizli dəyərlər lazımdır. Onları depo parametrlərində xüsusi bölmədə təyin edə bilərsiniz:

Java layihəsini Sonatype Maven Mərkəzi Anbarında dərc etmək üçün Gradle və Github əməliyyatlarından istifadə

Aşağıdakı dəyişənləri təyin edirik:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - Sonatype ilə qeydiyyatdan keçərkən daxil etdiyimiz giriş / parol
  • SIGNING_KEYID/SIGNING_PASSWORD — generasiya zamanı təyin edilmiş PGP açar identifikatoru və parol.

Mən daha ətraflı GPG_KEY_CONTENTS dəyişəni üzərində dayanmaq istəyirəm. Fakt budur ki, dərc üçün bizə şəxsi PGP açarı lazımdır. Bunu sirrlərə yerləşdirmək üçün istifadə etdim təlimat və əlavə olaraq bir sıra tədbirlər həyata keçirmişdir.

  • Açarımızı gpg ilə şifrələyək: gpg --symmetric --cipher-algo AES256 9B695056.gpgparol daxil etməklə. O, dəyişəndə ​​yerləşdirilməlidir: SECRET_PASSPHRASE
  • Gəlin alınan şifrələnmiş açarı base64 istifadə edərək mətn formasına çevirək: base64 9B695056.gpg.gpg > 9B695056.txt. Məzmun dəyişəndə ​​yerləşdiriləcək: GPG_KEY_CONTENTS.

Kodu itələyərkən və PR yaratarkən quraşdırma qurun

Əvvəlcə layihənizin kökündə bir qovluq yaratmalısınız: .github/workflows.

Orada faylı qeyd edin, məsələn, gradle-ci-build.yml aşağıdakı məzmunla:

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

Bu iş axını filiallara itələyərkən yerinə yetiriləcək master, dev и testing, həmçinin çəkmə sorğuları yaratarkən.

İşlər bölməsində göstərilən hadisələrə əsasən yerinə yetirilməli olan addımlar göstərilir. Bu halda, biz ən son versiya üzərində qurulacağıq. ubuntu, Java 8-dən istifadə edin və həmçinin Gradle plaginindən istifadə edin eskatos/gradle-command-action@v1qurucusunun ən son versiyasından istifadə edərək, göstərilən əmrləri yerinə yetirəcək arguments. Dəyişənlər secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD bunlar əvvəllər soruşduğumuz sirlərdir.

Quraşdırma nəticələri Fəaliyyətlər tabında əks olunacaq:

Java layihəsini Sonatype Maven Mərkəzi Anbarında dərc etmək üçün Gradle və Github əməliyyatlarından istifadə

Yeni buraxılış çıxanda avtomatik yerləşdirmə

Autodeploy üçün ayrıca iş prosesi faylı yaradaq 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}}

Fayl işə salınacağı hadisə istisna olmaqla, əvvəlki ilə demək olar ki, eynidir. Bu halda, bu, v ilə başlayan adla teq yaratma hadisəsidir.

Yerləşdirmədən əvvəl PGP açarını sirlərdən çıxarıb layihənin kökünə yerləşdirməli, həmçinin şifrəsini açmalıyıq. Sonra, xüsusi mühit dəyişənini təyin etməliyik RELEASE_VERSION istinad etdiyimiz gradle.build fayl. Bütün bunlar bölmədə edilir Prepare to publish. Biz açarımızı GPG_KEY_CONTENTS dəyişənindən alırıq, onu gpg faylına tərcümə edirik, sonra fayla yerləşdirməklə şifrəsini açırıq. secret.gpg.

Sonra, xüsusi bir dəyişənə müraciət edirik GITHUB_REF, buradan etiket yaratarkən təyin etdiyimiz versiyanı əldə edə bilərik. Bu dəyişən bu vəziyyətdə aktualdır. refs/tags/v0.0.2 konkret versiyanı əldə etmək üçün ilk 11 simvolu kəsdik. Sonra, dərc etmək üçün standart Gradle əmrlərindən istifadə edirik: test publish

Sonatype deposunda yerləşdirmə nəticələrinin yoxlanılması

Buraxılış yaradıldıqdan sonra əvvəlki bölmədə təsvir olunan iş prosesi başlamalıdır. Bunu etmək üçün bir buraxılış yaradın:

Java layihəsini Sonatype Maven Mərkəzi Anbarında dərc etmək üçün Gradle və Github əməliyyatlarından istifadə

teq adı v hərfi ilə başlamalıdır. Nəşr et düyməsini kliklədikdən sonra iş prosesi uğurla başa çatarsa, gedə bilərik Sonatype Nexus əmin olmaq üçün:

Java layihəsini Sonatype Maven Mərkəzi Anbarında dərc etmək üçün Gradle və Github əməliyyatlarından istifadə

Artefakt Staging deposunda göründü. Dərhal Açıq statusunda görünür, sonra müvafiq düyməni basaraq əl ilə Bağlama vəziyyətinə keçirilməlidir. Bütün tələblərin yerinə yetirildiyini yoxladıqdan sonra artefakt Bağlama vəziyyətinə keçir və artıq dəyişiklik üçün əlçatan deyil. Bu formada MavenCentral-da sona çatacaq. Hər şey qaydasındadırsa, düyməni basa bilərsiniz Buraxın, və artefakt Sonatype deposunda bitəcək.

Artefaktın MavenCentral-a daxil olması üçün onu başlanğıcda yaratdığımız tapşırıqda soruşmaq lazımdır. Bunu yalnız bir dəfə etməlisiniz, ona görə də ilk dəfə dərc edirik. Sonrakı dövrlərdə bu tələb olunmur, hər şey avtomatik olaraq sinxronlaşdırılacaq. Tez mənim üçün sinxronizasiyanı işə saldılar, lakin artefaktın MavenCentral-da mövcud olması təxminən 5 gün çəkdi.

Hamısı budur, artefaktımızı MavenCentral-da dərc etdik.

Faydalı linklər

  • Oxşar məqalə, yalnız maven vasitəsilə dərc edin
  • Staging anbar Sonatip
  • Jira Tapşırığın yaradılacağı sonatip
  • Misal hamısının qurulduğu depo

Mənbə: www.habr.com

DDoS mühafizəsi, VPS VDS serverləri olan saytlar üçün etibarlı hostinq alın 🔥 DDoS qorunması, VPS VDS serverləri ilə etibarlı veb sayt hostinqi alın | ProHoster