我有一个用 Rails 编写的应用程序。为了测试它,我构建了一个 docker 镜像。一切正常。
但是,当我配置 Jenkins 来运行这些测试时,问题就出现了。这是我在构建步骤中所做的事情:
docker-compose up rspec
其中 rspec 是在 docker-compose.yml 中定义的服务,包含以下命令:
command: "rspec spec/"
当 rspec 返回错误时,构建仍然成功。 这是输出的示例:
...
21:42:24 [36mrspec_1 |[0m should save second profile
21:42:24 [36mrspec_1 |[0m
21:42:24 [36mrspec_1 |[0m Failures:
21:42:24 [36mrspec_1 |[0m
21:42:24 [36mrspec_1 |[0m 1) New profile Should persist new_profile_pricture
21:42:24 [36mrspec_1 |[0m Failure/Error: jump_to_four_phase_with(new_profile_picture)
21:42:24 [36mrspec_1 |[0m RuntimeError:
21:42:24 [36mrspec_1 |[0m Timeout for '#new_profile' (1) appearance reached!
...
21:42:25 [36mcomposes_rspec_1 exited with code 1
21:42:25 [0m[Profiler] $ /bin/sh -xe /tmp/hudson4606189750126491465.sh
21:42:25 Finished: SUCCESS
36mcomposes_rspec_1
返回 1 并且构建仍然成功。
如果我使用 docker ps -a
通过容器 ID 检查容器,我会得到“Exited (1) 2 分钟前”
你们知道这是怎么回事吗?
当容器失败时,是否有一种简单的方法可以使构建失败?
最佳答案
Docker compose 添加了从运行测试的特定容器/服务获取退出代码的功能:
docker-compose up \
--abort-on-container-exit \
--exit-code-from test-runner
原始答案
Jenkins使用进程的退出状态来判断成功或失败。
docker-compose up
旨在编排许多容器。当您处理多个服务/容器时,关于成功和失败的构成存在一些灰色区域。所有这些docker-compose
退出时的报告是docker-compose
命令成功完成,但这并不是说它运行的所有容器都正常。
docker-compose run <service> <command>
将为服务运行单个命令并返回该命令的退出状态。
如果您依赖多个服务/容器进行测试,那么 docker-compose up
只提供所需的服务。然后运行docker-compose run rubyservice rspec
然后进行测试。
组合分离
如果您想让测试与应用程序容器分开,请创建第二个 docker-compose-test.yml
文件包含仅用于测试的服务定义。
version: "2.1"
tests:
build:
context: .
dockerfile: Dockerfile.tests
cmd: rspec
启动主应用程序容器后,运行
docker-compose -f docker-compose-test.yml run tests
关于ruby-on-rails - 使用 Docker 和 Jenkins 运行测试 - 测试结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37450011/