Gradleには標準機能でS3やCloud Storageをmavenリポジトリとして扱う機能がついています。
社内や個人でプライベートなリポジトリとして活用する例は見られるのですが、今回は一般公開設定にしてPublicにしてみます。
Cloud Storageの料金はこちら。実験的にいくつかファイルを置いているくらいであれば0円になることもあります。
アイオワリージョンであれば、公開日時点で1ヶ月あたり$0.020/GBの設定のようです。東京リージョンではもう少し高い値段設定です。
環境
- Java 17
- Gradle 8.2
事前準備
ファイルをアップロードするためのCloud Storageのバケットを用意してください。
実験的に試すのであれば、シングルリージョンにしておくのが良いと思います。
build.gradle.kts
の用意
今回はKotlin DSLで書いていますがGroovyでもほぼ同様のコードで動くと思います。
mavenに公開するので、maven-publish
のプラグインを使用します。
plugin {
id("maven-publish")
}
Publishの設定は以下のようにします。
今回はkoma-yumemi-resources
のバケットの中のgcp-maven-test/maven
にファイルをおくことにします。
publishing {
publications {
// この辺りは適当に設定して下さい。
create("mavenJava", MavenPublication::class) {
from(components.named("java").get())
}
}
repositories {
maven {
// ここのURLがCloud Storageにアップロードするために必要です。
url = uri("gcs://koma-yumemi-resources/gcp-maven-test/maven")
}
}
}
ここのMavenPublication::class
の指定はGroovy DSLの場合MavenPublication.class
とする必要があります。mavenJava(MavenPublication)
といった書き方でもOKです。
ここではURLをgcs://example/maven
といった形式で与える必要があります。GCPでよく使われれるgs://
ではないので、書き換えてください。
認証
Gradleからはアプリケーションのデフォルト認証情報を使ってGCPにアクセスします。
ローカル環境であれば、gcloud auth application-default login
のコマンドを実行することで認証ファイルの作成ができます。
内部的にはgoogle-api-clientのライブラリを呼び出しているようです。
この辺りから認証情報を得ているようです。
サービスアカウントを使用している場合はGOOGLE_APPLICATION_CREDENTIALS
に設定されたJSONを見て認証してくれるようですが、GitHubのOIDCから得た認証情報を使うと以下のエラーになってしまったので設定が違うのかもしれません。
Caused by: java.io.IOException: Error reading credential file from environment variable GOOGLE_APPLICATION_CREDENTIALS, value '.../gha-creds-d5777338b048ce4b.json': Error reading credentials from stream, 'type' value 'external_account' not recognized. Expecting 'authorized_user' or 'service_account'.
公開
Publish
./gradlew publish
を実行するとCloud Storageにアップロードされます。
バケット以下の指定したパスにファイルが保存されています。
一般公開の設定
ここではバケット内のすべてのオブジェクトを公開設定にします。
公開したくないファイルが含まれている場合はバケットを分けることをお勧めします。
プリンシパルにallUsers
を指定し、ロールには「Storageオブジェクト閲覧者」を選択します。そして保存をクリックします。
確認画面が出てくるので、「一般公開アクセスを許可」を選択します。
これで一般公開の操作は完了です。
ファイルの一覧を表示すると、公開アクセスの欄がインターネットに公開となっています。
リポジトリを使用する
公開されたプロジェクトを使用する側ではまずrepositoriesの設定を追加します。
gcs://koma-yumemi-resources/gcp-maven-test/maven
に公開していた場合は、以下のような設定になります。
repositories {
maven {
url = uri("https://storage.googleapis.com/koma-yumemi-resources/gcp-maven-test/maven")
}
}
https://storage.googleapis.com/
以下にパスを付け加えるだけです。
その上でdependencyをMaven Centralのプロジェクトと同じように追加します。
これで公開したプロジェクトを他の人が使えるようになりました。