پرو هوسٽر > بلاگ > انتظاميه > جاوا پروجيڪٽ کي شايع ڪرڻ لاءِ Gradle ۽ Github ڪارناما استعمال ڪندي سون ٽائپ ماون مرڪزي مخزن کي
جاوا پروجيڪٽ کي شايع ڪرڻ لاءِ Gradle ۽ Github ڪارناما استعمال ڪندي سون ٽائپ ماون مرڪزي مخزن کي
هن آرٽيڪل ۾، مان گرڊ بلڊر کي استعمال ڪندي گٿب ايڪشن ذريعي سونا ٽائپ ماون سينٽرل ريپوزٽري تائين شروع کان جاوا آرٽيڪل شايع ڪرڻ جي عمل تي هڪ ويجھو نظر رکڻ چاهيان ٿو.
مون هڪ جاءِ تي عام سبق نه هجڻ جي ڪري هي مضمون لکڻ جو فيصلو ڪيو. سموري معلومات مختلف ذريعن کان ٽڪرا ٽڪرا گڏ ڪرڻي هئي، ان کان علاوه، مڪمل طور تي تازو نه. ڪير پرواهه ڪري، ٻلي هيٺ ڀليڪار.
سوناتائپ ۾ هڪ مخزن ٺاهڻ
پهريون قدم Sonatype Maven سينٽرل ۾ هڪ مخزن ٺاهڻ آهي. ان لاءِ اسين وڃون ٿا هتي, رجسٽر ٿيو ۽ نئون ڪم ٺاهيو، اسان کي مخزن ٺاهڻ لاءِ چيو. اسان پنهنجي گاڏي ۾ گروپ آئي ڊي پروجيڪٽ، پروجيڪٽ URL پروجيڪٽ لنڪ ۽ SCM url ورجن ڪنٽرول سسٽم جو هڪ لنڪ جنهن ۾ پروجيڪٽ واقع آهي. گروپ آئي ڊي هتي فارم جو هجڻ گهرجي com.example, com.example.domain, com.example.testsupport، ۽ پڻ ٿي سگهي ٿو توهان جي github جي لنڪ جي صورت ۾: github.com/yourusername -> io.github.yourusername. ڪنهن به صورت ۾، توهان کي هن ڊومين يا پروفائل جي ملڪيت جي تصديق ڪرڻ جي ضرورت پوندي. جيڪڏهن توهان هڪ github پروفائل بيان ڪيو آهي، توهان کي گهربل نالو سان عوامي مخزن ٺاهڻ لاء چيو ويندو.
ڪجهه وقت جي تصديق کان پوء، توهان جي GroupId ٺاهي ويندي ۽ اسان اڳتي وڌو ٿا اڳتي وڌو قدم، Gradle ترتيب.
Gradle ترتيب ڏيڻ
لکڻ جي وقت تي، مون کي Gradle پلگ ان نه مليا جيڪي آرٽيڪل شايع ڪرڻ ۾ مدد ڪري سگھن ٿيون. هن صرف پلگ ان جيڪو مون کي مليو، جڏهن ته، ليکڪ ان کي وڌيڪ سپورٽ ڪرڻ کان انڪار ڪيو. تنهن ڪري، مون پنهنجو پاڻ کي هر شي ڪرڻ جو فيصلو ڪيو، ڇو ته اهو ڪرڻ ڏکيو ناهي.
معلوم ڪرڻ لاءِ پهرين شيءِ آهي سوناتائپ جي پبلشنگ جي گهرج. اهي هيٺيان آهن:
سڀئي فائلون سائن ان ٿيڻ گهرجن 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 protected]'
}
}
}
}
}
اڳيون، توهان کي بيان ڪرڻ جي ضرورت آهي ته ٺهرايل اسيمبليء دوران -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 استعمال ڪندڙ جو نالو и sonatype پاسورڊ variables جنهن ۾ لاگ ان ۽ پاسورڊ شامل آهن رجسٽريشن دوران ٺاهي وئي sonatype.org.
اهڙيء طرح فائنل 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 اهم نسل
Sonatype جي ضرورتن مان هڪ آهي ته سڀئي فائلون هڪ GPG/PGP ڪيئي سان سائن ان ٿين. ان لاءِ اسين وڃون ٿا هتي ۽ توهان جي آپريٽنگ سسٽم لاءِ GnuPG يوٽيلٽي ڊائون لوڊ ڪريو.
اسان هڪ اهم جوڙو ٺاهي: gpg --gen-key، يوزرنيم داخل ڪريو، اي ميل، ۽ پڻ پاسورڊ سيٽ ڪريو.
اسان کي معلوم ٿئي ٿو id حڪم سان اسان جي ڪنجي: gpg --list-secret-keys --keyid-format short. Id بيان ڪيو ويندو سليش کان پوء، مثال طور: rsa2048/9B695056
اسان ڳجهي چاٻي کي هڪ خودمختيار جڳهه تي برآمد ڪريون ٿا، اسان کي مستقبل ۾ ان جي ضرورت پوندي: gpg --export-secret-key 9B695056 > D:\gpg\9B695056.gpg
Github عملن کي ترتيب ڏيڻ
اچو ته آخري اسٽيج تي وڃو، ٺاھ ٺاھيو ۽ Github عمل استعمال ڪندي خودڪار شايع ڪريو.
Github Actions هڪ خاصيت آهي جيڪا توهان کي مڪمل CI / CD چڪر کي لاڳو ڪندي ڪم فلو کي خودڪار ڪرڻ جي اجازت ڏئي ٿي. تعمير، ٽيسٽ، ۽ ترتيب ڏيڻ مختلف واقعن جي ڪري ٿي سگھي ٿو: ڪوڊ پش، ڇڏڻ جي تخليق، يا مسئلا. هي فنڪشنلٽي عوامي ذخيرن لاءِ بلڪل مفت آهي.
هن حصي ۾، مان توهان کي ڏيکاريندس ته ڪيئن ٺاهجي ۽ پش ڪوڊ قائم ڪجي ۽ سونيٽائپ ريپوزٽري تي رليز ڪرڻ تي، ۽ گڏوگڏ رازن کي ترتيب ڏيو.
اسان راز قائم ڪيو
خودڪار اسمبلي ۽ ڊيپلائيمينٽ لاءِ، اسان کي ڪيترن ئي ڳجهن قدرن جي ضرورت آھي، جھڙوڪ ڪي id، پاس ورڊ جيڪو اسان داخل ڪيو آھي جڏھن چاٻي ٺاھڻ وقت، PGP ڪيئي پاڻ، ۽ سوناٽائپ لاگ ان/پاسورڊ. توھان انھن کي سيٽ ڪري سگھو ٿا خاص سيڪشن ۾ مخزن جي سيٽنگن ۾:
اسان هيٺ ڏنل متغير مقرر ڪيو:
SONATYPE_USERNAME / SONATYPE_PASSWORD - لاگ ان / پاسورڊ جيڪو اسان داخل ڪيو آھي جڏھن سون ٽائپ سان رجسٽر ٿيو
SIGNING_KEYID/SIGNING_PASSWORD — پي جي پي ڪيئي آئي ڊي ۽ پاسورڊ نسل جي دوران سيٽ ڪيو ويو.
مان وڌيڪ تفصيل سان GPG_KEY_CONTENTS متغير تي رهڻ چاهيان ٿو. حقيقت اها آهي ته اشاعت لاء اسان کي هڪ خانگي PGP جي ضرورت آهي. رازن ۾ پوسٽ ڪرڻ لاء، مون استعمال ڪيو هدايت ۽ ان کان علاوه ڪيترائي ڪارناما ڪيا.
اچو ته اسان جي ڪنجي کي gpg سان انڪرپٽ ڪريون: gpg --symmetric --cipher-algo AES256 9B695056.gpgپاسورڊ داخل ڪندي. ان کي متغير ۾ رکڻ گهرجي: SECRET_PASSPHRASE
اچو ته ترجما ڪريون موصول ٿيل اينڪرپٽ ڪيل ڪي کي متن جي فارم ۾ base64 استعمال ڪندي: base64 9B695056.gpg.gpg > 9B695056.txt. مواد کي متغير ۾ رکيو ويندو: GPG_KEY_CONTENTS.
سيٽ اپ ٺاهيو جڏهن ڪوڊ کي ڌڪايو ۽ پي آر ٺاهي
پهرين توهان کي پنهنجي منصوبي جي روٽ ۾ هڪ فولڊر ٺاهڻ جي ضرورت آهي: .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 جي جديد ورزن تي تعمير ڪنداسين، جاوا 8 استعمال ڪريو، ۽ پڻ استعمال ڪريو پلگ ان لاء Gradle eskatos/gradle-command-action@v1جيڪو، بلڊر جي جديد ورزن کي استعمال ڪندي، بيان ڪيل حڪمن کي هلائيندو arguments. متغير secrets.SONATYPE_USERNAME и secrets.SONATYPE_PASSWORD اهي راز آهن جيڪي اسان اڳ ۾ پڇيو.
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}}
فائل لڳ ڀڳ هڪجهڙائي آهي پوئين هڪ جي، سواءِ ان واقعي جي جنهن ۾ ان کي شروع ڪيو ويندو. انهي صورت ۾، اهو هڪ ٽيگ ٺاهڻ جو واقعو آهي جنهن جي نالي سان شروع ٿيندڙ وي.
لڳائڻ کان اڳ، اسان کي رازن مان PGP چيڪ ڪڍڻو پوندو ۽ ان کي پروجيڪٽ جي روٽ ۾ رکڻو پوندو، ان سان گڏ ان کي ڊڪرپٽ ڪرڻ. اڳيون، اسان کي هڪ خاص ماحول متغير مقرر ڪرڻ جي ضرورت آهي RELEASE_VERSION جنهن جو حوالو ڏيون ٿا gradle.build فائل. هي سڀ سيڪشن ۾ ڪيو ويندو آهي Prepare to publish. اسان اسان جي ڪنجي کي GPG_KEY_CONTENTS variable مان حاصل ڪريون ٿا، ان کي gpg فائل ۾ ترجمو ڪريو، پوء ان کي فائل ۾ وجهي ان کي ڊيڪرپٽ ڪريو secret.gpg.
اڳيون، اسان هڪ خاص متغير ڏانهن رخ ڪندا آهيون GITHUB_REF، جنهن مان اسان اهو نسخو حاصل ڪري سگهون ٿا جيڪو اسان ٽيگ ٺاهڻ وقت سيٽ ڪيو. هي variable هن معاملي ۾ لاڳاپيل آهي. refs/tags/v0.0.2 جنهن مان اسان هڪ مخصوص ورزن حاصل ڪرڻ لاءِ پهرين 11 اکرن کي ڪٽي ڇڏيو. اڳيون، اسان شايع ڪرڻ لاء معياري Gradle حڪم استعمال ڪندا آهيون: test publish
ٽيگ جو نالو v سان شروع ٿيڻ گھرجي. جيڪڏھن، ڪلڪ ڪرڻ کان پوءِ شايع ڪريو رليز، ڪم فلو ڪاميابيءَ سان مڪمل ٿيو، اسين وڃي سگھون ٿا سوناٽائپ نيڪسس پڪ ڪرڻ لاء:
آرٽيڪل اسٽيجنگ مخزن ۾ ظاهر ٿيو. اهو فوري طور تي اوپن اسٽيٽس ۾ ظاهر ٿئي ٿو، پوء ان کي دستي طور تي مناسب بٽڻ کي دٻائڻ سان بند اسٽيٽ ڏانهن منتقل ڪيو وڃي. چڪاس ڪرڻ کان پوءِ ته سڀئي گهرجون پوريون ڪيون ويون آهن، آرٽيڪل بند جي حيثيت ۾ وڃي ٿو ۽ هاڻي ترميم لاءِ دستياب ناهي. هن فارم ۾، اهو ختم ٿي ويندو MavenCentral ۾. جيڪڏھن سڀ ڪجھ ٺيڪ آھي، توھان بٽڻ کي دٻائي سگھو ٿا ڇڏڻ، ۽ نموني ختم ٿي ويندي سوناتائپ جي مخزن ۾.
آرٽيڪل کي حاصل ڪرڻ لاءِ MavenCentral ۾، توهان کي ان لاءِ پڇڻ جي ضرورت آهي انهي ڪم ۾ جيڪو اسان شروعات ۾ ٺاهيو هو. توهان کي صرف هڪ ڀيرو ڪرڻ جي ضرورت آهي، تنهنڪري اسان پهريون ڀيرو شايع ڪريون ٿا. ايندڙ وقتن ۾، اهو ضروري ناهي، هر شي خودڪار طريقي سان هم وقت سازي ڪئي ويندي. انهن مون لاءِ جلدي هم وقت سازي کي چالو ڪيو ، پر هن آرٽيڪل کي MavenCentral ۾ دستياب ٿيڻ ۾ اٽڪل 5 ڏينهن لڳي ويا.