Protocol Bufferのスキーマ定義からJavaのソースコードを自動生成し、Github Packagesで公開する
前回まででクライアント側となるDartのコード生成と、それをバージョニングしてGithubのリポジトリで管理するところまできました。
今回はサーバー側となるJavaのコード生成と、Github ActionsによるビルドからGithub PackagesへのArtifactの公開までに関して記載していきます。
作業ディレクトリの下には、Protocol Bufferの定義を格納したプロジェクトと、自動生成されたJavaコードを管理するプロジェクトが以下のように並列に並んでいると想定してください。

自動生成されたJavaコードを管理するのは、次の「mks-ex-java-interfaces」リポジトリです。
実際のgRPC処理部分を含むJavaコードをGradleのプラグインを使わずに生成するには、「grpc-java/compiler」が必要です。
リンク先に書かれた指示通り、Maven Centralから開発マシンに合った実行ファイルをダウンロードし、PATHが通っているディレクトリに格納します。
筆者の端末は、M1チップセットのMacですが、「protoc-gen-grpc-java-1.40.1-osx-x86_64.exe」に実行許可を与えて、ロゼッタ経由で問題なく動作しました。
これにより、protocコマンドのプラグイン指定で上記の実行ファイルを利用でき、gRPC用のコードを生成できるようになります。
今回はDartの場合同様に、シェルスクリプトを作成して、Javaコードを自動生成するようにしています。
自動生成されたコードをオリジンにプッシュしたら、Dartの場合と同じように任意のタグを打ち、GithubのReleasesというリンクから、そのタグでリリースを作ります。

現在は、0.0.2というタグが最新ですが、新たに「リリース」を作成したら、それをトリガーにして、Github Actionsのワークフローが動作するようになっています。
さて、ワークフローはこれで良いのですが、Github Packagesにプッシュするためには、build.gradleでmaven-publishプラグインを有効化し、以下のように公開先を指定しなければなりません。
なお、Github Packagesへ公開するためには、Githubのパーソナルアクセストークンが必要になります。
また、ビルドされたArtifactのバージョンは、Github Actionsをトリガーしたタグをそのままつけたいので、以下のようにbuild.gradleを記述しています。
「GITHUB_REF」という環境変数には、例えば打ったタグが「0.0.2」であれば、「refs/tags/0.0.2」のような文字列が格納されていますので、「0.0.2」の部分だけを取り出し、Gradleのversionプロパティに保存しています。
これで、自動生成されたJavaコードをオリジンにプッシュし、タグを打ってリリースを作ることで、Github PackagesでArtifactを管理できるようになりました。(こちらのリンクから0.0.2が確認できます。)
これを利用するSpring BootなどのJavaアプリケーションでは、以下のように依存関係を記述します。
mavenCentral()
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/MUKEI-SOFT-LLC/mks-ex-java-interfaces")
credentials {
username = System.getenv("GITHUB_USER")
password = System.getenv("GITHUB_TOKEN")
}
}
}
dependencies {
implementation("jp.co.mukeisoftllc.ex.grpc:protobuf:0.0.2")
}
ここまでで、クラインアントとサーバー間でProtocol Bufferのスキーマ定義を共有し、強調して作業が行えるようになりました。
次回、インターフェイスとなるDartパッケージとJavaのArtifactを利用したサンプルアプリケーションを作成し、公開いたします。
それでは!