0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

グラフライブラリ6. Maven Centralにデプロイする

Last updated at Posted at 2024-10-01

この記事は韓国語から翻訳したものです。不十分な部分があれば、いつでもフィードバックをいただければありがたいです! (オリジナル記事, 同じく私が作成しました。)

グループプロジェクトでグラフライブラリを実装する過程をまとめてみました。この記事では完成したグラフライブラリをMaven Central Repositoryへ配布する過程について説明します。(project repo, library repo)

Sonatype 加入、課題生成

まず、アカウントがない場合はhttps://issues.sonatype.org/に入って会員登録をします。

sonatype_signup.png

会員登録が完了したら、ログインしたページに課題を一つ作成する必要があります。

create_issue.png

課題は新しく作るプロジェクトなので、New Projectを選択します。

Summaryには普通ライブラリ名を入れます。Descriptionもあまり気にする必要はありません。他の必須入力欄は全部入力すればいいのですが、一番重要な部分はgroup idです。

これはよく私たちがgradleファイルからライブラリをimportする時、implementation("packagename:version")と同じように使うのですが、ここでpackage nameに該当する部分です。通常、Javaのパッケージ命名規則のように、自分がコントロールするドメイン名を反転して使うのですが、ライブラリ名より前のドメインアドレスがgroup idになります。例えば、com.example.materialchartというライブラリがあれば、ライブラリの識別は materialchart となり、group idは com.example となります。

この部分が重要な理由は、現在配布しようとしているライブラリのパッケージ名は、自分がコントロールしているドメインの逆順でなければならないからです。問題が生成されると、システムで自動的にDNSレコードを調べて認証する方式です。 したがって、ライブラリを配布する時、ソースでパッケージ名が自分がコントロールするドメインでない場合は、今すぐ変更するようにしましょう。

私たちのチームは priceguard.app というドメインを所有しており、パッケージ名は app.priceguard.materialchart に設定しているので、group idは app.priceguard と入力しました。

もし、自分が所有してるドメインがない場合、GitHub Pagesを使って認証する方法があるので、group idを io.github.<USERNAME> に設定しましょう。 (参考)

Issueを生成したら、group idが自分の所有であることを認証しないとIssueが正常に閉じられ、本格的にパッケージをrepositoryにアップロードすることができます。

group idの認証は domain rootにTXTレコードで該当のissue番号を追加しておけば、自動的に認証されます。

dns_query_result.jpg

認証が完了すると、Issueに自動的にコメントが追加され、Issueが閉じられます。

groupid_verification_complete.png

プロジェクトデプロイ設定

次はプロジェクトのビルド設定やデプロイ設定をする必要があります。

まず、デプロイを簡単にするためMaven Publish Pluginを使う予定です。元々Maven Centralへアップロードをするためには色んな要件を満たしてpom.xmlのようなファイルも作って一度にアップロードする必要があります。しかし、このプラグインを使うとgradleで設定した値で必要な情報とファイルを自動で入れてくれます。

まず、library側のbuild.gradleファイルに下記のようにプラグインを追加します。後でパッケージ署名に使うSigningプラグインも一緒に追加します。

plugins {
    `maven-publish`
    signing
}

groupIdは上で認証する時使ったドメインの逆順で、artifactIdはこのライブラリのパッケージ名です。実際に配布された時、ユーザーがimportをする時、 groupId:artifactId:version のような文字列でインポートします。私たちのような場合、groupIdは app.priceguard, artifactIdは materialchart で importをする時 implementation("app.priceguard:materialchart:<version>") で使うことになります。

publishing {
    publications {
        afterEvaluate {
            create<MavenPublication>("release") {
                from(components["release"])
                groupId = groupName
                artifactId = packageName
                version = versionCode

                pom {
                    name.set(artifactId)
                    description.set("ライブラリの簡単な説明")
                    url.set("https://github.com/ライブラリレポアドレス")
                    licenses {
                        license {
                            name.set("MIT License")
                            url.set("https://opensource.org/license/mit/")
                        }
                    }
                    developers {
                        developer {
                            name.set("ディストリビューター名")
                            email.set("連絡先メールアドレス")
                        }
                    }
                    scm {
                        url.set(pom.url.get())
                        connection.set("scm:git:${url.get()}.git")
                        developerConnection.set("scm:git:${url.get()}.git")
                    }
                }
            }
        }
    }

    repositories {
        maven {
            name = "SonatypeSnapshot"
            setUrl("https://s01.oss.sonatype.org/content/repositories/snapshots/")
            credentials {
                username = getExtraString("ossrhUsername")
                password = getExtraString("ossrhPassword")
            }
        }

        maven {
            name = "Sonatype"
            setUrl("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/")
            credentials {
                username = getExtraString("ossrhUsername")
                password = getExtraString("ossrhPassword")
            }
        }
    }
}

Repositoriesで設定したSonatypeSnapshotとSonatypeは別々のリポジトリです。Snapshotは該当ライブラリのsnapshotバージョンをアップロードする場所であり、SonatypeはReleaseビルドをアップロードする場所です。Snapshotのような場合にはversionCodeが無条件にSNAPSHOTで終わらないと後でアップロードする時エラーが出ます。逆も同じです。Release repoにSNAPSHOTをアップロードしようとするとエラーが出るのでversionCodeを設定する時注意しましょう。

getExtraString 関数はlocal.propertiesを解析して値を取得するように設定しました。ossrhUsernameとPasswordは先ほどSonatypeでログインする時使ったcredentialを入力します。

extra["signing.keyId"] = null
ext["signing.password"] = null
ext["signing.secretKeyRingFile"] = null
ext["ossrhUsername"] = null
ext["ossrhPassword"] = null

val secretPropsFile = project.rootProject.file("local.properties")
if (secretPropsFile.exists()) {
    secretPropsFile.reader().use {
        Properties().apply {
            load(it)
        }
    }.onEach { (name, value) ->
        ext[name.toString()] = value
    }
} else {
    ext["signing.keyId"] = System.getenv("SIGNING_KEY_ID")
    ext["signing.password"] = System.getenv("SIGNING_PASSWORD")
    ext["signing.secretKeyRingFile"] = System.getenv("SIGNING_SECRET_KEY_RING_FILE")
    ext["ossrhUsername"] = System.getenv("OSSRH_USERNAME")
    ext["ossrhPassword"] = System.getenv("OSSRH_PASSWORD")
    println(ext["ossrhUsername"])
}

fun getExtraString(name: String) = ext[name]?.toString()

ちょうどlocal.propertiesでSIGNING_KEYに関する内容が出てきたので、SIGNING_KEYについても追加します。GPGでSigning Keyを作る方法は公式ドキュメントに詳しく説明されています。Keyを生成して必ずPublic KeyをKey Serverに送ることも忘れないでください。これは後でそのキーでパッケージサインをする時、外部からPublic Keyで検証をするため、必ず必要です。

鍵を生成したら、keyIdには gpg --keyid-format SHORT --list-keys でSigingする時使う公開鍵の前に表示される8桁のIDを入力します。以下の例では F36F5BBD になります。

pub   rsa4096/F36F5BBD 2023-12-07 [SC]
      DDA6DA5453AC1A14260621A9A5764C8DF36F5BBD

secretKeyRingFileはgpg --export-secret-keys [keyid] コマンドを使って.gpgファイルをexportした後、そのkeyの位置を絶対パスで入力します。

最後にgradleでreleaseビルドをする時、signをするように設定します。

signing {
    afterEvaluate {
        sign(publishing.publications["release"])
    }
}

Nexusにアップロード

上の設定が終わったら、下記のコマンドを実行してNexus Repositoryへアップロードします。このコマンドを実行したら、ビルド後repositoryへアップロードまでやってくれます。

./gradlew publishReleasePublicationToSonatypeRepository

gradle_publish.png

nexus_repository_manager.png

アップロードが正常に完了したら、https://s01.oss.sonatype.org/に入ってStaging Repositoriesに上のようにアップロードされたか確認します。

もし、正常にアップロードされてアップロードされたバージョンをデプロイしたい -> Close

間違いがあってデプロイしたくない -> Drop

を選択します。最初用語が分かりにくくてなぜアップロードをしたのに配布ができないのか気になって何十分も待っていましたが、Closeをしないと実際にRelease Repositoryに反映できるように検査をします。

配布

上でRepositoryをCloseしたら、そのパッケージがMaven Central Repositoryに入るのに適しているかどうか検証をします。無効であることが確認されたらこのようにCloseする途中でエラーが出ます。

validation_failed.png

もし正常にCloseされたら、さっきのStage RepositoryのオプションでReleaseボタンが有効になります。Releaseボタンを押すとRelease Repositoryに反映されます。しかし、これはMaven Central RepositoryとSyncする時時間がかかるので、すぐに確認できない場合があります。

nexus_released.png

正常にデプロイされたら、左側のArtifact Searchでパッケージ名を検索して確認することができます。

maven_central_synced.png

少し後、Maven Centralでパッケージ名を検査してみると、正常にアップロードされてることが確認できます。Maven Centralに正常にアップロードされたことが確認されたら、あとはどこでもimportして使うことができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?