我目前正在运行一个docker-compose堆栈,用于基本集成测试,包括量角器测试运行器,服务于网页的nodejs服务器和服务于java后端的wildfly服务器。
堆栈是从我的构建服务器(大厅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}"
与此rspec q/a类似,您需要将测试作为独立任务运行,将退出状态报告回CI。
您可以将测试运行器分成它自己的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 /命令,然后手动运行test命令
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也可以为您清理容器。
您可以使用这些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
我发现最优雅的解决方案是在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 $?
为了避免使用单独的配置文件,您可以更新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
将触发相关服务的启动。
我已经尝试过本次讨论中提供的解决方案,但问题仍然存在
案例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-service
你可以使用view the docker logs,如果你使用--exit-code-from <service>
暗示--abort-on-container-exit
,但服务在成功时不会发送exit命令。然后你需要抓住你的容器完成测试后再发送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
的解决方案,但你需要等到进程完全完成然后打开输出日志文件,所以上面应该更容易
您可以在Concourse的任务步骤中使用ensure
执行清理任务。 https://concourse-ci.org/ensure-step.html
在你的情况下,你可以在量角器测试后添加一个ensure
块,并运行一个任务来拆除之前的docker-compose
。您也可以使用on-success
步https://concourse-ci.org/on-success-step.html进行拆解,如果您的测试失败,将保留docker-compose
'd容器。