Бұл мақалада мен Gradle құрастырушысының көмегімен Github әрекеттері арқылы Sonatype Maven орталық репозиторийіне Java артефактісін нөлден бастап жариялау процесін егжей-тегжейлі қарастырғым келеді.
Бір жерде қалыпты оқу құралының жоқтығынан осы мақаланы жазуды жөн көрдім. Барлық ақпаратты әртүрлі көздерден бөлшектеп жинау керек болды, сонымен қатар толығымен жаңа емес. Кім ойлайды, мысықтың астына қош келдіңіз.
Sonatype репозиторийін құру
Бірінші қадам - Sonatype Maven Central жүйесінде репозиторий жасау. Ол үшін барамыз , тіркеліп, репозиторий жасауды сұрай отырып, жаңа тапсырма жасаңыз. Біз өзімізде жүреміз GroupId жоба, Жоба URL жоба сілтемесі және SCM url жоба орналасқан нұсқаны басқару жүйесіне сілтеме. GroupId мұнда com.example, com.example.domain, com.example.testsupport пішімінде болуы керек және github-қа сілтеме түрінде де болуы мүмкін: -> 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 тіркелу кезінде жасалған логин мен құпия сөзді қамтитын айнымалылар .
Осылайша финал 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 - Серверге ашық кілтті жариялау пәрмен:
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_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 бұл біз бұрын сұраған құпиялар.
Құрастыру нәтижелері Әрекеттер қойындысында көрсетіледі:

Жаңа шығарылым шыққан кезде автоматты түрде орналастыру
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 репозиторийінде орналастыру нәтижелерін тексеру
Шығарылым жасалғаннан кейін алдыңғы бөлімде сипатталған жұмыс процесі басталуы керек. Ол үшін шығарылым жасаңыз:

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

Артефакт Staging репозиторийінде пайда болды. Ол бірден Ашық күйде пайда болады, содан кейін тиісті түймені басу арқылы оны Жабу күйіне қолмен ауыстыру керек. Барлық талаптардың орындалғанын тексергеннен кейін артефакт Жабу күйіне өтеді және енді өзгерту үшін қолжетімсіз. Бұл пішінде ол MavenCentral-да аяқталады. Егер бәрі жақсы болса, түймені басуға болады босату, және артефакт Sonatype репозиторийінде аяқталады.
Артефакт MavenCentral-ға кіру үшін оны біз ең басында жасаған тапсырмада сұрау керек. Мұны тек бір рет жасау керек, сондықтан біз бірінші рет жариялап отырмыз. Кейінгі уақытта бұл талап етілмейді, бәрі автоматты түрде синхрондалады. Олар мен үшін синхрондауды тез қосты, бірақ артефакт MavenCentral-да қол жетімді болу үшін шамамен 5 күн қажет болды.
Міне, біз MavenCentral-да артефактімізді жарияладық.
Пайдалы сілтемелер
- Ұқсас , тек maven арқылы жариялаңыз
- Кездесу Сонатип
- Тапсырма жасалатын сонатип
- барлығы орнатылған репозиторий
Ақпарат көзі: www.habr.com
