gRPCサーバを含むGoプロジェクトをBazelでビルドする
前回までのエントリに引き続きBazelのビルドをまとめていく。
GoとKotlinのマルチプロジェクトをBazelでビルドする - 平日インプット週末アウトプットぶろぐ
BazelでGoプロジェクトのビルド。Gazelleのgo_repositoryで外部ライブラリの依存とBazelのgo_testでテスト。 - 平日インプット週末アウトプットぶろぐ
今回のエントリではgRPCサーバを含むGoプロジェクトをBazelでビルドする方法をまとめる。
Protocol BufferとgRPCサーバのInterfaceの生成をBazelで行う
これまではprotocをつかって.protoファイルからProtocol BufferとgRPCサーバのInterfaceの生成を行っていたがBazelのruleを使えば簡単にビルドタスクに追加することができる。
利用するruleはrules_proto
。
このruleに辿り着く前にpubref/rules_protobufを見つけたがpubrefのほうは周辺のruleのアップデートに追いついておらずstackbのほうがメンテナンスが活発である。
WORKSPACEにruleの追加と.protoファイルの追加
WORKSPACEにruleを追加する。
|
|
シンプルなecho.protoをproto/echo
ディレクトリ以下に追加する。
|
|
この状態でgazelle
を実行するとproto/echo
以下にBUILD.bazel
が追加されている。
1
|
(bazel-multiprojects) $ bazel run //:gazelle |
|
|
ここで生成されたgo_libraryのgo_default_library
を後でgRPCサーバ側のソースに依存させる。
go_grpc_compileをつかってProtocol Bufferを生成するタスクを追加する
go_default_library
のビルドタスクのみだとecho.pb.go
ファイルが生成されない。ここでstackb/rules_proto
のruleを追加する。proto/echo/BUILD.bazel
に以下を追加する。
|
|
このproto_buf
のタスクを実行するとbazel-genfiles/proto/echo/proto_buf/proto/echo/
以下にecho.pb.go
ファイルが生成される。
1 2 3 4 5 6 7 8 |
(bazel-multiprojects) $ bazel build //proto/echo:proto_buf INFO: Analysed target //proto/echo:proto_buf (0 packages loaded). INFO: Found 1 target... Target //proto/echo:proto_buf up-to-date: bazel-genfiles/proto/echo/proto_buf/proto/echo/echo.pb.go INFO: Elapsed time: 0.261s, Critical Path: 0.08s INFO: 1 process: 1 darwin-sandbox. INFO: Build completed successfully, 2 total actions |
生成されたecho.pb.go
ファイルをプロジェクトの/proto/echo
に配置することでgRPCサーバ側のコードにimportすることができる。
gRPCサーバを実装する
gRPCサーバのコードではgoogle.golang.org/grpc
のライブラリを利用するのでWORKSPACEに外部ライブラリの依存を追加しておく。
1 2 3 4 5 |
go_repository( name = "org_golang_google_grpc", importpath = "github.com/grpc/grpc-go", tag = "v1.16.0", ) |
main.goのコードは次のような差分になった。シンプルにechoServerを実装しているコードである。
|
|
上記のコードの状態でgazelle
を実行するとpkg/public_go/BUILD.bazel
に依存が追加される。
|
|
gazelleがWORKSPACEの外部ライブラリ依存の定義とmain.goのコードを解析して依存関係をBUILD定義に反映してくれている。
ここまでくればgRPCサーバを起動することができる。
gRPCサーバの起動
pkg/public_go/BUILD.bazel
に定義されているgo_binaryのタスクのrunコマンドを実行してサーバを起動させる。
1
|
$ (bazel-multiprojects) $ bazel run //pkg/public_go:public_go |
gRPCのデバッグに最適なevansで起動したgRPCサーバにリクエストを送り確認する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
evans --port 50051 proto/echo/echo.proto ______ | ____| | |__ __ __ __ _ _ __ ___ | __| \ \ / / / _. | | '_ \ / __| | |____ \ V / | (_| | | | | | \__ \ |______| \_/ \__,_| |_| |_| |___/ more expressive universal gRPC client 127.0.0.1:50051> show package +---------+ | PACKAGE | +---------+ | echo | +---------+ 127.0.0.1:50051> package echo echo@127.0.0.1:50051> show service +---------+------+-------------+--------------+ | SERVICE | RPC | REQUESTTYPE | RESPONSETYPE | +---------+------+-------------+--------------+ | Echo | Echo | EchoInbound | EchoOutbound | +---------+------+-------------+--------------+ echo@127.0.0.1:50051> service Echo echo.Echo@127.0.0.1:50051> call Echo message (TYPE_STRING) => Awesome Bazel! { "message": "Awesome Bazel!" } |
EchoSeverが正常に起動していることを確認できた。
まとめ
- gRPCサーバを含むGoプロジェクトをBazelでビルドする方法をまとめた
- Protocol Bufferを生成するruleもありGoプロジェクト周辺のビルドユースケースが整っている