簡潔に
wait-for-it
で特定の Port の Listen を待って、任意のコマンドを実行することができます
$ ./wait-for-it.sh -s -t 60 db:3306 -- php artisan test --testdox
対象読者
- テスト実行時に DB などの Port Listen を待つ必要がある
- 特に、 CI 環境で DB をコンテナで立ち上げるときなど
- 今は
sleep
でなんとなく待って凌いでいるけど、本質的な解決じゃないのでなんとかしたいと思っている
以上の質問に全部 YES と回答した方
wait-for-it とは
- 特定のホストと TCP ポートが利用可能になるまで待つ機能をもった bash スクリプトです
- 利用可能になるまで待ったあと、任意のコマンドを実行できます
- 待つ時間の上限を指定できます (
-t | --timeout
オプション )
Installation
単純な bash スクリプトなので、 git clone
するか wget
等で raw ファイルを DL するだけで使えます
$ wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh
$ bash ./wait-for-it.sh
Error: you need to provide a host and port to test.
Usage:
wait-for-it.sh host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
$ sudo apt install wait-for-it
$ wait-for-it
Error: you need to provide a host and port to test.
Usage:
wait-for-it host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
- なぜかComposer package もあります
- しかし fork されたもので最近は更新されてないので、公式を vcs で取り込むほうが良いと思います
- Composer でインストールした場合は、デフォルトで
vendor/bin/wait-for-it.sh
にインストールされます
"require-dev": {
"vishnubob/wait-for-it": "dev-master"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/vishnubob/wait-for-it"
}
],
使い方
- 簡単なので README を見てもらうのが早いと思います
- もっぱら CI 環境で DB コンテナの起動待ちなどに使っています
- 以下の用に、複数の Port を待ちたい場合は wait-for-it をチェインすればいいです
$ ./vendor/bin/wait-for-it.sh -s -t 60 db:3306 -- ./vendor/bin/wait-for-it.sh -s -t 60 selenium:4444 -- php artisan dusk