我目前正在运行一个docker-compose堆栈,用于基础集成测试,包括量角器测试运行器,服务于网页的nodejs服务器和服务于java后端的wildfly服务器。
堆栈是从我的构建服务器(concourse ci)中的dind(docker in 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}"
答案 0 :(得分:39)
您可以使用这些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
以下命令可确保在elasticsearch
完成后service-api
和service-test
关闭,并从service-test
容器返回退出代码:
docker-compose -f docker-compose.yml up \
--abort-on-container-exit \
--exit-code-from service-test
答案 1 :(得分:18)
我发现最优雅的解决方案是在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 $?
答案 2 :(得分:15)
与此rspec q/a类似,您需要将测试作为独立任务运行,将退出状态报告回CI。
您可以将test-runner分隔为它自己的yaml,或者将test-runner修改为默认为no op命令/入口点。
单独指定test-runner
配置(您可能需要升级到version 2 networks
,而不是使用links
来处理多个撰写文件)。
docker-compose up -d
docker-compose -f test-runner.yml run test-runner
rc=$?
docker-compose down
exit $rc
将test-runner
默认为no op entrypoint /命令,然后手动运行测试命令
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
捕获,并在测试运行器CI任务完成后运行docker-compose down
。您的CI也可以为您清理容器。
答案 3 :(得分:0)
为避免使用单独的配置文件,您可以更新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
将触发相关服务的启动。
答案 4 :(得分:0)
我已经尝试了本次讨论中提供的解决方案,但仍然存在问题
案例1:docker-compose up -d
您可以使用docker-compose up -d
,通过test-runner
进行测试,然后以docker-compose down
终止,但是使用docker-compose up -d
时出现的问题是您赢得了 不再看到标准输出的日志 。
情况2:docker组成-从服务中退出代码
如果您使用--exit-code-from <service>
表示--abort-on-container-exit
,则可以view the docker logs,但是服务成功后将不会发送退出命令。然后 您需要捕获 ,您的容器已完成测试,然后发送docker-compose down
将其停止。
其中一种解决方案to see the logs在终止之前正在使用
--tail=1000 -f
docker-compose up -d
docker-compose logs --tail=1000 -f test-runner
docker-compose down
exit $rc
还有一种使用nohup
的解决方案,但是您需要等到过程完全完成后再打开输出日志文件,因此上述操作应该更容易
答案 5 :(得分:-1)
您可以在Concourse的任务步骤中使用ensure
执行清理任务。 https://concourse-ci.org/ensure-step.html
在您的情况下,您可以在量角器测试后添加ensure
块,然后运行任务以拆除docker-compose
之前的内容。您还可以使用on-success
步骤https://concourse-ci.org/on-success-step.html进行拆解,如果您的测试失败,则会保留docker-compose
个容器。