በዚህ ጽሁፍ የጃቫን ቅርስ ከባዶ በ Github Actions ወደ Sonatype Maven Central Repository የግራድል ግንበኛን በመጠቀም የማተም ሂደትን በጥልቀት ማየት እፈልጋለሁ።
ይህንን ጽሑፍ ለመጻፍ የወሰንኩት በአንድ ቦታ ላይ መደበኛ ትምህርት ባለመኖሩ ነው። ሁሉም መረጃዎች ከተለያዩ ምንጮች በቁራጭ መሰብሰብ ነበረባቸው፣ በተጨማሪም፣ ሙሉ በሙሉ ትኩስ ሳይሆን። ማን ያስባል ፣ በድመት ስር እንኳን ደህና መጡ።
በ Sonatype ውስጥ ማከማቻ መፍጠር
የመጀመሪያው እርምጃ በ Sonatype Maven Central ውስጥ ማከማቻ መፍጠር ነው። ለዚህ እንሄዳለን
ከተረጋገጠ ከተወሰነ ጊዜ በኋላ የእርስዎ ቡድንአይድ ይፈጠራል እና ወደ ቀጣዩ ደረጃ የግራድል ውቅረት መሄድ እንችላለን።
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
ፋይል. በመጀመሪያ ስለ ገንቢዎች ፣ ፈቃዶች ፣ የስሪት ቁጥጥር ስርዓት ሁሉንም አስፈላጊ መረጃዎች እንጨምር እና እንዲሁም የፕሮጀክቱን ዩአርኤል ፣ ስም እና መግለጫ እናስቀምጣለን። ለዚህ አንድ ቀላል ዘዴ እንፃፍ-
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]'
}
}
}
}
}
በመቀጠል በተፈጠረው ስብሰባ ወቅት ያንን መጥቀስ ያስፈልግዎታል -sources.jar
и-javadoc.jar
ፋይሎች. ለዚህ ክፍል java
የሚከተሉትን ማከል ያስፈልግዎታል:
java {
withJavadocJar()
withSourcesJar()
}
የጂፒጂ/ፒጂፒ ፊርማ በማዘጋጀት ወደ መጨረሻው መስፈርት እንሂድ። ይህንን ለማድረግ, ተሰኪውን ያገናኙ 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 የተጠቃሚ ስም и sonatype የይለፍ ቃል በ ላይ በምዝገባ ወቅት የተፈጠረውን መግቢያ እና የይለፍ ቃል የያዙ ተለዋዋጮች
ስለዚህ የመጨረሻው 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 protected]'
}
}
}
}
}
ስሪቱን የምናገኘው ከአካባቢው ተለዋዋጭ መሆኑን ልብ ማለት እፈልጋለሁ፡- System.getenv('RELEASE_VERSION')
. በሚሰበሰብበት ጊዜ እናጋልጣለን እና ከመለያ ስም እንወስዳለን.
PGP ቁልፍ ማመንጨት
ከሶናታይፕ መስፈርቶች አንዱ ሁሉም ፋይሎች በጂፒጂ/ፒጂፒ ቁልፍ መፈረም ነው። ለዚህ እንሄዳለን
- አንድ ቁልፍ ጥንድ እንፈጥራለን-
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 Actionsን በመጠቀም በራስ-አትም።
Github Actions ሙሉ የሲአይ/ሲዲ ዑደትን በመተግበር የስራ ሂደቱን በራስ ሰር እንዲያደርጉ የሚያስችልዎ ባህሪ ነው። መገንባት፣ መፈተሽ እና ማሰማራት በተለያዩ ክስተቶች ሊቀሰቀስ ይችላል፡ ኮድ መግፋት፣ መልቀቅ መፍጠር ወይም ችግሮች። ይህ ተግባር ለሕዝብ ማከማቻዎች ፍጹም ነፃ ነው።
በዚህ ክፍል ውስጥ እንዴት የግንባታ እና የግፊት ኮድ ማቀናበር እና በሚለቀቅበት ጊዜ ወደ Sonatype ማከማቻ ማሰማራት እንዲሁም ሚስጥሮችን ማቀናበር እንደሚችሉ አሳያችኋለሁ።
ሚስጥሮችን አዘጋጅተናል
ለአውቶማቲክ ማሰባሰብ እና ማሰማራት፣ እንደ ቁልፍ መታወቂያ፣ ቁልፉን ስንፈጥር ያስገቡት የይለፍ ቃል፣ የፒጂፒ ቁልፍ ራሱ እና የሶናታይፕ መግቢያ/ፓስዎርድ ያሉ በርካታ ሚስጥራዊ እሴቶች ያስፈልጉናል። በማጠራቀሚያ ቅንጅቶች ውስጥ በልዩ ክፍል ውስጥ እነሱን ማዋቀር ይችላሉ-
የሚከተሉትን ተለዋዋጮች አዘጋጅተናል።
- SONATYPE_USERNAME / SONATYPE_PASSWORD - በSonatype ስንመዘገብ ያስገቡት መግቢያ/ይለፍ ቃል
- SIGNING_KEYID/SIGNING_PASSWORD — የፒጂፒ ቁልፍ መታወቂያ እና የይለፍ ቃል በሚፈጠርበት ጊዜ ተቀናብሯል።
በጂፒጂ_KEY_CONTENTS ተለዋዋጭ ላይ በበለጠ ዝርዝር መቆየት እፈልጋለሁ። እውነታው ግን ለህትመት የግል PGP ቁልፍ ያስፈልገናል. በምስጢር ውስጥ ለመለጠፍ, ተጠቀምኩ
- ቁልፋችንን በጂፒጂ እናመስጥር፡-
gpg --symmetric --cipher-algo AES256 9B695056.gpg
የይለፍ ቃል በማስገባት. በተለዋዋጭ ውስጥ መቀመጥ አለበት፡ SECRET_PASSPHRASE - የተቀበለውን ኢንክሪፕትድ የተደረገ ቁልፍ ቤዝ64ን በመጠቀም ወደ ጽሁፍ ቅጽ እንተርጉመው፡-
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 ን እንጠቀማለን እና እንዲሁም ተሰኪውን ለግራድል እንጠቀማለን። eskatos/gradle-command-action@v1
የገንቢውን የቅርብ ጊዜውን ስሪት በመጠቀም የተገለጹትን ትዕዛዞችን ያስኬዳል arguments
. ተለዋዋጮች secrets.SONATYPE_USERNAME
и secrets.SONATYPE_PASSWORD
ቀደም ብለን የጠየቅናቸው ምስጢሮች ናቸው።
የግንባታ ውጤቶቹ በድርጊት ትር ውስጥ ይንጸባረቃሉ፡-
አዲስ ልቀት ሲለቀቅ በራስ-አሰማር
ለራስ-ሰር ማሰማራት የተለየ የስራ ፍሰት ፋይል እንፍጠር 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}}
ፋይሉ ከሚቀሰቀስበት ክስተት በስተቀር ከቀዳሚው ጋር ተመሳሳይ ነው ማለት ይቻላል። በዚህ አጋጣሚ ይህ ከቁ የሚጀምር ስም ያለው መለያ የመፍጠር ክስተት ነው።
ከመሰማራታችን በፊት የፒጂፒ ቁልፍን ከምስጢሮች አውጥተን በፕሮጀክቱ ስር ውስጥ ማስቀመጥ እንዲሁም ዲክሪፕት ማድረግ አለብን። በመቀጠል, ልዩ የአካባቢ ተለዋዋጭ ማዘጋጀት አለብን RELEASE_VERSION
የምንጠቅሰው gradle.build
ፋይል. ይህ ሁሉ የሚከናወነው በክፍል ውስጥ ነው Prepare to publish
. ቁልፋችንን ከጂፒጂ_KEY_CONTENTS ተለዋዋጭ አግኝተናል፣ ወደ ጂፒጂ ፋይል እንተረጉማለን፣ ከዚያም ፋይሉን ውስጥ በማስገባት ዲክሪፕት እናደርጋለን secret.gpg
.
በመቀጠል ወደ ልዩ ተለዋዋጭ እንሸጋገራለን GITHUB_REF
መለያውን በሚፈጥሩበት ጊዜ ያዘጋጀነውን ስሪት ከየት ማግኘት እንችላለን። ይህ ተለዋዋጭ በዚህ ጉዳይ ላይ ጠቃሚ ነው. refs/tags/v0.0.2
የተወሰነ ስሪት ለማግኘት የመጀመሪያዎቹን 11 ቁምፊዎች ቆርጠን ነበር. በመቀጠል፣ ለማተም መደበኛውን የGradle ትዕዛዞችን እንጠቀማለን፡- test publish
በSonatype ማከማቻ ውስጥ የማሰማራት ውጤቶችን በመፈተሽ ላይ
መለቀቅ ከተፈጠረ በኋላ, በቀድሞው ክፍል ውስጥ የተገለፀው የስራ ሂደት መጀመር አለበት. ይህንን ለማድረግ ልቀት ይፍጠሩ፡
የመለያው ስም በ v መጀመር አለበት. ልቀትን አትም የሚለውን ጠቅ ካደረግን በኋላ የስራ ሂደቱ በተሳካ ሁኔታ ከተጠናቀቀ ወደዚህ መሄድ እንችላለን
ቅርሱ በ Staging ማከማቻ ውስጥ ታየ። ወዲያውኑ በክፍት ሁኔታ ውስጥ ይታያል, ከዚያም ተገቢውን ቁልፍ በመጫን በእጅ ወደ ዝጋ ሁኔታ መተላለፍ አለበት. ሁሉም መስፈርቶች መሟላታቸውን ካረጋገጡ በኋላ፣ ቅርሱ ወደ ዝጋ ሁኔታ ውስጥ ይገባል እና ለመሻሻያ አይገኝም። በዚህ ቅጽ፣ በ MavenCentral ውስጥ ያበቃል። ሁሉም ነገር ደህና ከሆነ, አዝራሩን መጫን ይችላሉ መልቀቅ፣ እና ቅርሱ በ Sonatype ማከማቻ ውስጥ ያበቃል።
ቅርሱ ወደ MavenCentral እንዲገባ መጀመሪያ ላይ በፈጠርነው ተግባር ውስጥ መጠየቅ አለቦት። ይህን ማድረግ ያለብህ አንድ ጊዜ ብቻ ነው፣ ስለዚህ እኛ ለመጀመሪያ ጊዜ አትመናል። በቀጣዮቹ ጊዜያት, ይህ አያስፈልግም, ሁሉም ነገር በራስ-ሰር ይመሳሰላል. ማመሳሰልን በፍጥነት አበሩልኝ፣ ነገር ግን ቅርሱ በ MavenCentral ውስጥ እስኪገኝ ድረስ 5 ቀናት ያህል ፈጅቷል።
ያ ብቻ ነው፣ የእኛን ቅርስ በ MavenCentral ውስጥ አሳትመናል።
ጠቃሚ አገናኞች
ምንጭ: hab.com