Pact Broker DockerコンテナをつかってPact Broker環境を構築してみた
Consumer-Driven Contract テストをフレームワークさせるPactをつかったサンプルプロジェクトを前回のエントリでは紹介しました。
golang - kotlinのmicroservice構成のConsumer-Driven Contract testingをpactをつかって作ってみた - 平日インプット週末アウトプットぶろぐ前回のエントリではPactファイルをConsumerとProviderともにファイルシステムを用いて参照していました。
Pact Brokerを導入すればPactファイルのレポジトリ環境が構築できます。
今回のエントリではPact Brokerの構築を紹介します。
Pact Broker
Pact Brokerはこちらのgithubレポジトリから参照できます。
Pact Brokerの特徴を抜粋すると
- ConsumerとProviderの間のPact共有の課題を解決する
- Pactの管理をPact Brokerが一元管理するためConsumerとProviderともにPact管理/Pactリリースの手間がなくなる
- 最新のAPIドキュメント管理をPact Borkerが保証する
- サービスが提供するAPIのインタラクションが確認できる
- microserviceの依存関係をビジュアライズする
特徴についてはスクリーンショットも合わせて参照ください。
Pact Broker Docker container
Pact Brokerをローカルに構築していきます。Pact BrokerのDockerコンテナが用意されていますので今回はこちらを使います。https://hub.docker.com/r/dius/pact_broker/DBにPostgresを推奨していますので合わせてPostgresのDocker Containerを使います。
ここで2つのコンテナが必要になったのでDocker Composeで構成をまとめるついでにMackerelのコンテナも構成に入れてコンテナ監視もさせてみます。
dind(Docker in Docker)をつかってローカルでPact Brokerを動かす
Mackerelコンテナはホストのdocker.sockをvolumesを用いてコンテナにリンクさせる必要があるのでローカルで動かすときはDocker In Dockerがしたくなります。
ローカルPCにホストとなるコンテナを立てて、その中にPact Broker、Postgres、Mackerelのコンテナをぶら下げたいのですが、この課題を解決してくれるのがこちらの記事です。
dind(Docker in Docker)で複数のdocker-composeを管理する - tehepero note(・ω<)この記事に習い次のような構成でDocker in DockerをローカルPCに構築しました。
|
|
dind + direnvコンボのローカル環境構築はとても捗ります。ぜひ参考に。
Pact Brokerの機能をザッと確認
先のコンテナ構成を起動しlocalhost:8080にアクセスするとPact Brokerの管理ツールがお目見えします。
1:ConsumerがPactファイルをPact Brokerにパブリッシュする
Pact BrokerにPactファイルがないと機能が確認できませんので次のPactファイルをPact Brokerへパブリッシュします。Pactファイル
|
|
Pactファイルをパブリッシュする
|
|
運用イメージとしてはこのパブリッシュアクションをCircleCIなどのビルドタスクに入れます。※ 1.0.1のバージョンを更新していくことでPact Brokerがバージョン管理をしてくれます。
2:Pact Brokerではgateway_service(Consumer)とuser_serivce(Provider)の関係が管理されている
ConsumerとProviderのリスト
- user_serviceのConsumerがProviderであることが明確になっています。
パブリッシュしたPactファイルから生成されたAPIドキュメント
- 今回はAPIのインタラクションが1つだけでしたが複数登録すればAPIドキュメントがPact Brokerに一元管理できます。
ConsumerとProviderのNetwork Graph
- サービスから矢印が向いているとConsumer→Providerの関係を表します。
- このサービスはどのサービスから参照されているか図解してくれます。
※ 関係図を充実させるためにgateway_serviceとuser_serivce以外のサービスも増やしました。
3:Pact BrokerからPactファイルを参照してProvider側でCDCテストを実行する
サンプルのProviderはpact-jvmを使っています。
Pact Brokerと簡単に連携できる@アノテーションが用意されています。
|
|
上記のアノテーションを加えテストを実行するとPact BrokerからPactファイルを取り出しCDCテストが行われます。
まとめ
Pactを使えばCDCテストのフレームワーク化の恩恵が受けられ更にPact Brokerを導入することでPactファイルの管理からAPIドキュメント、ConsumerとProviderのNetwork GraphなどなどCDCテストの運用の手助けが手厚く受けられます。
管理下のmicroserviceすべてにCDCテスト + Pactの導入は腰が重いのでクリティカルなmicroservice間の連携の一部から導入を開始したり、外部に公開するAPIはProviderとしてPactファイルのテストを導入してConsumer側にAPI仕様をクリアにすることもできますしCDCテスト+Pactの知見を活かせるところを今後は探っていきます。
ソースを公開しています
関連エントリ
golang - kotlinのmicroservice構成のConsumer-Driven Contract testingをpactをつかって作ってみた - 平日インプット週末アウトプットぶろぐ