جاوا پروجيڪٽ کي شايع ڪرڻ لاءِ 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 پلگ ان نه مليا جيڪي آرٽيڪل شايع ڪرڻ ۾ مدد ڪري سگھن ٿيون. هن صرف پلگ ان جيڪو مون کي مليو، جڏهن ته، ليکڪ ان کي وڌيڪ سپورٽ ڪرڻ کان انڪار ڪيو. تنهن ڪري، مون پنهنجو پاڻ کي هر شي ڪرڻ جو فيصلو ڪيو، ڇو ته اهو ڪرڻ ڏکيو ناهي.

معلوم ڪرڻ لاءِ پهرين شيءِ آهي سوناتائپ جي پبلشنگ جي گهرج. اهي هيٺيان آهن:

  • ماخذ ڪوڊ ۽ 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 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
  • سرور ڏانهن عوامي ڪنجي کي شايع ڪرڻ 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 عمل استعمال ڪندي خودڪار شايع ڪريو.
Github Actions هڪ خاصيت آهي جيڪا توهان کي مڪمل CI / CD چڪر کي لاڳو ڪندي ڪم فلو کي خودڪار ڪرڻ جي اجازت ڏئي ٿي. تعمير، ٽيسٽ، ۽ ترتيب ڏيڻ مختلف واقعن جي ڪري ٿي سگھي ٿو: ڪوڊ پش، ڇڏڻ جي تخليق، يا مسئلا. هي فنڪشنلٽي عوامي ذخيرن لاءِ بلڪل مفت آهي.

هن حصي ۾، مان توهان کي ڏيکاريندس ته ڪيئن ٺاهجي ۽ پش ڪوڊ قائم ڪجي ۽ سونيٽائپ ريپوزٽري تي رليز ڪرڻ تي، ۽ گڏوگڏ رازن کي ترتيب ڏيو.

اسان راز قائم ڪيو

خودڪار اسمبلي ۽ ڊيپلائيمينٽ لاءِ، اسان کي ڪيترن ئي ڳجهن قدرن جي ضرورت آھي، جھڙوڪ ڪي id، پاس ورڊ جيڪو اسان داخل ڪيو آھي جڏھن چاٻي ٺاھڻ وقت، PGP ڪيئي پاڻ، ۽ سوناٽائپ لاگ ان/پاسورڊ. توھان انھن کي سيٽ ڪري سگھو ٿا خاص سيڪشن ۾ مخزن جي سيٽنگن ۾:

جاوا پروجيڪٽ کي شايع ڪرڻ لاءِ Gradle ۽ Github ڪارناما استعمال ڪندي سون ٽائپ ماون مرڪزي مخزن کي

اسان هيٺ ڏنل متغير مقرر ڪيو:

  • 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 اهي راز آهن جيڪي اسان اڳ ۾ پڇيو.

تعمير جا نتيجا ايڪشن ٽيب ۾ ظاهر ٿيندا:

جاوا پروجيڪٽ کي شايع ڪرڻ لاءِ Gradle ۽ Github ڪارناما استعمال ڪندي سون ٽائپ ماون مرڪزي مخزن کي

خودڪار ترتيب ڏيو جڏهن نئين رليز جاري ڪئي وئي آهي

اچو ته هڪ الڳ ورڪ فلو فائل ٺاهي آٽو ڊيپلائي لاءِ 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 variable مان حاصل ڪريون ٿا، ان کي gpg فائل ۾ ترجمو ڪريو، پوء ان کي فائل ۾ وجهي ان کي ڊيڪرپٽ ڪريو secret.gpg.

اڳيون، اسان هڪ خاص متغير ڏانهن رخ ڪندا آهيون GITHUB_REF، جنهن مان اسان اهو نسخو حاصل ڪري سگهون ٿا جيڪو اسان ٽيگ ٺاهڻ وقت سيٽ ڪيو. هي variable هن معاملي ۾ لاڳاپيل آهي. refs/tags/v0.0.2 جنهن مان اسان هڪ مخصوص ورزن حاصل ڪرڻ لاءِ پهرين 11 اکرن کي ڪٽي ڇڏيو. اڳيون، اسان شايع ڪرڻ لاء معياري Gradle حڪم استعمال ڪندا آهيون: test publish

سوناٽائپ مخزن ۾ تعیناتي جا نتيجا چيڪ ڪري رهيا آهن

هڪ دفعو رليز پيدا ٿئي ٿي، پوئين حصي ۾ بيان ڪيل ڪم فلو شروع ٿيڻ گهرجي. هن کي ڪرڻ لاء، هڪ رليز ٺاهيو:

جاوا پروجيڪٽ کي شايع ڪرڻ لاءِ Gradle ۽ Github ڪارناما استعمال ڪندي سون ٽائپ ماون مرڪزي مخزن کي

ٽيگ جو نالو v سان شروع ٿيڻ گھرجي. جيڪڏھن، ڪلڪ ڪرڻ کان پوءِ شايع ڪريو رليز، ڪم فلو ڪاميابيءَ سان مڪمل ٿيو، اسين وڃي سگھون ٿا سوناٽائپ نيڪسس پڪ ڪرڻ لاء:

جاوا پروجيڪٽ کي شايع ڪرڻ لاءِ Gradle ۽ Github ڪارناما استعمال ڪندي سون ٽائپ ماون مرڪزي مخزن کي

آرٽيڪل اسٽيجنگ مخزن ۾ ظاهر ٿيو. اهو فوري طور تي اوپن اسٽيٽس ۾ ظاهر ٿئي ٿو، پوء ان کي دستي طور تي مناسب بٽڻ کي دٻائڻ سان بند اسٽيٽ ڏانهن منتقل ڪيو وڃي. چڪاس ڪرڻ کان پوءِ ته سڀئي گهرجون پوريون ڪيون ويون آهن، آرٽيڪل بند جي حيثيت ۾ وڃي ٿو ۽ هاڻي ترميم لاءِ دستياب ناهي. هن فارم ۾، اهو ختم ٿي ويندو MavenCentral ۾. جيڪڏھن سڀ ڪجھ ٺيڪ آھي، توھان بٽڻ کي دٻائي سگھو ٿا ڇڏڻ، ۽ نموني ختم ٿي ويندي سوناتائپ جي مخزن ۾.

آرٽيڪل کي حاصل ڪرڻ لاءِ MavenCentral ۾، توهان کي ان لاءِ پڇڻ جي ضرورت آهي انهي ڪم ۾ جيڪو اسان شروعات ۾ ٺاهيو هو. توهان کي صرف هڪ ڀيرو ڪرڻ جي ضرورت آهي، تنهنڪري اسان پهريون ڀيرو شايع ڪريون ٿا. ايندڙ وقتن ۾، اهو ضروري ناهي، هر شي خودڪار طريقي سان هم وقت سازي ڪئي ويندي. انهن مون لاءِ جلدي هم وقت سازي کي چالو ڪيو ، پر هن آرٽيڪل کي MavenCentral ۾ دستياب ٿيڻ ۾ اٽڪل 5 ڏينهن لڳي ويا.

اهو سڀ ڪجهه آهي، اسان شايع ڪيو آهي اسان جي آرٽيڪل MavenCentral ۾.

ڪارآمد لنڪ

  • ملندڙ هڪ مضمونصرف ميون ذريعي شايع ڪريو
  • اسٽوريج مخزن سونٽيائپ
  • جرا سونيٽائپ جنهن ۾ ڪم ٺاهي
  • مثال طور repository جتي اهو سڀ سيٽ اپ آهي

جو ذريعو: www.habr.com