Shogo's Blog

May 18, 2021 - 3 minute read - gradle java

Gradle Ribbonizer Plugin を Maven Central へ移行してみた

全国の Android エンジニアの皆さんこんにちは。 弊社では過去に maskarade/gradle-android-ribbonizer-plugin という Gradle Plugin を使っていたのですが、 メンテナンスされている様子がないので、フォークして自前のパッチを当て shogo82148/gradle-android-ribbonizer-plugin で開発を続けていました。 (何をするプラグインなのかは本題ではないのでまた今度) コンパイルした jar ファイルは jcenter で公開していたのですが、皆さんご存知の通り 5/1 を持って閉鎖してしまいました。

猶予期間として 1 年はダウンロード可能ですが、既に新規のアップロードはできなくなっています。 そういうわけで、重い腰を上げて Maven Central へ移行することにしました。

リリース作業

Maven Central Repository への公開手順(Gradle 版) の記事を参考に以下の手順でリリースを進めます

  • sonatype の JIRA で issue を通してリポジトリ作成を依頼
  • GnuPG で jar を署名できる環境を作成
  • Gradle プラグインでリポジトリへ登録
  • Repository Manager で Maven Central Repository へリリース

sonatype の JIRA で issue を通してリポジトリ作成を依頼

リポジトリ作成を依頼は JIRA で行います。 JIRA を使うにはアカウントが必要なので、以下のリンクから新規アカウントを発行します。

項目 入力
プロジェクト Community Support - Open Source Project Repository Hosting
課題タイプ New Project
要約(Summary) GitHub のプロジェクト名など
説明(Description) GitHub の README の内容など
Group Id 保有ドメインなどから Group Id を指定
Project URL GitHub のプロジェクト URL
SCM url GitHub の Clone URL
Username(s)
Already Synced to Central No

GroupID は ドメイン名を指定するのが慣例ですが、JIRA チケットの ID を DNS の TXT レコードに登録することで、ドメインの所有権を示す必要があるそうです。 (アレってただの慣例で、所有権の確認があるとは知らなかった)

無事レポジトリの作成が終わると、ボットさんが知らせてくれます。 僕が依頼した Issue はこちら。

GnuPG で jar を署名できる環境を作成

僕の場合は、GitHub のコミットに Verified マーク付けてみたり、 yum レポジトリを作る ために、署名用の鍵は既に作ってあったのでそれをそのまま使用。 持っていない人は以下のコマンドで新しい鍵を作ろう

$ brew install gnupg
$ gpg --full-gen-key

公開鍵サーバーへの登録も keys.openpgp.org でやっていたのでスキップ。

Gradle から秘密鍵にアクセスできるようエクスポートしておきます。

$ gpg --export-secret-keys -o ~/.gnupg/secring.gpg

どの秘密鍵で署名するかの設定にショート形式の鍵 ID が必要なので、以下のコマンドで確認します。

$ gpg --list-secret-keys --keyid-format short
/Users/xxxxxx/.gnupg/pubring.kbx
---------------------------------------
sec   rsa4096/4AA47BA4 2019-06-06 [SC]
      346778FA3341B42937DA58058CB38F4B4AA47BA4
uid         [  究極  ] Ichinose Shogo <shogo82148@gmail.com>
ssb   rsa4096/5FD14088 2019-06-06 [E]

僕の場合は 4AA47BA4 です。

Gradle プラグインでリポジトリへ登録

鍵の設定、認証情報の設定等を ~/.gradle/gradle.properties に設定しておきます。

signing.keyId=4AA47BA4
signing.password=xxxxxxxx
signing.secretKeyRingFile=/Users/xxxxxxx/.gnupg/secring.gpg

sonatypeUsername=shogo82148
sonatypePassword=********

build.gradle は以下のように設定。 参考にしたサイトのものをそのままコピペしたら公開に失敗したので、ちょっと修正を加えています。

buildscript {
    repositories {
        google()
        mavenCentral()
    }
}

plugins {
    id('org.jetbrains.kotlin.jvm')
    id('java-gradle-plugin')
    id('signing') // これを追加!
    id('maven-publish') // これを追加!
}

dependencies {
    compileOnly gradleApi()
    implementation localGroovy()
    implementation 'com.android.tools.build:gradle:4.2.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

group = 'com.shogo82148.ribbonizer'
version = '3.0.2'

publishing {
    publications {
        // mavenJava(MavenPublication) となっていたけど、
        // 公開するのは Gradle Plugin なので pluginMaven に変更
        pluginMaven(MavenPublication) {
            artifactId = 'ribbonizer-plugin'
            pom {
                name = 'ribbonizer-plugin'
                description = 'Modifies launcher icons on debug build'
                url = 'https://github.com/shogo82148/gradle-android-ribbonizer-plugin'
                licenses {
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id = 'shogo82148'
                        name = 'Ichinose Shogo'
                        email = 'shogo82148@gmail.com'
                    }
                }
                scm {
                    connection = 'git@github.com:shogo82148/gradle-android-ribbonizer-plugin.git'
                    developerConnection = 'git@github.com:shogo82148/gradle-android-ribbonizer-plugin.git'
                    url = 'https://github.com/shogo82148/gradle-android-ribbonizer-plugin'
                }
            }
        }
    }
    repositories {
        maven {
            // 2021年2月に oss.sonatype.org から s01.oss.sonatype.org に変わったらしい
            // by https://central.sonatype.org/publish/publish-guide/#deployment
            def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
            credentials {
                // CI 環境でテストを回すと sonatypeUsername, sonatypePassword が設定されていなくてコケるので、
                // とりあえずテキトーな値を設定
                username = "${hasProperty('sonatypeUsername') ? sonatypeUsername : 'anonymous'}"
                password = "${hasProperty('sonatypePassword') ? sonatypePassword : 'anonymous'}"
            }
        }
    }
}

signing {
    sign publishing.publications.pluginMaven
}

設定がうまく行っていれば gradlew publish でアップロードできます。

$ ./gradlew publish

Repository Manager で Maven Central Repository へリリース

ローカルのコマンド操作でアップロードしたものは Staging 状態で実際には公開されていません。 nexus repository manager からレポジトリを Close して公開内容を確定したあと、Release ボタンを押してようやく公開です。

ちなみに Close のときに正しく署名されているかのチェックや、POM にメタ情報が正しく書かれているかのチェックが走ります。

まとめ

と、言うわけで無事公開できました!

ただ、SVG 対応していないという理由で、このプラグイン最近使われてないんですよね。 SVG 対応・・・

参考