ProHoster > Blog > yönetim > Java Projesini Sonatype Maven Merkez Deposunda Yayınlamak için Gradle ve Github Eylemlerini Kullanma
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
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:
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.
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:
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:
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