Java Projesini Sonatype Maven Merkez Deposunda Yayınlamak için Gradle ve Github Eylemlerini Kullanma

Bu yazımda Gradle builder kullanarak Github Actions üzerinden bir Java yapıtını sıfırdan Sonatype Maven Central Repository'ye yayınlama sürecine detaylı bir şekilde bakmak istiyorum.

Tek bir yerde normal bir öğretici olmaması nedeniyle bu makaleyi yazmaya karar verdim. Tüm bilgilerin çeşitli kaynaklardan parça parça toplanması gerekiyordu, üstelik tamamen taze değil. Kimin umurunda, cat altında hoş geldiniz.

Sonatype'ta bir depo oluşturma

İlk adım, Sonatype Maven Central'da bir depo oluşturmaktır. bunun için gidiyoruz burada, kaydolun ve yeni bir görev oluşturun, bizden bir havuz oluşturmamızı isteyin. biz araba süreriz Grup kimliği proje, Proje URLsi proje bağlantısı ve SCM url'si projenin bulunduğu sürüm kontrol sistemine bir bağlantı. Grup kimliği com.example, com.example.domain, com.example.testsupport biçiminde olmalıdır ve ayrıca github'unuza bir bağlantı biçiminde olabilir: github.com/kullanıcıadınız -> io.github.kullanıcı adınız. Her durumda, bu alanın veya profilin sahipliğini doğrulamanız gerekecektir. Bir github profili belirlediyseniz, istenen ada sahip bir genel havuz oluşturmanız istenecektir.

Onaydan bir süre sonra GroupId'iniz oluşturulacak ve bir sonraki adım olan Gradle yapılandırmasına geçebiliriz.

Gradle'ı Yapılandırma

Yazma sırasında, eseri yayınlamaya yardımcı olabilecek Gradle eklentileri bulamadım. O Ancak bulduğum tek eklenti, yazar onu daha fazla desteklemeyi reddetti. Bu nedenle, bunu yapmak çok zor olmadığı için her şeyi kendim yapmaya karar verdim.

Çözülmesi gereken ilk şey, Sonatype'ın yayınlama gereksinimleridir. Bunlar şunlardır:

  • Kaynak kodlarının ve JavaDoc'un mevcudiyeti, yani. katılmalı -sources.jar и-javadoc.jar Dosyalar. Dokümantasyonda belirtildiği gibi, kaynak kodları veya dokümantasyon sağlamak mümkün değilse, bir kukla yapabilirsiniz. -sources.jar veya -javadoc.jar testi geçmek için içinde basit bir BENİOKU ile.
  • Tüm dosyalar ile imzalanmalıdır GPG/PGPve .asc imzayı içeren dosya her dosya için dahil edilmelidir.
  • kullanılabilirlik pom dosya
  • Doğru değerler groupId, artifactId и version. Sürüm keyfi bir dize olabilir ve ile bitemez -SNAPSHOT
  • Varlık gerekli name, description и url
  • Lisans, geliştiriciler ve sürüm kontrol sistemi hakkında bilgilerin varlığı

Bunlar yayınlanırken uyulması gereken temel kurallardır. Tam bilgi mevcut burada.

Bu gereklilikleri uyguluyoruz build.gradle dosya. Öncelikle, geliştiriciler, lisanslar, sürüm kontrol sistemi hakkında gerekli tüm bilgileri ekleyelim ve ayrıca projenin url'sini, adını ve açıklamasını ayarlayalım. Bunun için basit bir metod yazalım:

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

Ardından, oluşturulan derleme sırasında bunu belirtmeniz gerekir. -sources.jar и-javadoc.jar Dosyalar. Bu bölüm için java aşağıdakileri eklemeniz gerekir:

java {
    withJavadocJar()
    withSourcesJar()
}

Bir GPG/PGP imzası ayarlayarak son gereksinime geçelim. Bunu yapmak için eklentiyi bağlayın signing:

plugins {
    id 'signing'
}

Ve bir bölüm ekleyin:

signing {
    sign publishing.publications
}

Son olarak bir bölüm ekleyelim. 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
            }
        }
    }
}

öyle sonatypeKullanıcı adı и sonatypeŞifre kayıt sırasında oluşturulan kullanıcı adı ve şifreyi içeren değişkenler sonatype.org.

Böylece final build.gradle şöyle görünecek:

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

Sürümü ortam değişkeninden aldığımızı belirtmek isterim: System.getenv('RELEASE_VERSION'). Montaj sırasında onu açığa çıkaracağız ve etiket adından alacağız.

PGP anahtarı oluşturma

Sonatype'ın gereksinimlerinden biri, tüm dosyaların bir GPG/PGP anahtarıyla imzalanması gerektiğidir. bunun için gidiyoruz burada ve işletim sisteminiz için GnuPG yardımcı programını indirin.

  • Bir anahtar çifti oluşturuyoruz: gpg --gen-key, bir kullanıcı adı, e-posta girin ve ayrıca bir şifre belirleyin.
  • Farkına varmak id komutumuzla anahtarımız: gpg --list-secret-keys --keyid-format short. Kimlik eğik çizgiden sonra belirtilecektir, örneğin: rsa2048/9B695056
  • Genel anahtarı sunucuya yayınlama https://keys.openpgp.org komutla: gpg --keyserver [https://keys.openpgp.org](https://keys.openpgp.org/) --send-keys 9B695056
  • Gizli anahtarı keyfi bir yere aktarıyoruz, gelecekte ona ihtiyacımız olacak: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg

Github Eylemlerini Ayarlama

Son aşamaya geçelim, derlemeyi ayarlayalım ve Github Actions kullanarak otomatik yayınlayalım.
Github Actions, tam bir CI / CD döngüsü uygulayarak iş akışını otomatikleştirmenize olanak tanıyan bir özelliktir. Oluşturma, test etme ve dağıtma çeşitli olaylar tarafından tetiklenebilir: kod gönderme, sürüm oluşturma veya sorunlar. Bu işlevsellik, genel depolar için tamamen ücretsizdir.

Bu bölümde, derleme ve gönderme kodunun nasıl kurulacağını ve piyasaya sürüldüğünde Sonatype deposuna nasıl konuşlandırılacağını ve gizli dizileri nasıl ayarlayacağınızı göstereceğim.

sırlar koyduk

Otomatik derleme ve devreye alma için, anahtar kimliği, anahtarı oluştururken girdiğimiz parola, PGP anahtarının kendisi ve Sonatype kullanıcı adı/şifresi gibi bir dizi gizli değere ihtiyacımız var. Bunları depo ayarlarında özel bir bölümde ayarlayabilirsiniz:

Java Projesini Sonatype Maven Merkez Deposunda Yayınlamak için Gradle ve Github Eylemlerini Kullanma

Aşağıdaki değişkenleri ayarladık:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - Sonatype'a kaydolurken girdiğimiz kullanıcı adı / şifre
  • SIGNING_KEYID/SIGNING_PASSWORD — Üretim sırasında belirlenen PGP anahtar kimliği ve parolası.

GPG_KEY_CONTENTS değişkeni üzerinde daha detaylı durmak istiyorum. Gerçek şu ki, yayınlamak için özel bir PGP anahtarına ihtiyacımız var. Sırlara göndermek için kullandım talimatlar ve ek olarak bir dizi eylemde bulundu.

  • Anahtarımızı gpg ile şifreleyelim: gpg --symmetric --cipher-algo AES256 9B695056.gpgbir şifre girerek. Bir değişkene yerleştirilmelidir: SECRET_PASSPHRASE
  • Alınan şifreli anahtarı base64 kullanarak bir metin formuna çevirelim: base64 9B695056.gpg.gpg > 9B695056.txt. İçerik şu değişkene yerleştirilecek: GPG_KEY_CONTENTS.

Kod gönderirken ve PR oluştururken kurulum oluşturun

Öncelikle projenizin kökünde bir klasör oluşturmanız gerekir: .github/workflows.

İçinde, dosyayı işaretleyin, örneğin, gradle-ci-build.yml aşağıdaki içerikle:

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ş akışı, şubelere gönderilirken yürütülecek master, dev и testing, ayrıca çekme istekleri oluştururken.

İşler bölümü, belirtilen olaylarda yürütülecek adımları belirtir. Bu durumda, ubuntu'nun en son sürümü üzerine inşa edeceğiz, Java 8 kullanacağız ve ayrıca Gradle eklentisini kullanacağız. eskatos/gradle-command-action@v1oluşturucunun en son sürümünü kullanan, belirtilen komutları çalıştıracak arguments. Değişkenler secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD bunlar daha önce sorduğumuz sırlar.

Derleme sonuçları, Eylemler sekmesine yansıtılacaktır:

Java Projesini Sonatype Maven Merkez Deposunda Yayınlamak için Gradle ve Github Eylemlerini Kullanma

Yeni bir sürüm yayınlandığında otomatik dağıtım

Otomatik dağıtım için ayrı bir iş akışı dosyası oluşturalım 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}}

Dosya, tetikleneceği olay dışında bir öncekiyle neredeyse aynıdır. Bu durumda, v ile başlayan bir ada sahip bir etiket oluşturma olayıdır.

Dağıtımdan önce, sırlardan PGP anahtarını çıkarmamız ve onu projenin kök dizinine yerleştirmemiz ve şifresini çözmemiz gerekiyor. Ardından, özel bir ortam değişkeni ayarlamamız gerekiyor. RELEASE_VERSION hangisinden bahsediyoruz gradle.build dosya. Bütün bunlar bölümde yapılır Prepare to publish. Anahtarımızı GPG_KEY_CONTENTS değişkeninden alıp bir gpg dosyasına çeviriyoruz ve ardından dosyanın içine koyarak şifresini çözüyoruz. secret.gpg.

Ardından, özel bir değişkene dönüyoruz GITHUB_REF, etiketi oluştururken ayarladığımız sürümü buradan alabiliriz. Bu değişken bu durumda geçerlidir. refs/tags/v0.0.2 belirli bir sürüm elde etmek için ilk 11 karakteri kestik. Ardından, yayınlamak için standart Gradle komutlarını kullanıyoruz: test publish

Dağıtım sonuçlarının Sonatype deposunda kontrol edilmesi

Sürüm oluşturulduktan sonra, önceki bölümde açıklanan iş akışı başlamalıdır. Bunu yapmak için bir sürüm oluşturun:

Java Projesini Sonatype Maven Merkez Deposunda Yayınlamak için Gradle ve Github Eylemlerini Kullanma

etiket adı v ile başlamalıdır. Yayınla'ya tıkladıktan sonra iş akışı başarıyla tamamlandıysa, şuraya geçebiliriz: Sonatip Nexus emin olmak:

Java Projesini Sonatype Maven Merkez Deposunda Yayınlamak için Gradle ve Github Eylemlerini Kullanma

Yapı, Hazırlama deposunda göründü. Hemen Açık durumunda görünür, ardından uygun düğmeye basarak manuel olarak Kapat durumuna aktarılması gerekir. Tüm gereksinimlerin karşılandığını kontrol ettikten sonra yapı, Kapat durumuna geçer ve artık değiştirilemez. Bu formda, MavenCentral'da sona erecektir. Her şey yolundaysa, düğmeye basabilirsiniz Bırakın, ve eser Sonatype deposunda sona erecektir.

Eserin MavenCentral'a girmesi için en başta oluşturduğumuz görevde istemeniz gerekiyor. Bunu sadece bir kez yapmanız gerekiyor, bu yüzden ilk kez yayınlıyoruz. Sonraki zamanlarda bu gerekli değildir, her şey otomatik olarak senkronize edilecektir. Senkronizasyonu benim için hızlı bir şekilde açtılar, ancak yapının MavenCentral'da kullanılabilir hale gelmesi yaklaşık 5 gün sürdü.

Hepsi bu kadar, eserimizi MavenCentral'da yayınladık.

Faydalı linkler

  • benzer bir makale, yalnızca maven aracılığıyla yayınla
  • Sahneleme havuz Sonatip
  • Jira Görevin oluşturulacağı sonatip
  • Örnek her şeyin ayarlandığı depo

Kaynak: habr.com