Protocol BuffersのIDL(.protoファイル)をvendoringするツールを書いた

.protoファイルの管理方法に思いを馳せていたので書いた。

動機

FRESH!はMicroservicesアーキテクチャでやっているが、今まさにAPI v2というのが動いていて構成の刷新に動いている。技術的なトピックとしては

  • iOS/AndroidからAPIへの通信をフルgRPC化
  • Service Meshの導入
  • Amazon ECS -> Kubernetes化

といったところで本格的に動きはじめている。

1つのRepositoryに1サービスという構成で作っているので、それぞれにgRPCのインタフェースを用意し、Service MeshでよしなにRoutingやDiscoveryしていく感じ。サービス毎にgRPC/Protocol Buffersのインタフェース定義のIDL(.protoファイル)を配置していく。

.proto群をかき集めたい

iOSやAndroidはもちろんMicroservices間の通信もそうなのだが、様々なサービスのIDLを利用してサービスにアクセスするためのプログラムを protoc を使って自動生成していく。クライアントによって必要なサービスも違うし、参照しているバージョンも異なる。何よりも、リポジトリが散らばっているので、それを毎度各クライアントのリポジトリにコピーしてきたりして管理するのもなかなかダルい。

というわけで必要なIDLを定義して、それを一気に解決するようなツールが欲しくなったので書いたのが今回のprotodepである。

使い方は以下のように、protodep.tomlという依存関係を定義したtomlを用意する。

proto_outdir = "./proto"

[[dependencies]]
  target = "github.com/openfresh/plasma/protobuf"
  branch = "master"

[[dependencies]]
  target = "github.com/grpc-ecosystem/grpc-gateway/examples/examplepb"
  revision = "v1.2.2"

あとはprotodepを実行する。

$ protodep up

protodepでprotoを取得したら、vendoringツールにありがちなlockファイルができる(protodep.lock)。これでバージョン固定可能。

-fオプションを付ければforce updateも可能

$ protodep up -f

protodepはあくまでIDLを必要なところからかき集めるだけのツールなので、取得したIDLを使ってのstubの生成はセルフサービスでお願いします。