現在、分度器テストランナー、Webページを提供するnodejsサーバー、およびJavaバックエンドを提供するwildflyサーバー)との基本的な統合テストのためにdocker-composeスタックを実行しています。
スタックは、ビルドサーバー(コンコースci)のdind(dockerのドッカー)コンテナから実行されます。
しかし、分度器のテストを終了してもコンテナは終了しないようです。
だから、wildflyのコンテナとnodejsはまだ実行されているので、ビルドタスクは決して終了しません...
テストが終了したときに成功または失敗で構成を終了させるにはどうすればよいですか?
# Test runner
test-runner:
image: "${RUNNER_IMG}"
privileged: true
links:
- client
- server
volumes:
- /Users/me/frontend_test/client-devops:/protractor/project
- /dev/shm:/dev/shm
entrypoint:
- /entrypoint.sh
- --baseUrl=http://client:9000/dist/
- /protractor/conf-dev.js
- --suite=remember
# Client deployment
client:
image: "${CLIENT_IMG}"
links:
- server
# Server deployment
server:
image: "${SERVER_IMG}"
この rspec q/a と同様に、終了ステータスをCIに報告するスタンドアロンタスクとしてテストを実行する必要があります。
テストランナーを独自のyamlに分離するか、テストランナーをデフォルトでno opコマンド/エントリポイントに変更することができます。
test-runner
configを個別に設定します(複数の構成ファイル間で作業するには、networks
を使用する代わりに バージョン2 links
にアップグレードする必要があります)。
docker-compose up -d
docker-compose -f test-runner.yml run test-runner
rc=$?
docker-compose down
exit $rc
デフォルトはtest-runner
no opエントリポイント/コマンドに移動してから、テストコマンドを手動で実行します
services:
test-runner:
image: "${RUNNER_IMG}"
command: 'true'
それから
docker-compose up -d
docker-compose run test-runner /launch-tests.sh
rc=$?
docker-compose down
exit $rc
CIに「タスク後」の概念がある場合、rc
キャプチャをスキップして、単にdocker-compose down
テストランナーCIタスクが完了した後。 CIがコンテナをクリーンアップすることも可能です。
これらのdocker-composeパラメーターを使用して、それを実現できます。
--abort-on-container-exit
コンテナが停止した場合、すべてのコンテナを停止します。
--exit-code-from
選択したサービスコンテナの終了コードを返します。
たとえば、このdocker-compose.yml
:
version: '2.3'
services:
elasticsearch:
...
service-api:
...
service-test:
...
depends_on:
- elasticsearch
- service-api
次のコマンドは、service-api
の終了後にelasticsearch
およびservice-test
が確実に停止し、service-test
コンテナから終了コードを返すようにします。
docker-compose -f docker-compose.yml up \
--abort-on-container-exit \
--exit-code-from service-test
最もエレガントであることがわかった解決策は、depends_on
あなたのdocker-compose.yml
ファイル。
services:
dynamodb:
...
test_runner:
...
depends_on:
- dynamodb
これで、docker-compose run --rm test_runner
依存関係を設定し、テストを実行し、すべてを破棄し、リターンコードを伝播します。
docker-compose run test_runner false
Starting test_dynamodb_1 ... done
echo $?
1
docker-compose run test_runner true
Starting test_dynamodb_1 ... done
echo $?
私はこの議論で提供された解決策を試しましたが、まだ問題があります
ケース-1:docker-compose up -d
docker-compose up -d
を使用し、test-runner
でテストしてからdocker-compose down
で終了できますが、docker-compose up -d
を使用した場合の問題は標準出力のログはもう表示されません。
ケース-2:docker-compose up --exit-code-from a service
ドッカーのログを表示する--exit-code-from <service>
を意味する--abort-on-container-exit
を使用しているが、サービスが終了コマンドを送信しない場合成功します。その後、キャッチする必要がありますdocker-compose down
を送信する前にコンテナがテストされていることを停止します。
解決策の1つ ログを表示する ログを終了する前に
--tail=1000 -f
を使用する
docker-compose up -d
docker-compose logs --tail=1000 -f test-runner
docker-compose down
exit $rc
Nohup
を使用したソリューションもありますが、プロセスが完全に完了するまで待ってから出力ログファイルを開く必要があるため、上記の方が簡単です。
個別の設定ファイルを避けるため、docker-compose設定を更新して、 depends_on オプションでサービス間の依存関係を導入できます。バージョン2以降のバージョンで利用可能です。結果として、test-runner
は、クライアントの実行を開始します。
テスト中のサービスから実際のWebサーバーが開始されるまでしばらく待つ必要がある場合は、 wait-for-it.sh スクリプトを使用して、サーバーが使用可能になるまで待つことができます。 。
# Test runner
test-runner:
image: "${RUNNER_IMG}"
privileged: true
links:
- client
- server
volumes:
- /Users/me/frontend_test/client-devops:/protractor/project
- /dev/shm:/dev/shm
depends_on:
- client
entrypoint:
- wait-for-it.sh
- client
- -t
- '180'
- --
- /entrypoint.sh
- --baseUrl=http://client:9000/dist/
- /protractor/conf-dev.js
- --suite=remember
# Client deployment
client:
image: "${CLIENT_IMG}"
depends_on:
- server
links:
- server
# Server deployment
server:
image: "${SERVER_IMG}"
設定を更新した後、簡単なdocker-compose up test-runner
は、関連するサービスの開始をトリガーします。