igo*_*eao 2 continuous-integration rspec ruby-on-rails jenkins docker
我有一个用 Rails 编写的应用程序。为了测试它,我构建了一个 docker 镜像。一切正常。
然而,当我配置 Jenkins 来运行这些测试时,问题就出现了。这是我在构建步骤中所做的事情:
docker-compose up rspec
Run Code Online (Sandbox Code Playgroud)
其中 rspec 是在 docker-compose.yml 中定义的服务,包含以下命令:
command: "rspec spec/"
Run Code Online (Sandbox Code Playgroud)
当 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
Run Code Online (Sandbox Code Playgroud)
36mcomposes_rspec_1返回1,构建仍然成功。
如果我使用 docker 通过容器 ID 检查容器,ps -a我会得到“2 分钟前已退出 (1)”
你们知道发生了什么事吗?
当容器失败时,是否有一种简单的方法可以使构建失败?
Docker compose 添加了从运行测试的特定容器/服务获取退出代码的功能:
docker-compose up \
--abort-on-container-exit \
--exit-code-from test-runner
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
主应用程序容器启动后,运行
docker-compose -f docker-compose-test.yml run tests
Run Code Online (Sandbox Code Playgroud)