🔖
【MakeFile】【タスクランナー】別アプリケーションの応答を待って何か処理を実行したい場合
この記事の役立つ場面
- 複数のアプリケーションを跨いで一連の処理を実行したい
- Makefileでタスクランナーを作成している
- dockerなどで複数のコンテナを立ち上げている
この作業が必要になった経緯
筆者の関わっているあるプロジェクトで、複数のアプリケーションを跨いでアプリケーションの立ち上げ時に何か処理を実行したいが、Aのアプリケーションが立ち上がらないとBのアプリケーションの初期化ができない状況になり、この方法を実装したので、備忘録を兼ねて。
筆者の環境
- Docker + Hasura + NestJSでAPIサーバーを構築
- HasuraとNestJSをそれぞれのdockerコンテナで立ち上げ
- NestJsでhasuraに連結するリモートスキーマを構築
How to
上記の環境で開発していましたが、Hasuraのコンテナを立ち上げる際に毎回リモートスキーマとメタデータを読み込むのですが、NestJSアプリケーションの実行が追いつかずリモートスキーマが読み込めない状況になっていました。
なので、タスクランナー上でNestJsアプリケーションの立ち上げを待ってからスキーマを再度読み込む仕組みを作りました。
実際の記述
記述は以下の様な感じです。
hasura-load-nestjsのタスクで特定のサーバーでNestJsのアプリケーションのエンドポイントの応答のステータスコードを待ち指定のステータスコードが返却されたら後続処理を実行するというシンプルなもの
Makefile
.PHONY: dev
dev:
docker-compose down
docker-compose up &
make hasura-load-nestjs &
.PHONY: hasura-load-nestjs
hasura-load-nestjs:
# 応答があるまで繰り返す
@while [ "$$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:3000/graphql")" != "200" ]; do \
echo "アプリケーションの応答を待機中..."; \
sleep 5; \
done
# 後続処理
make metadata-and-remote-schema-reload
@echo "スキーマを読み込みました。"
# メタデータ及びリモートスキーマを再度読み込む
.PHONY: metadata-and-remote-schema-reload
metadata-and-remote-schema-reload:
cd hasura && npm run apply:metadata_and_remote_schema:reload
最後に
パッケージを複数組み合わせて使用することは、開発速度の面で有効な手ですが、組み合わせた時のカスタマイズはどうしても必要になりますね
Discussion