جاوا پروجیکٹ کو سوناٹائپ ماون سنٹرل ریپوزٹری میں شائع کرنے کے لیے گریڈل اور گیتھب ایکشنز کا استعمال

اس آرٹیکل میں، میں Gradle بلڈر کا استعمال کرتے ہوئے Github ایکشنز کے ذریعے Sonatype Maven Central Repository تک جاوا آرٹفیکٹ کو شروع سے شائع کرنے کے عمل پر ایک تفصیلی نظر ڈالنا چاہتا ہوں۔

میں نے ایک جگہ عام ٹیوٹوریل نہ ہونے کی وجہ سے یہ مضمون لکھنے کا فیصلہ کیا۔ تمام معلومات کو مختلف ذرائع سے ٹکڑے ٹکڑے کرکے جمع کیا جانا تھا، اس کے علاوہ، مکمل طور پر تازہ نہیں. کس کو پرواہ ہے، بلی کے نیچے خوش آمدید۔

سوناٹائپ میں ایک ذخیرہ بنانا

پہلا قدم سوناٹائپ ماون سینٹرل میں ایک ذخیرہ بنانا ہے۔ اس کے لیے ہم جاتے ہیں۔ یہاںرجسٹر کریں اور ایک نیا ٹاسک بنائیں، ہم سے ایک ذخیرہ بنانے کو کہتے ہیں۔ ہم اپنی گاڑی میں چلاتے ہیں۔ گروپ آئی ڈی پروجیکٹ، پروجیکٹ URL پروجیکٹ لنک اور ایس سی ایم یو آر ایل ورژن کنٹرول سسٹم کا لنک جس میں پروجیکٹ واقع ہے۔ گروپ آئی ڈی یہاں فارم com.example, com.example.domain, com.example.testsupport ہونا چاہئے، اور یہ آپ کے گیتھب کے لنک کی شکل میں بھی ہو سکتا ہے: github.com/yourusername -> io.github.yourusername. کسی بھی صورت میں، آپ کو اس ڈومین یا پروفائل کی ملکیت کی تصدیق کرنی ہوگی۔ اگر آپ نے گیتھب پروفائل کی وضاحت کی ہے، تو آپ کو مطلوبہ نام کے ساتھ ایک عوامی ذخیرہ بنانے کے لیے کہا جائے گا۔

تصدیق کے کچھ وقت بعد، آپ کا گروپ آئی ڈی بن جائے گا اور ہم اگلے مرحلے، گریڈل کنفیگریشن پر جا سکتے ہیں۔

گریڈل کو ترتیب دینا

لکھنے کے وقت، مجھے گریڈل پلگ ان نہیں ملے جو آرٹفیکٹ کو شائع کرنے میں مدد کر سکیں۔ یہ واحد پلگ ان جو مجھے ملا، تاہم مصنف نے اس کی مزید حمایت کرنے سے انکار کردیا۔ لہذا، میں نے سب کچھ خود کرنے کا فیصلہ کیا، کیونکہ یہ کرنا بہت مشکل نہیں ہے.

پہلی چیز جس کا پتہ لگانا ہے وہ ہے اشاعت کے لیے سوناٹائپ کی ضروریات۔ وہ درج ذیل ہیں:

  • سورس کوڈز اور 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()
}

آئیے آخری ضرورت کی طرف بڑھتے ہیں، ایک 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.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'). ہم اسے اسمبلی کے دوران بے نقاب کریں گے اور اسے ٹیگ کے نام سے لیں گے۔

پی جی پی کلیدی نسل

سوناٹائپ کی ضروریات میں سے ایک یہ ہے کہ تمام فائلوں پر GPG/PGP کلید کے ساتھ دستخط کیے جائیں۔ اس کے لیے ہم جاتے ہیں۔ یہاں اور اپنے آپریٹنگ سسٹم کے لیے GnuPG یوٹیلیٹی ڈاؤن لوڈ کریں۔

  • ہم ایک کلیدی جوڑی تیار کرتے ہیں: 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 ایکشنز ترتیب دینا

آئیے آخری مرحلے کی طرف بڑھتے ہیں، گیتھب ایکشنز کا استعمال کرتے ہوئے بلڈ اور آٹو پبلش سیٹ اپ کریں۔
گیتھب ایکشن ایک ایسی خصوصیت ہے جو آپ کو مکمل CI/CD سائیکل کو لاگو کرکے ورک فلو کو خودکار کرنے کی اجازت دیتی ہے۔ تعمیر، جانچ، اور تعیناتی کو مختلف واقعات سے متحرک کیا جا سکتا ہے: کوڈ پش، ریلیز تخلیق، یا مسائل۔ یہ فعالیت عوامی ذخیروں کے لیے بالکل مفت ہے۔

اس سیکشن میں، میں آپ کو بتاؤں گا کہ بلڈ اینڈ پش کوڈ کیسے ترتیب دیا جائے اور ریلیز ہونے پر سوناٹائپ ریپوزٹری میں کیسے تعینات کیا جائے، ساتھ ہی راز کو بھی ترتیب دیا جائے۔

ہم راز قائم کرتے ہیں۔

خودکار اسمبلی اور تعیناتی کے لیے، ہمیں کئی خفیہ اقدار کی ضرورت ہوتی ہے، جیسے کلید کی شناخت، وہ پاس ورڈ جو ہم نے کلید تیار کرتے وقت درج کیا، خود PGP کلید، اور سوناٹائپ لاگ ان/پاس ورڈ۔ آپ انہیں مخزن کی ترتیبات میں ایک خاص سیکشن میں سیٹ کر سکتے ہیں:

جاوا پروجیکٹ کو سوناٹائپ ماون سنٹرل ریپوزٹری میں شائع کرنے کے لیے گریڈل اور گیتھب ایکشنز کا استعمال

ہم مندرجہ ذیل متغیرات مرتب کرتے ہیں:

  • SONATYPE_USERNAME / SONATYPE_PASSWORD - لاگ ان / پاس ورڈ جو ہم نے سوناٹائپ کے ساتھ رجسٹر کرتے وقت درج کیا تھا
  • SIGNING_KEYID/SIGNING_PASSWORD — PGP کلیدی شناخت اور پاس ورڈ نسل کے دوران سیٹ کیا جاتا ہے۔

میں GPG_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پل کی درخواستیں بناتے وقت بھی۔

ملازمتوں کا سیکشن مخصوص واقعات پر انجام پانے والے اقدامات کی وضاحت کرتا ہے۔ اس صورت میں، ہم اوبنٹو کے تازہ ترین ورژن پر تعمیر کریں گے، جاوا 8 استعمال کریں گے، اور گریڈل کے لیے پلگ ان بھی استعمال کریں گے۔ 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}}

فائل تقریباً پچھلی فائل سے ملتی جلتی ہے، سوائے اس ایونٹ کے جس میں اسے ٹرگر کیا جائے گا۔ اس صورت میں، یہ وی سے شروع ہونے والے نام کے ساتھ ٹیگ بنانے کا واقعہ ہے۔

تعیناتی سے پہلے، ہمیں رازوں سے PGP کلید نکال کر پروجیکٹ کی جڑ میں رکھنے کے ساتھ ساتھ اسے ڈکرپٹ کرنے کی ضرورت ہے۔ اگلا، ہمیں ایک خاص ماحولیاتی متغیر سیٹ کرنے کی ضرورت ہے۔ RELEASE_VERSION جس کا ہم حوالہ دیتے ہیں۔ gradle.build فائل یہ سب سیکشن میں کیا جاتا ہے۔ Prepare to publish. ہم اپنی کلید GPG_KEY_CONTENTS متغیر سے حاصل کرتے ہیں، اسے gpg فائل میں ترجمہ کرتے ہیں، پھر اسے فائل میں رکھ کر ڈکرپٹ کرتے ہیں۔ secret.gpg.

اگلا، ہم ایک خاص متغیر کی طرف رجوع کرتے ہیں۔ GITHUB_REF، جس سے ہم وہ ورژن حاصل کرسکتے ہیں جو ہم ٹیگ بناتے وقت سیٹ کرتے ہیں۔ یہ متغیر اس معاملے میں متعلقہ ہے۔ refs/tags/v0.0.2 جس سے ہم نے ایک مخصوص ورژن حاصل کرنے کے لیے پہلے 11 حروف کو کاٹ دیا۔ اگلا، ہم اشاعت کے لیے معیاری گریڈل کمانڈز استعمال کرتے ہیں: test publish

سوناٹائپ ریپوزٹری میں تعیناتی کے نتائج کی جانچ کرنا

ریلیز ہونے کے بعد، پچھلے حصے میں بیان کردہ ورک فلو شروع ہونا چاہیے۔ ایسا کرنے کے لیے، ایک ریلیز بنائیں:

جاوا پروجیکٹ کو سوناٹائپ ماون سنٹرل ریپوزٹری میں شائع کرنے کے لیے گریڈل اور گیتھب ایکشنز کا استعمال

ٹیگ کا نام v سے شروع ہونا چاہیے۔ اگر پبلش ریلیز پر کلک کرنے کے بعد، ورک فلو کامیابی سے مکمل ہو جاتا ہے، تو ہم جا سکتے ہیں۔ سونا ٹائپ گٹھ جوڑ۔ بات کو یقینی بنانا:

جاوا پروجیکٹ کو سوناٹائپ ماون سنٹرل ریپوزٹری میں شائع کرنے کے لیے گریڈل اور گیتھب ایکشنز کا استعمال

نمونے اسٹیجنگ ریپوزٹری میں نمودار ہوئے۔ یہ فوری طور پر اوپن اسٹیٹس میں ظاہر ہوتا ہے، پھر اسے دستی طور پر مناسب بٹن دبا کر بند کی حیثیت میں منتقل کیا جانا چاہیے۔ یہ چیک کرنے کے بعد کہ تمام تقاضے پورے ہو گئے ہیں، آرٹفیکٹ بند حالت میں چلا جاتا ہے اور اب ترمیم کے لیے دستیاب نہیں ہے۔ اس شکل میں، یہ MavenCentral میں ختم ہو جائے گا. اگر سب ٹھیک ہے، تو آپ بٹن دبا سکتے ہیں۔ رہائی، اور نمونے سوناٹائپ ریپوزٹری میں ختم ہو جائیں گے۔

ماوین سینٹرل میں آرٹفیکٹ حاصل کرنے کے لیے، آپ کو اس کام میں پوچھنا ہوگا جو ہم نے شروع میں بنایا تھا۔ آپ کو یہ صرف ایک بار کرنے کی ضرورت ہے، لہذا ہم پہلی بار شائع کرتے ہیں۔ بعد کے اوقات میں، اس کی ضرورت نہیں ہے، سب کچھ خود بخود مطابقت پذیر ہو جائے گا۔ انہوں نے فوری طور پر میرے لیے مطابقت پذیری کو آن کر دیا، لیکن ماون سینٹرل میں نمونے کے دستیاب ہونے میں تقریباً 5 دن لگے۔

بس، ہم نے MavenCentral میں اپنا نمونہ شائع کیا ہے۔

کارآمد ویب سائٹس

ماخذ: www.habr.com