51

我目前正在运行一个 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}"
4

6 回答 6

110

您可以使用这些 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-apiservice-testservice-test

docker-compose -f docker-compose.yml up \
    --abort-on-container-exit \
    --exit-code-from service-test
于 2018-03-26T07:18:48.283 回答
36

Compose 添加了一个--exit-code-from {container}标志docker-compose up,使这更容易。

docker-compose up --exit-code-from test-runner

有关更多详细信息,请参阅Michael Spector 的答案


原始答案

与此rspec q/a类似,您需要将测试作为独立任务运行,将退出状态报告回您的 CI。

您可以将 test-runner 分离到它自己的 yaml 中,或者将 test-runner 修改为默认为无操作命令/入口点。

分离测试运行器

单独指定test-runner配置(您可能需要升级到版本 2networks,而不是links用于跨多个撰写文件工作)。

docker-compose up -d
docker-compose -f test-runner.yml run test-runner
rc=$?
docker-compose down
exit $rc

没有操作测试运行器

默认test-runner为无操作入口点/命令,然后手动运行测试命令

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 也可能会为您清理容器。

于 2016-12-01T11:12:53.100 回答
24

我发现最优雅的解决方案是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 $?
于 2017-07-28T02:44:28.060 回答
2

我已经尝试过此讨论中提供的解决方案,但问题仍然存在

案例 1:docker-compose up -d

您可以使用docker-compose up -d, test it by a test-runnerthen terminate bydocker-compose down但使用时的问题docker-compose up -d您将不再看到标准输出的日志

案例 2:docker-compose up --exit-code-from 服务

如果您使用这意味着,您可以查看 docker 日志,但该服务在成功时不会发送退出命令。然后您需要在发送停止它们之前捕获您的容器已完成测试。--exit-code-from <service>--abort-on-container-exitdocker-compose down

在终止日志之前查看日志的解决方案之一是使用--tail=1000 -f

docker-compose up -d
docker-compose logs --tail=1000 -f test-runner
docker-compose down
exit $rc

还有一个解决方案使用nohup,但您需要等到过程完全完成然后打开输出日志文件,所以上面应该更容易

于 2019-03-27T09:10:15.007 回答
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}"

更新配置后,simpledocker-compose up test-runner将触发相关服务的启动。

于 2018-09-11T15:27:15.247 回答
-2

ensure您可以使用Concourse 中的任务步骤执行清理任务。https://concourse-ci.org/ensure-step.html

在您的情况下,您可以在量角器测试之后添加一个ensure块,并运行一个任务来拆除docker-compose之前的内容。您还可以使用on-success步骤https://concourse-ci.org/on-success-step.html进行拆卸,docker-compose如果您的测试失败,'d 容器将被保留。

于 2016-12-05T16:32:49.190 回答