🔖

【MakeFile】【タスクランナー】別アプリケーションの応答を待って何か処理を実行したい場合

2023/01/11に公開

この記事の役立つ場面

  • 複数のアプリケーションを跨いで一連の処理を実行したい
  • 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